From 63288601e7e359cd4899f5ec6b040ff4e4f234c4 Mon Sep 17 00:00:00 2001 From: marsman7 Date: Sat, 20 Apr 2024 16:13:32 +0200 Subject: [PATCH 001/142] add crowpanel hmi 5inch 800x480 --- user_setups/esp32s3/crowpanel-hmi.ini | 82 +++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 5 deletions(-) diff --git a/user_setups/esp32s3/crowpanel-hmi.ini b/user_setups/esp32s3/crowpanel-hmi.ini index 86d5fc17..5a6be7c0 100644 --- a/user_setups/esp32s3/crowpanel-hmi.ini +++ b/user_setups/esp32s3/crowpanel-hmi.ini @@ -1,5 +1,5 @@ ;***************************************************; -; Elecrow ESP32-S3 TFT 7.0" ; +; Elecrow ESP32-S3 HMI TFT 7.0" and 5.0" ; ; - Custom esp32-s3 board ; ; - gt911 touch controller ; ;***************************************************; @@ -81,11 +81,9 @@ extends = elecrow-esp32-s3-tft, flash_4mb build_flags = -D HASP_MODEL="Elecrow WZ8048C070" - -D HASP_LOG_LEVEL=LOG_LEVEL_VERBOSE + -D HASP_LOG_LEVEL=LOG_LEVEL_WARNING -D HASP_USE_CAPTIVE_PORTAL=0 ; -D HASP_USE_CUSTOM=1 - ; -D MQTT_TOPIC_CUSTOM="SmartPICoop" - ${elecrow-esp32-s3-tft.build_flags} ${elecrow-tft-common-pins.build_flags} @@ -120,4 +118,78 @@ build_flags = -D I2C_TOUCH_FREQUENCY=400000 lib_deps = - ${elecrow-esp32-s3-tft.lib_deps} \ No newline at end of file + ${elecrow-esp32-s3-tft.lib_deps} + + +[env:elecrow-s3-8048c050_4MB] +; https://forum.elecrow.com/index.php?p=/discussion/585/esp32-hmi-demo-code-updated-compatible-with-new-version-of-esp32-package/ +extends = elecrow-esp32-s3-tft, flash_4mb + +build_flags = + -D HASP_MODEL="Elecrow WZ8048C050" + -D HASP_LOG_LEVEL=LOG_LEVEL_WARNING + -D HASP_USE_CAPTIVE_PORTAL=0 + ; -D HASP_USE_CUSTOM=1 + + ${elecrow-esp32-s3-tft.build_flags} + + ; Panel Settings + -D TFT_WIDTH=800 + -D TFT_HEIGHT=480 + + ; Bus Settings - LovyanGFX Library + -D LGFX_USE_V1=1 + -D RGB_DRIVER=1 + + -D TFT_DE=40 + -D TFT_VSYNC=41 + -D TFT_HSYNC=39 + -D TFT_PCLK=0 + + -D TFT_R0=45 + -D TFT_R1=48 + -D TFT_R2=47 + -D TFT_R3=21 + -D TFT_R4=14 + + -D TFT_G0=5 + -D TFT_G1=6 + -D TFT_G2=7 + -D TFT_G3=15 + -D TFT_G4=16 + -D TFT_G5=4 + + -D TFT_B0=8 + -D TFT_B1=3 + -D TFT_B2=46 + -D TFT_B3=9 + -D TFT_B4=1 + + -D TFT_HSYNC_POLARITY=0 + -D TFT_HSYNC_FRONT_PORCH=8 + -D TFT_HSYNC_PULSE_WIDTH=4 + -D TFT_HSYNC_BACK_PORCH=43 + -D TFT_VSYNC_POLARITY=0 + -D TFT_VSYNC_FRONT_PORCH=8 + -D TFT_VSYNC_PULSE_WIDTH=4 + -D TFT_VSYNC_BACK_PORCH=12 + -D TFT_PCLK_ACTIVE_NEG=1 + -D TFT_PREFER_SPEED=16000000 + -D TFT_AUTO_FLUSH=1 + + -D TFT_PCLK_ACTIVE_NEG=1 + + ; Touch Settings + -D HASP_USE_LGFX_TOUCH=1 + -D TOUCH_WIDTH=800 + -D TOUCH_HEIGHT=480 + -D TOUCH_DRIVER=0x911 + -D TOUCH_SCL=20 + -D TOUCH_SDA=19 + -D TOUCH_IRQ=-1 + -D TOUCH_RST=-1 + -D I2C_TOUCH_ADDRESS=0x5D + -D I2C_TOUCH_FREQUENCY=400000 + +lib_deps = + ${elecrow-esp32-s3-tft.lib_deps} \ No newline at end of file From 8b6cd9c0582ac3657b903cb5b526ab44cdae8bca Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 20 Apr 2024 22:30:33 +0200 Subject: [PATCH 002/142] Allow larger btnmap --- src/hasp/hasp_attribute.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index a3fd9f29..b8b42eca 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -98,7 +98,7 @@ const char** my_map_create(const char* payload) { // Reserve memory for JsonDocument // StaticJsonDocument<1024> map_doc; - size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256; + size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 1024; DynamicJsonDocument map_doc(maxsize); DeserializationError jsonError = deserializeJson(map_doc, payload); From 92bfd8a5cc4e8bb01cfcf5b761204895e75b5d60 Mon Sep 17 00:00:00 2001 From: yetanothercarbot <55005345+yetanothercarbot@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:48:34 +1000 Subject: [PATCH 003/142] Initial support (bootloops) --- src/drv/tft/M5Stack.hpp | 2 +- src/drv/tft/tft_driver.h | 1 + src/drv/tft/tft_driver_lovyangfx.cpp | 40 ++++++++++++++++++++- user_setups/esp32/ttgo-t-watch.ini | 54 ++++++++++++++++++++++++++++ user_setups/esp32c3/2424S012.ini | 36 +++++++++++++++++++ 5 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 user_setups/esp32/ttgo-t-watch.ini create mode 100644 user_setups/esp32c3/2424S012.ini diff --git a/src/drv/tft/M5Stack.hpp b/src/drv/tft/M5Stack.hpp index 8822d724..0bdc9ec0 100644 --- a/src/drv/tft/M5Stack.hpp +++ b/src/drv/tft/M5Stack.hpp @@ -17,7 +17,7 @@ Contributors: /----------------------------------------------------------------------------*/ #pragma once -#if defined(ARDUINO) && defined(LGFX_USE_V1) +#if defined(ARDUINO) && defined(LGFX_USE_V1) && !defined(ESP32C3) #include "Arduino.h" #include "LovyanGFX.hpp" diff --git a/src/drv/tft/tft_driver.h b/src/drv/tft/tft_driver.h index c8bed996..b08cee35 100644 --- a/src/drv/tft/tft_driver.h +++ b/src/drv/tft/tft_driver.h @@ -32,6 +32,7 @@ enum lv_hasp_obj_type_t { TFT_PANEL_RM68140, TFT_PANEL_RGB, TFT_PANEL_EPD, + TFT_PANEL_GC9A01, TFT_PANEL_LAST, }; diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index 9d6d9a6a..62b5aac8 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -94,8 +94,12 @@ static lgfx::Bus_Parallel8* init_parallel_8_bus(Preferences* prefs, int8_t data_ cfg.pin_rd = prefs->getInt("rd", TFT_RD); cfg.pin_wr = prefs->getInt("wr", TFT_WR); cfg.pin_rs = prefs->getInt("rs", TFT_DC); +#ifndef ESP32C3 cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); -#if !defined(CONFIG_IDF_TARGET_ESP32S3) +#endif + + +#if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(ESP32C3) uint8_t port = prefs->getUInt("i2s_port", 0); switch(port) { #if SOC_I2S_NUM > 1 @@ -328,6 +332,11 @@ lgfx::Panel_Device* LovyanGfx::_init_panel(lgfx::IBus* bus) LOG_VERBOSE(TAG_TFT, F("Panel_RGB")); break; } + case TFT_PANEL_GC9A01: { + panel = new lgfx::Panel_GC9A01(); + LOG_VERBOSE(TAG_TFT, F("Panel_GC9A01")); + break; + } default: { // Needs to be in curly braces LOG_FATAL(TAG_TFT, F(D_SERVICE_START_FAILED ": %s line %d"), __FILE__, __LINE__); } @@ -455,6 +464,31 @@ lgfx::ITouch* _init_touch(Preferences* preferences) } #endif +#if TOUCH_DRIVER == 0x816 + { + auto touch = new lgfx::Touch_CST816S(); + auto cfg = touch->config(); + + cfg.x_min = 0; + cfg.x_max = TFT_WIDTH - 1; + cfg.y_min = 0; + cfg.y_max = TFT_HEIGHT - 1; + cfg.pin_int = TOUCH_IRQ; + cfg.bus_shared = true; + cfg.offset_rotation = TOUCH_OFFSET_ROTATION; + + // I2C接続の場合 + cfg.i2c_port = I2C_TOUCH_PORT; + cfg.i2c_addr = I2C_TOUCH_ADDRESS; + cfg.pin_sda = TOUCH_SDA; + cfg.pin_scl = TOUCH_SCL; + cfg.freq = I2C_TOUCH_FREQUENCY; + + touch->config(cfg); + return touch; + } +#endif + #endif // HASP_USE_LGFX_TOUCH return nullptr; @@ -1261,6 +1295,8 @@ const char* LovyanGfx::get_tft_model() return "R61529"; #elif defined(RM68140_DRIVER) return "RM68140"; +#elif defined(GC9A01_DRIVER) + return "GC9A01"; #else return "Other"; #endif @@ -1302,6 +1338,8 @@ uint32_t LovyanGfx::get_tft_driver() return TFT_PANEL_EPD; #elif defined(RGB_DRIVER) return TFT_PANEL_RGB; +#elif defined(GC9A01_DRIVER) + return TFT_PANEL_GC9A01; #else return TFT_PANEL_UNKNOWN; #endif diff --git a/user_setups/esp32/ttgo-t-watch.ini b/user_setups/esp32/ttgo-t-watch.ini new file mode 100644 index 00000000..91b114ba --- /dev/null +++ b/user_setups/esp32/ttgo-t-watch.ini @@ -0,0 +1,54 @@ +[ttgo-t-watch] + +extends = arduino_esp32_v2 +board = esp32dev + +build_flags = + ${arduino_esp32_v2.build_flags} + ${esp32.ps_ram} + +;region -- TFT_eSPI build options ------------------------ + -D LGFX_USE_V1=1 + -D HASP_USE_LGFX_TOUCH=1 + -D ST7789_DRIVER=1 + -D TFT_HEIGHT=240 + -D TFT_WIDTH=240 + -D TFT_DC=27 + -D TFT_CS=5 + -D TFT_MOSI=19 + -D TFT_RST=-1 + -D TFT_SCLK=18 + -D TFT_BCKL=12 + -D SPI_FREQUENCY=40000000 + -D I2C_TOUCH_ADDRESS=0x38 + -D I2C_TOUCH_FREQUENCY=400000 + -D TOUCH_DRIVER=0x6336 + -D I2C_TOUCH_PORT=1 + -D TOUCH_IRQ=38 + -D TOUCH_RST=-1 + -D TOUCH_SDA=23 + -D TOUCH_SCL=32 +;endregion + +lib_deps = + ${arduino_esp32_v2.lib_deps} + ${lovyangfx.lib_deps} + ${ft6336.lib_deps} + +[env:ttgo-t-watch-2019] +extends = ttgo-t-watch, flash_16mb + +build_flags = + ${ttgo-t-watch.build_flags} + -D HASP_MODEL="TTgo T-Watch 2019" + -D INVERT_COLORS=1 + +[env:ttgo-t-watch-2020] +extends = ttgo-t-watch, flash_16mb + +build_flags = + ${ttgo-t-watch.build_flags} + -D HASP_MODEL="TTgo T-Watch 2020" + -D TFT_ROTATION=0 + ;-D TFT_ROTATION=2 + -D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy, 2=invert x, 4=inverty \ No newline at end of file diff --git a/user_setups/esp32c3/2424S012.ini b/user_setups/esp32c3/2424S012.ini new file mode 100644 index 00000000..d05ac04c --- /dev/null +++ b/user_setups/esp32c3/2424S012.ini @@ -0,0 +1,36 @@ +[env:2424S012] +extends = arduino_esp32c3_v2, flash_4mb +; Close enough +board = seeed_xiao_esp32c3 + +build_flags = + -D HASP_MODEL="ESP32-2424S012" + ${arduino_esp32c3_v2.build_flags} + ${esp32c3.no_ps_ram} + +; Display configuration + -D ESP32C3=1 + -D LGFX_USE_V1=1 + -D HASP_USE_LGFX_TOUCH=1 + ;CST816S driver + -D TOUCH_DRIVER=0x816 + -D GC9A01_DRIVER=1 + -D TFT_WIDTH=240 + -D TFT_HEIGHT=240 + -D TOUCH_SDA=4 + -D TOUCH_SCL=5 + -D TOUCH_IRQ=0 + -D TOUCH_RST=1 + -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_PORT=0 + -D I2C_TOUCH_ADDRESS=0x15 + -D TFT_SCLK=6 + -D TFT_MOSI=7 + -D TFT_DC=2 + -D TFT_CS=10 + -D TFT_BCKL=3 + +lib_deps = + ${arduino_esp32s3_v2.lib_deps} + ${lovyangfx.lib_deps} +; ${tft_espi.lib_deps} \ No newline at end of file From 462491a5b28e1c5e7e8a827d414effdc4916bab8 Mon Sep 17 00:00:00 2001 From: yetanothercarbot <55005345+yetanothercarbot@users.noreply.github.com> Date: Fri, 26 Apr 2024 00:11:54 +1000 Subject: [PATCH 004/142] Use SDK-provided define instead of own --- src/drv/tft/M5Stack.hpp | 2 +- src/drv/tft/tft_driver_lovyangfx.cpp | 4 ++-- user_setups/esp32c3/2424S012.ini | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/drv/tft/M5Stack.hpp b/src/drv/tft/M5Stack.hpp index 0bdc9ec0..83a8ccd9 100644 --- a/src/drv/tft/M5Stack.hpp +++ b/src/drv/tft/M5Stack.hpp @@ -17,7 +17,7 @@ Contributors: /----------------------------------------------------------------------------*/ #pragma once -#if defined(ARDUINO) && defined(LGFX_USE_V1) && !defined(ESP32C3) +#if defined(ARDUINO) && defined(LGFX_USE_V1) && !defined(CONFIG_IDF_TARGET_ESP32C3) #include "Arduino.h" #include "LovyanGFX.hpp" diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index 62b5aac8..bc3854f9 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -94,12 +94,12 @@ static lgfx::Bus_Parallel8* init_parallel_8_bus(Preferences* prefs, int8_t data_ cfg.pin_rd = prefs->getInt("rd", TFT_RD); cfg.pin_wr = prefs->getInt("wr", TFT_WR); cfg.pin_rs = prefs->getInt("rs", TFT_DC); -#ifndef ESP32C3 +#ifndef CONFIG_IDF_TARGET_ESP32C3 cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); #endif -#if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(ESP32C3) +#if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C3) uint8_t port = prefs->getUInt("i2s_port", 0); switch(port) { #if SOC_I2S_NUM > 1 diff --git a/user_setups/esp32c3/2424S012.ini b/user_setups/esp32c3/2424S012.ini index d05ac04c..c3179422 100644 --- a/user_setups/esp32c3/2424S012.ini +++ b/user_setups/esp32c3/2424S012.ini @@ -1,6 +1,6 @@ [env:2424S012] extends = arduino_esp32c3_v2, flash_4mb -; Close enough +; Close enough, sets it up to use USB-CDC rather than uart board = seeed_xiao_esp32c3 build_flags = @@ -9,7 +9,6 @@ build_flags = ${esp32c3.no_ps_ram} ; Display configuration - -D ESP32C3=1 -D LGFX_USE_V1=1 -D HASP_USE_LGFX_TOUCH=1 ;CST816S driver @@ -32,5 +31,4 @@ build_flags = lib_deps = ${arduino_esp32s3_v2.lib_deps} - ${lovyangfx.lib_deps} -; ${tft_espi.lib_deps} \ No newline at end of file + ${lovyangfx.lib_deps} \ No newline at end of file From 78ac4d95b4a3fc8de642351db2c43b6b1ea17ab8 Mon Sep 17 00:00:00 2001 From: yetanothercarbot <55005345+yetanothercarbot@users.noreply.github.com> Date: Fri, 26 Apr 2024 01:02:23 +1000 Subject: [PATCH 005/142] Boot without serial connected --- user_setups/esp32c3/2424S012.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/user_setups/esp32c3/2424S012.ini b/user_setups/esp32c3/2424S012.ini index c3179422..7259a624 100644 --- a/user_setups/esp32c3/2424S012.ini +++ b/user_setups/esp32c3/2424S012.ini @@ -28,6 +28,7 @@ build_flags = -D TFT_DC=2 -D TFT_CS=10 -D TFT_BCKL=3 + -D SERIAL_SPEED=-1 ;otherwise requires serial term to boot first time lib_deps = ${arduino_esp32s3_v2.lib_deps} From 660a8bb512d50d218334f8efe72636381e0b56ae Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 13 May 2024 13:44:00 +0200 Subject: [PATCH 006/142] Update ace.js to 1.33.2 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 4143e51c..a644194a 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 5e9dc496..2578aad1 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.8")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 180cc84ea2abbb9686775b277d6d57be5929436e Mon Sep 17 00:00:00 2001 From: FreeBear Date: Fri, 17 May 2024 00:09:34 +0100 Subject: [PATCH 007/142] Minor spelling mistake corrected --- src/hasp_filesystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hasp_filesystem.cpp b/src/hasp_filesystem.cpp index ac39a344..1f9f4953 100644 --- a/src/hasp_filesystem.cpp +++ b/src/hasp_filesystem.cpp @@ -180,7 +180,7 @@ void filesystemList() #else if(!HASP_FS.begin(true)) { // default vfs path: /littlefs #endif - LOG_ERROR(TAG_FILE, F("Flash file system not mouted.")); + LOG_ERROR(TAG_FILE, F("Flash file system not mounted.")); } else { LOG_VERBOSE(TAG_FILE, F("Listing files on the internal flash:")); From 182c8c670b640502f5efbfe973ed4affbd41d65c Mon Sep 17 00:00:00 2001 From: K Date: Sat, 18 May 2024 19:32:04 -0400 Subject: [PATCH 008/142] Add support for Guition JC4827W543 --- platformio.ini | 2 +- src/drv/tft/tft_driver_arduinogfx.cpp | 8 +++ src/hasp_gui.cpp | 2 +- user_setups/esp32s3/guition-jc4827w543.ini | 60 ++++++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 user_setups/esp32s3/guition-jc4827w543.ini diff --git a/platformio.ini b/platformio.ini index 444439fc..a003dc93 100644 --- a/platformio.ini +++ b/platformio.ini @@ -112,7 +112,7 @@ lib_deps = [arduinogfx] lib_deps = - moononournation/GFX Library for Arduino@1.4.0 ; Update needs modification of custom PCA class + moononournation/GFX Library for Arduino@1.4.7 ; Update needs modification of custom PCA class ;git+https://github.com/moononournation/Arduino_GFX.git [tft_espi] diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index c946120a..601d841f 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -85,6 +85,10 @@ void ArduinoGfx::init(int w, int h) /* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */ tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_type1_init_operations, sizeof(st7701_type1_init_operations)); +#elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 272) && defined(NV3041A_DRIVER) + Arduino_DataBus* bus = new Arduino_ESP32QSPI(TFT_CS, TFT_SCK, TFT_D0, TFT_D1, TFT_D2, TFT_D3); + Arduino_GFX* g = new Arduino_NV3041A(bus, TFT_RST, TFT_ROTATION, TFT_IPS); + tft = g; #elif 1 /* Reset is not implemented in the panel */ if(TFT_RST != GFX_NOT_DEFINED) { @@ -299,6 +303,8 @@ const char* ArduinoGfx::get_tft_model() return "R61529"; #elif defined(RM68140_DRIVER) return "RM68140"; +#elif defined(NV3041A_DRIVER) + return "NV3041A"; #else return "Other"; #endif @@ -336,6 +342,8 @@ uint32_t ArduinoGfx::get_tft_driver() return 0x61529; #elif defined(RM68140_DRIVER) return 0x68140; +#elif defined(NV3041A_DRIVER) + return 0x3041A; #else return 0x0; #endif diff --git a/src/hasp_gui.cpp b/src/hasp_gui.cpp index 13caf317..ebb7870a 100644 --- a/src/hasp_gui.cpp +++ b/src/hasp_gui.cpp @@ -341,7 +341,7 @@ void guiSetup() #endif gui_hide_pointer(false); if(mouse_indev != NULL) { - lv_indev_set_cursor(mouse_indev, cursor); /*Connect the image object to the driver*/ + lv_indev_set_cursor(mouse_indev, cursor); /*Connect the image object to the driver*/ } #if HASP_TARGET_ARDUINO diff --git a/user_setups/esp32s3/guition-jc4827w543.ini b/user_setups/esp32s3/guition-jc4827w543.ini new file mode 100644 index 00000000..ae5f15e7 --- /dev/null +++ b/user_setups/esp32s3/guition-jc4827w543.ini @@ -0,0 +1,60 @@ +;***************************************************; +; Guition ESP32-S3 TFT 4.3" ; +; - Custom esp32-s3 board ; +; - nv3041a 480x272 ; +; - gt911 touch controller ; +;***************************************************; + +[guition-esp32-s3-tft] +extends = arduino_esp32s3_v2 +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi + +build_flags = + ${arduino_esp32s3_v2.build_flags} + ${esp32s3.ps_ram} + ;-D HASP_MODEL="Guition 4.3\"" + +;region -- ArduinoGFX build options ------------------------ + -D HASP_USE_ARDUINOGFX + -D NV3041A_DRIVER + -D BACKLIGHT_FREQUENCY=50 + ;endregion + +lib_deps = + ${arduino_esp32s3_v2.lib_deps} + ${arduinogfx.lib_deps} + ${goodix.lib_deps} + + +[guition-tft-common-pins] +build_flags = + -D TFT_BCKL=1 + -D TFT_CS=45 + -D TFT_SCK=47 + -D TFT_D0=21 + -D TFT_D1=48 + -D TFT_D2=40 + -D TFT_D3=39 + -D TFT_RST=GFX_NOT_DEFINED + -D TFT_ROTATION=0 + -D TFT_IPS=true + -D TFT_WIDTH=480 + -D TFT_HEIGHT=272 + +[guition-jc4827w543] +extends = guition-esp32-s3-tft +debug_tool = esp-builtin +debug_build_flags = -Os # optimize for size +build_flags = + -D HASP_MODEL="Guition ESP32-S3 JC4827W543" + ${guition-esp32-s3-tft.build_flags} + ${guition-tft-common-pins.build_flags} + ; Touch Settings + -D TOUCH_DRIVER=0x0911 + -D TOUCH_SCL=4 + -D TOUCH_SDA=8 + -D TOUCH_IRQ=-1 + -D TOUCH_RST=38 + -D I2C_TOUCH_FREQUENCY=0 + -D I2C_TOUCH_ADDRESS=0x5D \ No newline at end of file From c70dfe6d424ef0c5b433a4446304f2cd0db7f278 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Mon, 20 May 2024 15:03:19 +0100 Subject: [PATCH 009/142] Add list of TFT gpio pins so that they can not be selected for IO. --- src/drv/tft/tft_driver_arduinogfx.cpp | 98 +++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index c946120a..e050059c 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -262,6 +262,104 @@ void IRAM_ATTR ArduinoGfx::flush_pixels(lv_disp_drv_t* disp, const lv_area_t* ar bool ArduinoGfx::is_driver_pin(uint8_t pin) { + if(false // start condition is always needed + +// Use individual checks instead of switch statement, as some case labels could be duplicated +#ifdef TFT_MOSI + || (pin == TFT_MOSI) +#endif +#ifdef TFT_MISO + || (pin == TFT_MISO) +#endif +#ifdef TFT_SCLK + || (pin == TFT_SCLK) +#endif +#ifdef TFT_CS + || (pin == TFT_CS) +#endif +#ifdef TFT_DC + || (pin == TFT_DC) +#endif +#ifdef TFT_DE + || (pin == TFT_DE) +#endif +#ifdef TFT_PCLK + || (pin == TFT_PCLK) +#endif +#ifdef TFT_VSYNC + || (pin == TFT_VSYNC) +#endif +#ifdef TFT_HSYNC + || (pin == TFT_HSYNC) +#endif +#ifdef TFT_BCKL + || (pin == TFT_BCKL) +#endif +#ifdef TFT_RST + || (pin == TFT_RST) +#endif +#ifdef TFT_BUSY + || (pin == TFT_BUSY) +#endif +#ifdef TFT_RD + || (pin == TFT_RD) +#endif +#ifdef TFT_R0 + || (pin == TFT_R0) +#endif +#ifdef TFT_R1 + || (pin == TFT_R1) +#endif +#ifdef TFT_R2 + || (pin == TFT_R2) +#endif +#ifdef TFT_R3 + || (pin == TFT_R3) +#endif +#ifdef TFT_R4 + || (pin == TFT_R4) +#endif +#ifdef TFT_G0 + || (pin == TFT_G0) +#endif +#ifdef TFT_G1 + || (pin == TFT_G1) +#endif +#ifdef TFT_G2 + || (pin == TFT_G2) +#endif +#ifdef TFT_G3 + || (pin == TFT_G3) +#endif +#ifdef TFT_G4 + || (pin == TFT_G4) +#endif +#ifdef TFT_B0 + || (pin == TFT_B0) +#endif +#ifdef TFT_B1 + || (pin == TFT_B1) +#endif +#ifdef TFT_B2 + || (pin == TFT_B2) +#endif +#ifdef TFT_B3 + || (pin == TFT_B3) +#endif +#ifdef TFT_B4 + || (pin == TFT_B4) +#endif + ) { + return true; + } + +#ifdef ARDUINO_ARCH_ESP8266 +#ifndef TFT_SPI_OVERLAP + if((pin >= 12) && (pin <= 14)) return true; // HSPI +#endif +#endif + + return false; return false; } From 7a3b8d0997fe8367ad27f755f4f07df0a4ea77b4 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Mon, 20 May 2024 15:30:15 +0100 Subject: [PATCH 010/142] Add the touch gpio pins to the list so that they are hidden from IO selection. --- src/drv/tft/tft_driver_arduinogfx.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index e050059c..00847ca3 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -348,6 +348,18 @@ bool ArduinoGfx::is_driver_pin(uint8_t pin) #endif #ifdef TFT_B4 || (pin == TFT_B4) +#endif +#ifdef TOUCH_SDA + || (pin == TOUCH_SDA) +#endif +#ifdef TOUCH_SCL + || (pin == TOUCH_SCL) +#endif +#ifdef TOUCH_RST + || (pin == TOUCH_RST) +#endif +#ifdef TOUCH_IRQ + || (pin == TOUCH_IRQ) #endif ) { return true; From 86d45119404b9c7cbca170b911a56c07690dca5c Mon Sep 17 00:00:00 2001 From: K Date: Mon, 20 May 2024 12:18:33 -0400 Subject: [PATCH 011/142] Fix backlight freq and suffix build target --- user_setups/esp32s3/guition-jc4827w543.ini | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/user_setups/esp32s3/guition-jc4827w543.ini b/user_setups/esp32s3/guition-jc4827w543.ini index ae5f15e7..689b764c 100644 --- a/user_setups/esp32s3/guition-jc4827w543.ini +++ b/user_setups/esp32s3/guition-jc4827w543.ini @@ -18,7 +18,6 @@ build_flags = ;region -- ArduinoGFX build options ------------------------ -D HASP_USE_ARDUINOGFX -D NV3041A_DRIVER - -D BACKLIGHT_FREQUENCY=50 ;endregion lib_deps = @@ -42,12 +41,12 @@ build_flags = -D TFT_WIDTH=480 -D TFT_HEIGHT=272 -[guition-jc4827w543] -extends = guition-esp32-s3-tft +[guition-jc4827w543c] +extends = guition-esp32-s3-tft, flash_4mb debug_tool = esp-builtin debug_build_flags = -Os # optimize for size build_flags = - -D HASP_MODEL="Guition ESP32-S3 JC4827W543" + -D HASP_MODEL="Guition ESP32-S3 JC4827W543C" ${guition-esp32-s3-tft.build_flags} ${guition-tft-common-pins.build_flags} ; Touch Settings @@ -57,4 +56,4 @@ build_flags = -D TOUCH_IRQ=-1 -D TOUCH_RST=38 -D I2C_TOUCH_FREQUENCY=0 - -D I2C_TOUCH_ADDRESS=0x5D \ No newline at end of file + -D I2C_TOUCH_ADDRESS=0x5D From ca6d521a0a5d22f4bbb1c6c4b6146dad03fa5584 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Tue, 21 May 2024 13:14:58 +0100 Subject: [PATCH 012/142] Missing the FILE_SIZE_DIVIDER for gigabits - This results in the number being printed with the decimal point in the wrong place. --- src/hasp/hasp_parser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index a44a9741..eee1175d 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -212,6 +212,7 @@ int Parser::format_bytes(size_t filesize, char* buf, size_t len) return snprintf_P(buf, len, PSTR("%d" D_DECIMAL_POINT "%02d " D_FILE_SIZE_MEGABYTES), filesize / 100, filesize % 100); + filesize = filesize / D_FILE_SIZE_DIVIDER; // multiply by 100 for 2 decimal place return snprintf_P(buf, len, PSTR("%d" D_DECIMAL_POINT "%02d " D_FILE_SIZE_GIGABYTES), filesize / 100, filesize % 100); } From 3433efbb49bdd1822202b70d4434a8ff5546bd4b Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 21 May 2024 15:50:57 +0200 Subject: [PATCH 013/142] Update sensecap-indicator-d1 --- user_setups/esp32s3/sensecap-indicator.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user_setups/esp32s3/sensecap-indicator.ini b/user_setups/esp32s3/sensecap-indicator.ini index ef64e18d..bc721aba 100644 --- a/user_setups/esp32s3/sensecap-indicator.ini +++ b/user_setups/esp32s3/sensecap-indicator.ini @@ -83,8 +83,7 @@ build_flags = lib_deps = ${arduino_esp32s3_v2.lib_deps} - ${arduinogfx.lib_deps} - ; ${ft6336.lib_deps} + moononournation/GFX Library for Arduino@1.4.0 ; Update needs modification of custom PCA class ; ${ft6336.lib_deps} ; git+https://github.com/RobTillaart/TCA9555.git From 909afcf2baf21ecd51f15f50b5135d729e5b56d1 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 21 May 2024 20:28:56 +0200 Subject: [PATCH 014/142] UPdate ace.js to 1.33.3 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index a644194a..3d0a9e5a 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 2578aad1..c129c1e6 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From aa09f4bfd43a396816d902428a12a2b940d2f486 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 00:51:02 +0100 Subject: [PATCH 015/142] Using size_t limits max number to 2^32. When dealing with SD cards we could be asked to print a uint64 (for example, from SD.totalGytes()). --- src/hasp/hasp_parser.cpp | 26 ++++++++++++++------------ src/hasp/hasp_parser.h | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index eee1175d..f6db3854 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -197,24 +197,26 @@ bool Parser::is_only_digits(const char* s) return strlen(s) == digits; } -int Parser::format_bytes(size_t filesize, char* buf, size_t len) +int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { - if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%d " D_FILE_SIZE_BYTES), filesize); - filesize = filesize * 100; + uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line + if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); - filesize = filesize / D_FILE_SIZE_DIVIDER; // multiply by 100 for 2 decimal place + filesize = filesize / (D_FILE_SIZE_DIVIDER/100); // multiply by 100 for 2 decimal place + tmp = (uint32_t) filesize; if(filesize < D_FILE_SIZE_DIVIDER * 100) - return snprintf_P(buf, len, PSTR("%d" D_DECIMAL_POINT "%02d " D_FILE_SIZE_KILOBYTES), filesize / 100, - filesize % 100); + return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_KILOBYTES), tmp / 100, + tmp % 100); - filesize = filesize / D_FILE_SIZE_DIVIDER; // multiply by 100 for 2 decimal place + filesize = filesize / D_FILE_SIZE_DIVIDER; + tmp = (uint32_t) filesize; if(filesize < D_FILE_SIZE_DIVIDER * 100) - return snprintf_P(buf, len, PSTR("%d" D_DECIMAL_POINT "%02d " D_FILE_SIZE_MEGABYTES), filesize / 100, - filesize % 100); + return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_MEGABYTES), tmp / 100, + tmp % 100); - filesize = filesize / D_FILE_SIZE_DIVIDER; // multiply by 100 for 2 decimal place - return snprintf_P(buf, len, PSTR("%d" D_DECIMAL_POINT "%02d " D_FILE_SIZE_GIGABYTES), filesize / 100, - filesize % 100); + tmp = (uint32_t) (filesize / D_FILE_SIZE_DIVIDER); + return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_GIGABYTES), tmp / 100, + tmp % 100); } uint8_t Parser::get_action_id(const char* action) diff --git a/src/hasp/hasp_parser.h b/src/hasp/hasp_parser.h index d1c44bea..84dcfd1b 100644 --- a/src/hasp/hasp_parser.h +++ b/src/hasp/hasp_parser.h @@ -19,7 +19,7 @@ class Parser { static bool is_true(const char* s); static bool is_true(JsonVariant json); static bool is_only_digits(const char* s); - static int format_bytes(size_t filesize, char* buf, size_t len); + static int format_bytes(uint64_t filesize, char* buf, size_t len); }; #ifndef ARDUINO From 33f3c3691576a187057aa98039d8812e77cdfe0b Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 11:20:14 +0100 Subject: [PATCH 016/142] Take onboard comment about loss of precision. Using size_t would have overflowed at (approx) 2^28. But with a uint64_t the limit is going to be up in the Exbi range (2^60). --- src/hasp/hasp_parser.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index f6db3854..2f79ffb6 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -199,22 +199,24 @@ bool Parser::is_only_digits(const char* s) int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { + filesize *= 100; // Warning - If filesize up in the Zi range (2^60), we will overflow. uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); - filesize = filesize / (D_FILE_SIZE_DIVIDER/100); // multiply by 100 for 2 decimal place + filesize /= D_FILE_SIZE_DIVIDER; tmp = (uint32_t) filesize; if(filesize < D_FILE_SIZE_DIVIDER * 100) return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_KILOBYTES), tmp / 100, tmp % 100); - filesize = filesize / D_FILE_SIZE_DIVIDER; + filesize /= D_FILE_SIZE_DIVIDER; tmp = (uint32_t) filesize; - if(filesize < D_FILE_SIZE_DIVIDER * 100) + if(filesize < D_FILE_SIZE_DIVIDER * D_FILE_SIZE_DIVIDER * 100) return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_MEGABYTES), tmp / 100, tmp % 100); - tmp = (uint32_t) (filesize / D_FILE_SIZE_DIVIDER); + filesize /= D_FILE_SIZE_DIVIDER; + tmp = (uint32_t) filesize; return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_GIGABYTES), tmp / 100, tmp % 100); } From 7dc3de34f82454b255df143facd0c3ce67f1ad7a Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 11:56:23 +0100 Subject: [PATCH 017/142] One too many file system dividers used for megabyte comparison. --- src/hasp/hasp_parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index 2f79ffb6..64e4729f 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -211,7 +211,7 @@ int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) filesize /= D_FILE_SIZE_DIVIDER; tmp = (uint32_t) filesize; - if(filesize < D_FILE_SIZE_DIVIDER * D_FILE_SIZE_DIVIDER * 100) + if(filesize < D_FILE_SIZE_DIVIDER * 100) return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_MEGABYTES), tmp / 100, tmp % 100); From b65bd46b411b44c44a8b51b3310b942a66f7e118 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 12:18:03 +0100 Subject: [PATCH 018/142] 2^60 is Exbi (Ei) not Zebi (Zi) --- src/hasp/hasp_parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index 64e4729f..fb557cc5 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -199,7 +199,7 @@ bool Parser::is_only_digits(const char* s) int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { - filesize *= 100; // Warning - If filesize up in the Zi range (2^60), we will overflow. + filesize *= 100; // Warning - If filesize up in the Ei range (2^60), we will overflow. uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); From 452c619e97c66698112641503d4a1bb419461e57 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 12:44:36 +0100 Subject: [PATCH 019/142] Use a const char* array for format_bytes suffixes at the expense of a little more system memory. --- src/hasp/hasp_parser.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index fb557cc5..ae5fe88c 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -203,22 +203,14 @@ int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); - filesize /= D_FILE_SIZE_DIVIDER; + const char* suffix[] = {D_FILE_SIZE_KILOBYTES, D_FILE_SIZE_MEGABYTES, D_FILE_SIZE_GIGABYTES}; + int n = -1; + while (filesize > D_FILE_SIZE_DIVIDER * 100) { + n += 1; + filesize /= D_FILE_SIZE_DIVIDER; + } tmp = (uint32_t) filesize; - if(filesize < D_FILE_SIZE_DIVIDER * 100) - return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_KILOBYTES), tmp / 100, - tmp % 100); - - filesize /= D_FILE_SIZE_DIVIDER; - tmp = (uint32_t) filesize; - if(filesize < D_FILE_SIZE_DIVIDER * 100) - return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_MEGABYTES), tmp / 100, - tmp % 100); - - filesize /= D_FILE_SIZE_DIVIDER; - tmp = (uint32_t) filesize; - return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u " D_FILE_SIZE_GIGABYTES), tmp / 100, - tmp % 100); + return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u %s"), tmp / 100, tmp % 100, suffix[n]); } uint8_t Parser::get_action_id(const char* action) From e37ca4c318e41e767f6d76fff3e2277700146906 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 15:21:44 +0100 Subject: [PATCH 020/142] Just in case file size in the TiB range gets passed, make sure we don't index beyond the end of the array. --- src/hasp/hasp_parser.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index ae5fe88c..b3966380 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -199,16 +199,18 @@ bool Parser::is_only_digits(const char* s) int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { - filesize *= 100; // Warning - If filesize up in the Ei range (2^60), we will overflow. + filesize *= 102400; // Warning - If filesize up in the Ei range (2^60), we will overflow. uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); - const char* suffix[] = {D_FILE_SIZE_KILOBYTES, D_FILE_SIZE_MEGABYTES, D_FILE_SIZE_GIGABYTES}; + const char* suffix[] = {D_FILE_SIZE_KILOBYTES, D_FILE_SIZE_MEGABYTES, D_FILE_SIZE_GIGABYTES, "oops"}; + #define UNKNOWN_SUFFIX 2 int n = -1; - while (filesize > D_FILE_SIZE_DIVIDER * 100) { + while (filesize > D_FILE_SIZE_DIVIDER * 100 && n < UNKNOWN_SUFFIX) { n += 1; filesize /= D_FILE_SIZE_DIVIDER; } + tmp = (uint32_t) filesize; return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u %s"), tmp / 100, tmp % 100, suffix[n]); } From fcd99682b32358be20f8749741f87cb27f30904a Mon Sep 17 00:00:00 2001 From: FreeBear Date: Wed, 22 May 2024 15:26:31 +0100 Subject: [PATCH 021/142] Forgot to roll back on a test. --- src/hasp/hasp_parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index b3966380..6177164d 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -199,7 +199,7 @@ bool Parser::is_only_digits(const char* s) int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { - filesize *= 102400; // Warning - If filesize up in the Ei range (2^60), we will overflow. + filesize *= 100; // Warning - If filesize up in the Ei range (2^60), we will overflow. uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); From cc1d6d9458f326dcdcfc4d50d0f0e23ff1e171b1 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Wed, 22 May 2024 18:28:53 +0200 Subject: [PATCH 022/142] Refactor format_bytes --- src/hasp/hasp_parser.cpp | 24 ++++++++++++++---------- src/lang/en_US.h | 1 + 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index 6177164d..bb29307d 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -199,20 +199,24 @@ bool Parser::is_only_digits(const char* s) int Parser::format_bytes(uint64_t filesize, char* buf, size_t len) { - filesize *= 100; // Warning - If filesize up in the Ei range (2^60), we will overflow. - uint32_t tmp = (uint32_t) filesize; // cast to unsigned int here to saye ugly casts in next line - if(filesize < D_FILE_SIZE_DIVIDER) return snprintf_P(buf, len, PSTR("%u " D_FILE_SIZE_BYTES), tmp); + const char* suffix[] = {D_FILE_SIZE_BYTES, D_FILE_SIZE_KILOBYTES, D_FILE_SIZE_MEGABYTES, D_FILE_SIZE_GIGABYTES, + D_FILE_SIZE_TERABYTES}; + uint32_t factor; + uint16_t remainder = 0; + uint8_t i = 0; + uint8_t last_index = (sizeof(suffix) / sizeof(suffix[0])) - 1; - const char* suffix[] = {D_FILE_SIZE_KILOBYTES, D_FILE_SIZE_MEGABYTES, D_FILE_SIZE_GIGABYTES, "oops"}; - #define UNKNOWN_SUFFIX 2 - int n = -1; - while (filesize > D_FILE_SIZE_DIVIDER * 100 && n < UNKNOWN_SUFFIX) { - n += 1; + while(filesize >= D_FILE_SIZE_DIVIDER && i < last_index) { + i += 1; + remainder = filesize % D_FILE_SIZE_DIVIDER; filesize /= D_FILE_SIZE_DIVIDER; } - tmp = (uint32_t) filesize; - return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u %s"), tmp / 100, tmp % 100, suffix[n]); + factor = (uint32_t)filesize; + if(i == 0) return snprintf_P(buf, len, PSTR("%u %s"), factor, suffix[i]); + + remainder = remainder * 100 / D_FILE_SIZE_DIVIDER; + return snprintf_P(buf, len, PSTR("%u" D_DECIMAL_POINT "%02u %s"), factor, remainder, suffix[i]); } uint8_t Parser::get_action_id(const char* action) diff --git a/src/lang/en_US.h b/src/lang/en_US.h index 13df8dbc..0ec1b257 100644 --- a/src/lang/en_US.h +++ b/src/lang/en_US.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From d2745abb444b64ece37b40ffc201879494f5dc5e Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:49 +0200 Subject: [PATCH 023/142] New translations en_us.h (Romanian) --- src/lang/ro_RO.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/ro_RO.h b/src/lang/ro_RO.h index 13df8dbc..0ec1b257 100644 --- a/src/lang/ro_RO.h +++ b/src/lang/ro_RO.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From 6d594e3d53bf7df419e812b70a0061b267f0d61d Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:50 +0200 Subject: [PATCH 024/142] New translations en_us.h (French) --- src/lang/fr_FR.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/fr_FR.h b/src/lang/fr_FR.h index f84d3995..a752cc6b 100644 --- a/src/lang/fr_FR.h +++ b/src/lang/fr_FR.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "Kio" #define D_FILE_SIZE_MEGABYTES "Mio" #define D_FILE_SIZE_GIGABYTES "Gio" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "," // decimal comma or point From 13095042dca58b0b4c51e97631838600660cb5cc Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:51 +0200 Subject: [PATCH 025/142] New translations en_us.h (Spanish) --- src/lang/es_ES.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h index 613e47ba..af77f0d9 100644 --- a/src/lang/es_ES.h +++ b/src/lang/es_ES.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" // new #define D_FILE_SIZE_MEGABYTES "MiB" // new #define D_FILE_SIZE_GIGABYTES "GiB" // new +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // new, kibi or kilo bytes #define D_DECIMAL_POINT "," // new, decimal comma or point From 0e1d37c8591393ecd0c9250122734c7b85dd4d41 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:52 +0200 Subject: [PATCH 026/142] New translations en_us.h (Danish) --- src/lang/da_DK.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/da_DK.h b/src/lang/da_DK.h index 13df8dbc..0ec1b257 100644 --- a/src/lang/da_DK.h +++ b/src/lang/da_DK.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From de4c1875c39ae2eea41a00e0d87945ea250c9fb7 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:53 +0200 Subject: [PATCH 027/142] New translations en_us.h (German) --- src/lang/de_DE.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/de_DE.h b/src/lang/de_DE.h index efd70477..aa83e7b5 100644 --- a/src/lang/de_DE.h +++ b/src/lang/de_DE.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "," // decimal comma or point From 00df690a160c603776a02f2d3976d1d92d53fb3e Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:54 +0200 Subject: [PATCH 028/142] New translations en_us.h (Hungarian) --- src/lang/hu_HU.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/hu_HU.h b/src/lang/hu_HU.h index 13df8dbc..0ec1b257 100644 --- a/src/lang/hu_HU.h +++ b/src/lang/hu_HU.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From c088ddff8e8c75283e20cd9b428dcb4f78c21f87 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:55 +0200 Subject: [PATCH 029/142] New translations en_us.h (Dutch) --- src/lang/nl_NL.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/nl_NL.h b/src/lang/nl_NL.h index 92e22846..79afa3d1 100644 --- a/src/lang/nl_NL.h +++ b/src/lang/nl_NL.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "," // decimal comma or point From ee5df54676c72dc3409e779f0b61a596f15873b8 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:56 +0200 Subject: [PATCH 030/142] New translations en_us.h (Portuguese) --- src/lang/pt_PT.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h index 265b26f0..f20c21ae 100644 --- a/src/lang/pt_PT.h +++ b/src/lang/pt_PT.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" // new #define D_FILE_SIZE_MEGABYTES "MiB" // new #define D_FILE_SIZE_GIGABYTES "GiB" // new +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // new, kibi or kilo bytes #define D_DECIMAL_POINT "." // new, decimal comma or point From fba1331c3be4b98fbc2ee338306776d4e1b88805 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:57 +0200 Subject: [PATCH 031/142] New translations en_us.h (Chinese Simplified) --- src/lang/zh_CN.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/zh_CN.h b/src/lang/zh_CN.h index 13df8dbc..0ec1b257 100644 --- a/src/lang/zh_CN.h +++ b/src/lang/zh_CN.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From 83bdad83e571df9cf0b4e64464b85d13fa3d00f9 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 18:33:58 +0200 Subject: [PATCH 032/142] New translations en_us.h (Portuguese, Brazilian) --- src/lang/pt_BR.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/pt_BR.h b/src/lang/pt_BR.h index 169e3a8d..54121409 100644 --- a/src/lang/pt_BR.h +++ b/src/lang/pt_BR.h @@ -30,6 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "." // decimal comma or point From 1ea0752004eccd81d1be0b770aee918b319a58df Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 20:14:23 +0200 Subject: [PATCH 033/142] New translations en_us.h (French) --- src/lang/fr_FR.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lang/fr_FR.h b/src/lang/fr_FR.h index a752cc6b..51183b2f 100644 --- a/src/lang/fr_FR.h +++ b/src/lang/fr_FR.h @@ -30,7 +30,7 @@ #define D_FILE_SIZE_KILOBYTES "Kio" #define D_FILE_SIZE_MEGABYTES "Mio" #define D_FILE_SIZE_GIGABYTES "Gio" -#define D_FILE_SIZE_TERABYTES "TiB" +#define D_FILE_SIZE_TERABYTES "Tio" #define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes #define D_DECIMAL_POINT "," // decimal comma or point @@ -128,7 +128,7 @@ #define D_HTTP_HTTP_SETTINGS "Paramètres HTTP" #define D_HTTP_FTP_SETTINGS "Paramètres FTP" #define D_HTTP_WIFI_SETTINGS "Paramètres Wifi" -#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" +#define D_HTTP_WIREGUARD_SETTINGS "Paramètres WireGuard" #define D_HTTP_MQTT_SETTINGS "Paramètres MQTT" #define D_HTTP_GPIO_SETTINGS "Paramètres GPIO" #define D_HTTP_MDNS_SETTINGS "Paramètres mDNS" @@ -203,8 +203,8 @@ #define D_INFO_MAC_ADDRESS "Adresse MAC" #define D_INFO_GATEWAY "Passerelle" #define D_INFO_DNS_SERVER "Serveur DNS" -#define D_INFO_ENDPOINT_IP "Endpoint IP" -#define D_INFO_ENDPOINT_PORT "Endpoint Port" +#define D_INFO_ENDPOINT_IP "Adresse IP du point final" +#define D_INFO_ENDPOINT_IP "Port du point final" #define D_OOBE_MSG "Touchez l'écran pour configurer le WiFi ou branchez ce point d'accès:" #define D_OOBE_SCAN_TO_CONNECT "Scanner pour se connecter" @@ -217,8 +217,8 @@ #define D_WIFI_RSSI_WEAK "Faible" #define D_WIFI_RSSI_BAD "Très mauvais" -#define D_WG_INITIALIZED "Initialized" -#define D_WG_BAD_CONFIG "Missing or bad configuration" +#define D_WG_INITIALIZED "Initialisé" +#define D_WG_BAD_CONFIG "Configuration manquante ou incorrecte" #define D_GPIO_SWITCH "Interrupteur" #define D_GPIO_BUTTON "Bouton" From 646f8d91fe134f4bccc6e8501f18e7eb01f89ed9 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 20:14:25 +0200 Subject: [PATCH 034/142] New translations en_us.h (Spanish) --- src/lang/es_ES.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h index af77f0d9..acee2059 100644 --- a/src/lang/es_ES.h +++ b/src/lang/es_ES.h @@ -13,7 +13,7 @@ #define D_NO "No" // New #define D_ERROR_OUT_OF_MEMORY "Memory llena" -#define D_ERROR_UNKNOWN "Unknown error" +#define D_ERROR_UNKNOWN "Error desconocido" #define D_CONFIG_NOT_CHANGED "No hay cambios en la configuración" #define D_CONFIG_CHANGED "Configuración cambiada" @@ -128,7 +128,7 @@ #define D_HTTP_HTTP_SETTINGS "Ajustes HTTP" #define D_HTTP_HTTP_SETTINGS "Ajustes FTP" #define D_HTTP_WIFI_SETTINGS "Ajustes Wifi" -#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" +#define D_HTTP_GUI_SETTINGS "Ajustes WireGuard" #define D_HTTP_MQTT_SETTINGS "Ajustes MQTT" #define D_HTTP_GPIO_SETTINGS "Ajustes GPIO" #define D_HTTP_MDNS_SETTINGS "Ajustes mDNS" @@ -203,8 +203,8 @@ #define D_INFO_MAC_ADDRESS "Dirección MAC" #define D_INFO_GATEWAY "Gateway" #define D_INFO_DNS_SERVER "Servidor DNS" -#define D_INFO_ENDPOINT_IP "Endpoint IP" -#define D_INFO_ENDPOINT_PORT "Endpoint Port" +#define D_INFO_ENDPOINT_IP "IP de punto final" +#define D_INFO_ENDPOINT_PORT "Puerto de punto final" #define D_OOBE_MSG "Toque la pantalla para ajustar WiFi o conectarse a un punto de acceso" #define D_OOBE_SCAN_TO_CONNECT "Scanee para conectar" @@ -217,8 +217,8 @@ #define D_WIFI_RSSI_WEAK "Débil" #define D_WIFI_RSSI_BAD "Muy baka" -#define D_WG_INITIALIZED "Initialized" -#define D_WG_BAD_CONFIG "Missing or bad configuration" +#define D_WG_INITIALIZED "Inicializado" +#define D_WG_BAD_CONFIG "Falta o mala configuración" #define D_GPIO_SWITCH "Switch" #define D_GPIO_BUTTON "Botón" From 331c1d503d45c940353023b9470f3f421a0aa4ef Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 20:14:28 +0200 Subject: [PATCH 035/142] New translations en_us.h (Portuguese) --- src/lang/pt_PT.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h index f20c21ae..757a1e2f 100644 --- a/src/lang/pt_PT.h +++ b/src/lang/pt_PT.h @@ -128,7 +128,7 @@ #define D_HTTP_HTTP_SETTINGS "Configurar HTTP" #define D_HTTP_FTP_SETTINGS "Configurar FTP" #define D_HTTP_WIFI_SETTINGS "Configurar Wifi" -#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" +#define D_HTTP_WIREGUARD_SETTINGS "Configurar WireGuard" #define D_HTTP_MQTT_SETTINGS "Configurar MQTT" #define D_HTTP_GPIO_SETTINGS "Configurar GPIO" #define D_HTTP_MDNS_SETTINGS "Configurar mDNS" @@ -217,8 +217,8 @@ #define D_WIFI_RSSI_BAD "Muito baixo" #define D_WIFI_RSSI_FAIR "Decente" -#define D_WG_INITIALIZED "Initialized" -#define D_WG_BAD_CONFIG "Missing or bad configuration" +#define D_WG_INITIALIZED "Inicializado" +#define D_WG_BAD_CONFIG "Configuração ausente ou ruim" #define D_GPIO_SWITCH "Interruptor" #define D_GPIO_BUTTON "Botão" From 92f682c6bd8620ae1222dc8f85d546dba0b6183e Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 20:14:30 +0200 Subject: [PATCH 036/142] New translations en.json (French) --- data/fr_FR.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/fr_FR.json b/data/fr_FR.json index 7247c2f6..aacaead0 100644 --- a/data/fr_FR.json +++ b/data/fr_FR.json @@ -86,13 +86,13 @@ "ssid": "SSID" }, "wg": { - "title": "WireGuard Settings", - "btn": "WireGuard Settings", - "vpnip": "VPN IP", - "privkey": "Private Key", - "host": "Remote IP", - "port": "Remote Port", - "pubkey": "Remote Public Key" + "title": "Paramètres WireGuard", + "btn": "Paramètres WireGuard", + "vpnip": "IP du VPN", + "privkey": "Clé Privée", + "host": "Adresse IP distante", + "port": "Port Distant", + "pubkey": "Clé publique distante" }, "mqtt": { "title": "Paramètres MQTT", From 983cf13fd0903ba9bc583fedfeb993e8b0b4ce76 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 22 May 2024 20:14:31 +0200 Subject: [PATCH 037/142] New translations en.json (Spanish) --- data/es_ES.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/es_ES.json b/data/es_ES.json index fa1292a2..7df5c933 100644 --- a/data/es_ES.json +++ b/data/es_ES.json @@ -86,13 +86,13 @@ "ssid": "SSID" }, "wg": { - "title": "WireGuard Settings", - "btn": "WireGuard Settings", - "vpnip": "VPN IP", - "privkey": "Private Key", - "host": "Remote IP", - "port": "Remote Port", - "pubkey": "Remote Public Key" + "title": "Ajustes de WireGuard", + "btn": "Ajustes de WireGuard", + "vpnip": "IP VPN", + "privkey": "Clave Privada", + "host": "IP Remota", + "port": "Puerto Remoto", + "pubkey": "Clave Pública Remota" }, "mqtt": { "title": "Ajustes MQTT", From cd3fa42fc09538c895e02f18ba20eda917da8700 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Wed, 22 May 2024 20:38:51 +0200 Subject: [PATCH 038/142] Update ace.js to 1.34.0 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 3d0a9e5a..e15ab495 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index c129c1e6..670b0d92 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 27a0e7ce7321d58064d4528539a2d90c767a0f6d Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 23 May 2024 16:12:46 +0200 Subject: [PATCH 039/142] Add jc4827w543c_4MB --- .github/workflows/build.yaml | 2 +- user_setups/esp32s3/guition-jc4827w543.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d4104b2e..8a8a5054 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -35,7 +35,7 @@ jobs: - out: globalsecurity env: gs-t3e_16MB - out: guition - env: esp32-s3-4848s040_16MB + env: esp32-s3-4848s040_16MB -e guition-jc4827w543c_4MB - out: lanbon env: lanbon_l8 - out: lilygo-ttgo diff --git a/user_setups/esp32s3/guition-jc4827w543.ini b/user_setups/esp32s3/guition-jc4827w543.ini index 689b764c..5a3721df 100644 --- a/user_setups/esp32s3/guition-jc4827w543.ini +++ b/user_setups/esp32s3/guition-jc4827w543.ini @@ -41,7 +41,7 @@ build_flags = -D TFT_WIDTH=480 -D TFT_HEIGHT=272 -[guition-jc4827w543c] +[guition-jc4827w543c_4MB] extends = guition-esp32-s3-tft, flash_4mb debug_tool = esp-builtin debug_build_flags = -Os # optimize for size From 6f402cb42dca5717306197e09549ac4a32617bca Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 23 May 2024 16:17:50 +0200 Subject: [PATCH 040/142] Add guition-jc4827w543c_4MB --- user_setups/esp32s3/guition-jc4827w543.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_setups/esp32s3/guition-jc4827w543.ini b/user_setups/esp32s3/guition-jc4827w543.ini index 5a3721df..0d41565c 100644 --- a/user_setups/esp32s3/guition-jc4827w543.ini +++ b/user_setups/esp32s3/guition-jc4827w543.ini @@ -41,7 +41,7 @@ build_flags = -D TFT_WIDTH=480 -D TFT_HEIGHT=272 -[guition-jc4827w543c_4MB] +[env:guition-jc4827w543c_4MB] extends = guition-esp32-s3-tft, flash_4mb debug_tool = esp-builtin debug_build_flags = -Os # optimize for size From cd34d8994fc1c720982c8c4c2b2044a4d16cf1a7 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 00:09:52 +0200 Subject: [PATCH 041/142] Add elecrow-s3-8048c050_4MB --- .github/workflows/build.yaml | 2 +- user_setups/esp32s3/crowpanel-hmi.ini | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8a8a5054..64838bd1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -31,7 +31,7 @@ jobs: - out: dustinwatts env: "freetouchdeck_4MB -e freetouchdeck_8MB -e esp32-touchdown" - out: elecrow - env: "esp32-terminal-rgb_16MB -e esp32-terminal-spi_16MB -e elecrow-s3-8048c070_4MB" + env: "esp32-terminal-rgb_16MB -e esp32-terminal-spi_16MB -e elecrow-s3-8048c050_4MB -e elecrow-s3-8048c070_4MB" - out: globalsecurity env: gs-t3e_16MB - out: guition diff --git a/user_setups/esp32s3/crowpanel-hmi.ini b/user_setups/esp32s3/crowpanel-hmi.ini index 5a6be7c0..74ebc05c 100644 --- a/user_setups/esp32s3/crowpanel-hmi.ini +++ b/user_setups/esp32s3/crowpanel-hmi.ini @@ -81,9 +81,6 @@ extends = elecrow-esp32-s3-tft, flash_4mb build_flags = -D HASP_MODEL="Elecrow WZ8048C070" - -D HASP_LOG_LEVEL=LOG_LEVEL_WARNING - -D HASP_USE_CAPTIVE_PORTAL=0 - ; -D HASP_USE_CUSTOM=1 ${elecrow-esp32-s3-tft.build_flags} ${elecrow-tft-common-pins.build_flags} @@ -127,9 +124,6 @@ extends = elecrow-esp32-s3-tft, flash_4mb build_flags = -D HASP_MODEL="Elecrow WZ8048C050" - -D HASP_LOG_LEVEL=LOG_LEVEL_WARNING - -D HASP_USE_CAPTIVE_PORTAL=0 - ; -D HASP_USE_CUSTOM=1 ${elecrow-esp32-s3-tft.build_flags} From a9d514b04c5553a7e4bedc6f79df5a947a590268 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 04:12:41 +0200 Subject: [PATCH 042/142] Flakey WiFi on Sunton #592 --- user_setups/esp32s3/sunton-esp32-s3-tft.ini | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/user_setups/esp32s3/sunton-esp32-s3-tft.ini b/user_setups/esp32s3/sunton-esp32-s3-tft.ini index 1da68da7..5c4e9139 100644 --- a/user_setups/esp32s3/sunton-esp32-s3-tft.ini +++ b/user_setups/esp32s3/sunton-esp32-s3-tft.ini @@ -142,7 +142,7 @@ build_flags = -D TFT_VSYNC_PULSE_WIDTH=4 ; Typical VSYNC Pulse Width -D TFT_VSYNC_BACK_PORCH=8 ; Typical VSYNC Back Porch -D TFT_PCLK_ACTIVE_NEG=1 - -D TFT_PREFER_SPEED=14000000 ; 1/2 of Typical DCLK Frequency + -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency -D TFT_AUTO_FLUSH=1 ; Touch Settings -D TOUCH_WIDTH=480 @@ -180,7 +180,7 @@ build_flags = -D TFT_VSYNC_PULSE_WIDTH=4 ; Typical VSYNC Pulse Width -D TFT_VSYNC_BACK_PORCH=8 ; Typical VSYNC Back Porch -D TFT_PCLK_ACTIVE_NEG=1 - -D TFT_PREFER_SPEED=14000000 ; 1/2 of Typical DCLK Frequency + -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency -D TFT_AUTO_FLUSH=1 ; Touch Settings -D TOUCH_WIDTH=800 @@ -229,15 +229,15 @@ build_flags = -D TFT_B4=4 ; Panel Settings -D TFT_HSYNC_POLARITY=0 - -D TFT_HSYNC_FRONT_PORCH=8 ; Maximum HSYNC Front Porch / 8 GOOD - -D TFT_HSYNC_PULSE_WIDTH=10 ; Typical HSYNC Pulse Width / 10 GOOD - -D TFT_HSYNC_BACK_PORCH=43 ; Typical HSYNC Back Porch / 43 GOOD + -D TFT_HSYNC_FRONT_PORCH=8 ; Maximum HSYNC Front Porch / 8 GOOD + -D TFT_HSYNC_PULSE_WIDTH=10 ; Typical HSYNC Pulse Width / 10 GOOD + -D TFT_HSYNC_BACK_PORCH=43 ; Typical HSYNC Back Porch / 43 GOOD -D TFT_VSYNC_POLARITY=0 -D TFT_VSYNC_FRONT_PORCH=8 ; Maximum VSYNC Front Porch / 8 GOOD -D TFT_VSYNC_PULSE_WIDTH=8 ; Typical VSYNC Pulse Width / 8 GOOD - -D TFT_VSYNC_BACK_PORCH=12 ; Typical VSYNC Back Porch / 12 GOOD + -D TFT_VSYNC_BACK_PORCH=12 ; Typical VSYNC Back Porch / 12 GOOD -D TFT_PCLK_ACTIVE_NEG=1 - -D TFT_PREFER_SPEED=14500000 ; 1/2 of Typical DCLK Frequency / 12000000 GOOD + -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency / 12000000 GOOD -D TFT_AUTO_FLUSH=1 ; Touch Settings -D TOUCH_WIDTH=800 From 1f471ad308028d92af30b63a524b7e1e2e782b32 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 05:03:53 +0200 Subject: [PATCH 043/142] Add custom_state_subtopic #611 --- src/custom/my_custom_fan_template.cpp | 4 ++++ src/custom/my_custom_template.cpp | 5 +++++ src/custom/my_custom_template.h | 5 +++++ src/hasp/hasp_dispatch.cpp | 12 +++++++++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/custom/my_custom_fan_template.cpp b/src/custom/my_custom_fan_template.cpp index b7bed86d..a8775242 100644 --- a/src/custom/my_custom_fan_template.cpp +++ b/src/custom/my_custom_fan_template.cpp @@ -98,4 +98,8 @@ void custom_topic_payload(const char* topic, const char* payload, uint8_t source // LOG_VERBOSE(TAG_CUSTOM, "Handled custom message: %s => %s", topic, payload); } +void custom_state_subtopic(const char* subtopic, const char* payload){ + // Not used +} + #endif // HASP_USE_CUSTOM diff --git a/src/custom/my_custom_template.cpp b/src/custom/my_custom_template.cpp index b41da916..358bbd0f 100644 --- a/src/custom/my_custom_template.cpp +++ b/src/custom/my_custom_template.cpp @@ -53,4 +53,9 @@ void custom_topic_payload(const char* topic, const char* payload, uint8_t source // Not used } +void custom_state_subtopic(const char* subtopic, const char* payload){ + // Not used +} + + #endif // HASP_USE_CUSTOM \ No newline at end of file diff --git a/src/custom/my_custom_template.h b/src/custom/my_custom_template.h index 111df88f..3e25c031 100644 --- a/src/custom/my_custom_template.h +++ b/src/custom/my_custom_template.h @@ -32,6 +32,11 @@ void custom_get_sensors(JsonDocument& doc); /* Receive custom topic & payload messages */ void custom_topic_payload(const char* topic, const char* payload, uint8_t source); +/* Get notified when a state message is sent out */ +/* Can be used to send state changes through other means then MQTT, e.g. Serial2 */ +/* https://github.com/HASwitchPlate/openHASP/issues/611 */ +void custom_state_subtopic(const char* subtopic, const char* payload); + #endif // HASP_USE_CUSTOM #endif // HASP_CUSTOM_H diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 03b0da9d..39ddae76 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -43,7 +43,7 @@ uint16_t dispatchSecondsToNextTeleperiod = 0; uint16_t dispatchSecondsToNextSensordata = 0; uint16_t dispatchSecondsToNextDiscovery = 0; uint8_t nCommands = 0; -haspCommand_t commands[28]; +haspCommand_t commands[29]; moodlight_t moodlight = {.brightness = 255}; uint8_t saved_jsonl_page = 0; @@ -74,6 +74,10 @@ void dispatch_state_subtopic(const char* subtopic, const char* payload) } #endif +#if HASP_USE_CUSTOM > 0 + custom_state_subtopic(subtopic, payload); +#endif + #if HASP_USE_TASMOTA_CLIENT > 0 slave_send_state(subtopic, payload); #endif @@ -864,6 +868,11 @@ void dispatch_run_script(const char*, const char* payload, uint8_t source) #endif } +void dispatch_dir(const char*, const char* payload, uint8_t source) +{ + filesystem_list_path(payload); +} + #if HASP_TARGET_PC static void shell_command_thread(char* cmdline) { @@ -1592,6 +1601,7 @@ void dispatchSetup() dispatch_add_command(PSTR("sensors"), dispatch_send_sensordata); dispatch_add_command(PSTR("theme"), dispatch_theme); dispatch_add_command(PSTR("run"), dispatch_run_script); + dispatch_add_command(PSTR("dir"), dispatch_dir); #if HASP_TARGET_PC dispatch_add_command(PSTR("shell"), dispatch_shell_execute); #endif From 5c80f41fcfa53c08239d4a98acd046d20f2f18e3 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 05:14:49 +0200 Subject: [PATCH 044/142] Add custom_state_subtopic --- src/hasp/hasp_dispatch.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 39ddae76..72c6b4f0 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -52,7 +52,7 @@ uint8_t saved_jsonl_page = 0; */ void dispatch_state_subtopic(const char* subtopic, const char* payload) { -#if HASP_USE_MQTT == 0 && HASP_USE_TASMOTA_CLIENT == 0 +#if HASP_USE_MQTT == 0 && defined(HASP_USE_TASMOTA_CLIENT) && HASP_USE_TASMOTA_CLIENT > 0 LOG_TRACE(TAG_MSGR, F("%s => %s"), subtopic, payload); #else @@ -74,15 +74,15 @@ void dispatch_state_subtopic(const char* subtopic, const char* payload) } #endif -#if HASP_USE_CUSTOM > 0 - custom_state_subtopic(subtopic, payload); -#endif - -#if HASP_USE_TASMOTA_CLIENT > 0 +#if defined(HASP_USE_TASMOTA_CLIENT) && HASP_USE_TASMOTA_CLIENT > 0 slave_send_state(subtopic, payload); #endif #endif + +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 + custom_state_subtopic(subtopic, payload); +#endif } void dispatch_state_eventid(const char* topic, hasp_event_t eventid) From 8a341fd09cedcc217355092ef575f56fdf2d08ff Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 13:50:15 +0200 Subject: [PATCH 045/142] Update ace.js to 1.34.1 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index e15ab495..4d1ccace 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 670b0d92..e9705de1 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From d903bc905fb76859852f2c0d92ff6a80e234b8a9 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 21:39:57 +0200 Subject: [PATCH 046/142] Add mqttEverySecond --- src/hasp/hasp_task.cpp | 4 ++++ src/main.cpp | 4 ++++ src/mqtt/hasp_mqtt.h | 1 + src/mqtt/hasp_mqtt_esp.cpp | 18 +++++++++++------- src/mqtt/hasp_mqtt_paho_async.cpp | 2 -- src/mqtt/hasp_mqtt_pubsubclient.cpp | 4 ++-- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/hasp/hasp_task.cpp b/src/hasp/hasp_task.cpp index a6d01900..272285d7 100644 --- a/src/hasp/hasp_task.cpp +++ b/src/hasp/hasp_task.cpp @@ -24,6 +24,10 @@ void task_every_second_cb(lv_task_t* task) { haspEverySecond(); // sleep timer & statusupdate +#if HASP_MQTT_TELNET > 0 + mqttEverySecond(); +#endif + #if HASP_USE_TELNET > 0 telnetEverySecond(); #endif diff --git a/src/main.cpp b/src/main.cpp index b065909c..c68c2bf4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -210,6 +210,10 @@ IRAM_ATTR void loop() /* Runs Every Second */ haspEverySecond(); // sleep timer & statusupdate +#if HASP_USE_MQTT > 0 + mqttEverySecond(); +#endif + #if HASP_USE_FTP > 0 ftpEverySecond(); #endif diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index f5d57196..89ced6c1 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -18,6 +18,7 @@ typedef enum { void mqttSetup(); IRAM_ATTR void mqttLoop(); +void mqttEverySecond(); void mqttEvery5Seconds(bool wifiIsConnected); void mqttStart(); void mqttStop(); diff --git a/src/mqtt/hasp_mqtt_esp.cpp b/src/mqtt/hasp_mqtt_esp.cpp index 453d3a33..8864c107 100644 --- a/src/mqtt/hasp_mqtt_esp.cpp +++ b/src/mqtt/hasp_mqtt_esp.cpp @@ -71,7 +71,7 @@ bool last_mqtt_state = false; bool current_mqtt_state = false; uint16_t mqtt_reconnect_counter = 0; -void mqtt_run_scripts() +static inline void mqtt_run_scripts() { if(last_mqtt_state != current_mqtt_state) { // mqtt_message_t data; @@ -104,8 +104,8 @@ void mqtt_run_scripts() void mqtt_disconnected() { current_mqtt_state = false; // now we are disconnected - // mqtt_run_scripts(); mqtt_reconnect_counter++; + // mqtt_run_scripts(); // must happen in LVGL loop } void mqtt_connected() @@ -115,7 +115,7 @@ void mqtt_connected() current_mqtt_state = true; // now we are connected LOG_VERBOSE(TAG_MQTT, F("%s"), current_mqtt_state ? PSTR(D_SERVICE_CONNECTED) : PSTR(D_SERVICE_DISCONNECTED)); } - // mqtt_run_scripts(); + // mqtt_run_scripts(); // must happen in LVGL loop } int mqttPublish(const char* topic, const char* payload, size_t len, bool retain) @@ -337,7 +337,7 @@ String mqttGetTopic(Preferences preferences, String subtopic, String key, String } */ -void mqttParseTopic(String *topic, String subtopic, bool add_slash) +void mqttParseTopic(String* topic, String subtopic, bool add_slash) { topic->replace(F("%hostname%"), haspDevice.get_hostname()); @@ -509,10 +509,14 @@ IRAM_ATTR void mqttLoop(void) } } -void mqttEvery5Seconds(bool networkIsConnected) +void mqttEverySecond() { mqtt_run_scripts(); - // if(mqttEnabled && networkIsConnected && !mqttClientConnected) { +} + +void mqttEvery5Seconds(bool networkIsConnected) +{ + // if(mqttEnabled && networkIsConnected && !current_mqtt_state) { // LOG_TRACE(TAG_MQTT, F(D_MQTT_RECONNECTING)); // mqttStart(); // } @@ -535,7 +539,7 @@ void mqttStart() nvsOldGroup += preferences.getString(FP_CONFIG_GROUP, MQTT_GROUPNAME); nvsOldGroup += "/%topic%"; - subtopic = F(MQTT_TOPIC_COMMAND); + subtopic = F(MQTT_TOPIC_COMMAND); mqttNodeCommandTopic = preferences.getString(FP_CONFIG_NODE_TOPIC, MQTT_DEFAULT_NODE_TOPIC); mqttParseTopic(&mqttNodeCommandTopic, subtopic, false); mqttGroupCommandTopic = preferences.getString(FP_CONFIG_GROUP_TOPIC, nvsOldGroup.c_str()); diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index 6c4e35f2..fe1c0d47 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -3,8 +3,6 @@ /* Multi threaded asynchronous paho client */ -#include - #include "hasp_conf.h" #if HASP_USE_MQTT_ASYNC > 0 diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 29e11b2f..9acd5ce8 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -14,10 +14,10 @@ #if defined(ARDUINO_ARCH_ESP32) #include -#include +// #include WiFiClient mqttNetworkClient; // WiFiClientSecure mqttNetworkClient; -extern const uint8_t rootca_crt_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); +// extern const uint8_t rootca_crt_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); #elif defined(ARDUINO_ARCH_ESP8266) #include #include From f175dc599aa2741141d946439fc1410670837f17 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 21:58:15 +0200 Subject: [PATCH 047/142] Prepare LVFS support for /sdcard --- include/lv_conf_v7.h | 4 ++-- lib/lv_fs_if/lv_fs_if.c | 18 ++++++++++++++---- lib/lv_fs_if/lv_fs_pc.c | 28 ++++++++++------------------ user_setups/esp32/_esp32.ini | 2 +- user_setups/esp32s2/_esp32s2.ini | 2 +- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/include/lv_conf_v7.h b/include/lv_conf_v7.h index 764be7bd..606203cc 100644 --- a/include/lv_conf_v7.h +++ b/include/lv_conf_v7.h @@ -211,7 +211,7 @@ typedef void* lv_group_user_data_t; #define LV_USE_FILESYSTEM 1 #if LV_USE_FILESYSTEM /*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/ -typedef void* lv_fs_drv_user_data_t; +typedef const char* lv_fs_drv_user_data_t; /*File system interface*/ #ifndef LV_USE_FS_IF @@ -229,7 +229,7 @@ typedef void* lv_fs_drv_user_data_t; //# define LV_FS_IF_SPIFFS '\0' // no internal esp Flash #endif #endif /*LV_USE_FS_IF*/ -#if HASP_TARGET_ARDUINO +#if HASP_TARGET_ARDUINO && !defined(LV_FS_PC_PATH) #define LV_FS_PC_PATH "/littlefs" #endif diff --git a/lib/lv_fs_if/lv_fs_if.c b/lib/lv_fs_if/lv_fs_if.c index 472edcf2..45c94def 100644 --- a/lib/lv_fs_if/lv_fs_if.c +++ b/lib/lv_fs_if/lv_fs_if.c @@ -14,6 +14,13 @@ /********************* * DEFINES *********************/ +#ifndef LV_FS_PC_PATH +#ifndef WIN32 +#define LV_FS_PC_PATH "./" /*Project root*/ +#else +#define LV_FS_PC_PATH ".\\" /*Project root*/ +#endif +#endif /*LV_FS_PATH*/ /********************** * TYPEDEFS @@ -26,8 +33,8 @@ void lv_fs_if_fatfs_init(void); #endif -#if LV_FS_IF_PC != '\0' -void lv_fs_if_pc_init(void); +#if LV_FS_IF_PC != '\0' || LV_FS_IF_SD != '\0' +void lv_fs_if_pc_init(char letter, const char* path); #endif /********************** @@ -48,13 +55,16 @@ void lv_fs_if_pc_init(void); void lv_fs_if_init(void) { #if LV_FS_IF_FATFS != '\0' - lv_fs_if_fatfs_init(); + lv_fs_if_fatfs_init(); #endif #if LV_FS_IF_PC != '\0' - lv_fs_if_pc_init(); + lv_fs_if_pc_init(LV_FS_IF_PC, LV_FS_PC_PATH); #endif +#if LV_FS_IF_SD != '\0' + lv_fs_if_pc_init(LV_FS_IF_SD, LV_FS_SD_PATH); +#endif } /********************** diff --git a/lib/lv_fs_if/lv_fs_pc.c b/lib/lv_fs_if/lv_fs_pc.c index 02aa1a41..b83e1ac3 100644 --- a/lib/lv_fs_if/lv_fs_pc.c +++ b/lib/lv_fs_if/lv_fs_pc.c @@ -19,17 +19,6 @@ #include #endif -/********************* - * DEFINES - *********************/ -#ifndef LV_FS_PC_PATH -#ifndef WIN32 -#define LV_FS_PC_PATH "./" /*Projet root*/ -#else -#define LV_FS_PC_PATH ".\\" /*Projet root*/ -#endif -#endif /*LV_FS_PATH*/ - /********************** * TYPEDEFS **********************/ @@ -77,7 +66,7 @@ static lv_fs_res_t fs_dir_close(lv_fs_drv_t* drv, void* dir_p); /** * Register a driver for the File system interface */ -void lv_fs_if_pc_init(void) +void lv_fs_if_pc_init(char letter, const char* path) { /*--------------------------------------------------- * Register the file system interface in LittlevGL @@ -107,6 +96,8 @@ void lv_fs_if_pc_init(void) fs_drv.dir_open_cb = fs_dir_open; fs_drv.dir_read_cb = fs_dir_read; + fs_drv.user_data = LV_FS_PC_PATH; + lv_fs_drv_register(&fs_drv); // char cur_path[512] = ""; @@ -145,10 +136,10 @@ static lv_fs_res_t fs_open(lv_fs_drv_t* drv, void* file_p, const char* path, lv_ #ifndef WIN32 char buf[256]; - sprintf(buf, LV_FS_PC_PATH "/%s", path); + sprintf(buf, "%s/%s", drv->user_data, path); #else char buf[256]; - sprintf(buf, LV_FS_PC_PATH "\\%s", path); + sprintf(buf, "%s\\%s", drv->user_data, path); #endif LV_LOG_USER(buf); @@ -255,6 +246,7 @@ static lv_fs_res_t fs_size(lv_fs_drv_t* drv, void* file_p, uint32_t* size_p) return LV_FS_RES_OK; } + /** * Give the position of the read write pointer * @param drv pointer to a driver where this function belongs @@ -318,8 +310,8 @@ static lv_fs_res_t fs_rename(lv_fs_drv_t* drv, const char* oldname, const char* static char new[512]; static char old[512]; - sprintf(old, LV_FS_PC_PATH "/%s", oldname); - sprintf(new, LV_FS_PC_PATH "/%s", newname); + sprintf(old, "%s/%s", drv->user_data, oldname); + sprintf(new, "%s/%s", drv->user_data, newname); int r = rename(old, new); @@ -365,7 +357,7 @@ static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path) #ifndef WIN32 /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; - sprintf(buf, LV_FS_PC_PATH "/%s", path); + sprintf(buf, "%s/%s", drv->user_data, path); if((d = opendir(buf)) == NULL) { return LV_FS_RES_FS_ERR; } else { @@ -380,7 +372,7 @@ static lv_fs_res_t fs_dir_open(lv_fs_drv_t* drv, void* dir_p, const char* path) /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; - sprintf(buf, LV_FS_PC_PATH "\\%s\\*", path); + sprintf(buf, "%s\\%s\\*", drv->user_data, path); strcpy(next_fn, ""); d = FindFirstFile(buf, &fdata); diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini index 780997e5..93079589 100644 --- a/user_setups/esp32/_esp32.ini +++ b/user_setups/esp32/_esp32.ini @@ -45,7 +45,7 @@ build_flags = -D LV_ATTRIBUTE_FAST_MEM=IRAM_ATTR -D LV_ATTRIBUTE_TASK_HANDLER=IRAM_ATTR -D LV_USE_FS_IF=1 - ;-D LV_FS_PC_PATH="//littlefs" ; this needs to match the vfs mount pount + -D LV_FS_PC_PATH='"/littlefs"' ; this needs to match the vfs mount pount ; -- ArduinoJson build options ---------------------------- -D ARDUINOJSON_ENABLE_PROGMEM=1 ; for PROGMEM arguments ; -- tft_espi build options ------------------------ diff --git a/user_setups/esp32s2/_esp32s2.ini b/user_setups/esp32s2/_esp32s2.ini index 0cfc0156..7b042521 100644 --- a/user_setups/esp32s2/_esp32s2.ini +++ b/user_setups/esp32s2/_esp32s2.ini @@ -15,7 +15,7 @@ build_flags = -D LV_ATTRIBUTE_FAST_MEM= -D LV_ATTRIBUTE_TASK_HANDLER=IRAM_ATTR -D LV_USE_FS_IF=1 - ;-D LV_FS_PC_PATH="//littlefs" ; this needs to match the vfs mount pount + -D LV_FS_PC_PATH='"/littlefs"' ; this needs to match the vfs mount pount ; -- ArduinoJson build options ---------------------------- -D ARDUINOJSON_ENABLE_PROGMEM=1 ; for PROGMEM arguments ; -- tft_espi build options ------------------------ From b118e5624531d85e071ff8a55c15f53e1192118d Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 22:06:17 +0200 Subject: [PATCH 048/142] Fix for lv_fs_if_pc_init --- lib/lv_fs_if/lv_fs_pc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/lv_fs_if/lv_fs_pc.c b/lib/lv_fs_if/lv_fs_pc.c index b83e1ac3..cca7afbd 100644 --- a/lib/lv_fs_if/lv_fs_pc.c +++ b/lib/lv_fs_if/lv_fs_pc.c @@ -78,7 +78,7 @@ void lv_fs_if_pc_init(char letter, const char* path) /*Set up fields...*/ fs_drv.file_size = sizeof(file_t); - fs_drv.letter = LV_FS_IF_PC; + fs_drv.letter = letter; fs_drv.open_cb = fs_open; fs_drv.close_cb = fs_close; fs_drv.read_cb = fs_read; @@ -96,7 +96,7 @@ void lv_fs_if_pc_init(char letter, const char* path) fs_drv.dir_open_cb = fs_dir_open; fs_drv.dir_read_cb = fs_dir_read; - fs_drv.user_data = LV_FS_PC_PATH; + fs_drv.user_data = path; lv_fs_drv_register(&fs_drv); From 944f92e588b9ca9fb5c177d0b253d386a788df8b Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 24 May 2024 22:18:57 +0200 Subject: [PATCH 049/142] Add mqttEverySecond --- src/mqtt/hasp_mqtt_paho_async.cpp | 7 +++++-- src/mqtt/hasp_mqtt_paho_single.cpp | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index fe1c0d47..28b81d10 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -45,7 +45,7 @@ const char FP_CONFIG_GROUP[] PROGMEM = "group"; #include "hasp_mqtt.h" // functions to implement here #include "hasp/hasp_dispatch.h" // for dispatch_topic_payload -#include "hasp_debug.h" // for logging +#include "hasp_debug.h" // for logging #if !defined(_WIN32) #include @@ -436,7 +436,10 @@ void mqttSetup() mqttLwtTopic += MQTT_TOPIC_LWT; } -IRAM_ATTR void mqttLoop(){}; +IRAM_ATTR void mqttLoop() {}; + +void mqttEverySecond() +{} void mqttEvery5Seconds(bool wifiIsConnected) { diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index 653a884f..50044044 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -391,6 +391,9 @@ IRAM_ATTR void mqttLoop() if(rc == MQTTCLIENT_SUCCESS && message) mqtt_message_arrived(mqtt_client, topicName, topicLen, message); }; +void mqttEverySecond() +{} + void mqttEvery5Seconds(bool wifiIsConnected) { if(!mqttIsConnected()) { From 57207c7119cfc7c3ad5ee4d4723eb956480cdd10 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 27 May 2024 17:11:00 +0200 Subject: [PATCH 050/142] Update ace.js to 1.34.2 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 4d1ccace..41bcd04b 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index e9705de1..da51ed7d 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From c4217a92e893ee7f9d57438220647998639b5bde Mon Sep 17 00:00:00 2001 From: adampr1 Date: Thu, 30 May 2024 17:12:30 +0200 Subject: [PATCH 051/142] Add support for Waveshare ESP32-S3-Touch-LCD-4.3 Add suppor for ws_esp32_s3_touch_lcd_4p3 from post https://github.com/HASwitchPlate/openHASP/discussions/602 --- platformio_override-template.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio_override-template.ini b/platformio_override-template.ini index 69a865c2..c3791ae8 100644 --- a/platformio_override-template.ini +++ b/platformio_override-template.ini @@ -78,6 +78,7 @@ extra_default_envs = ; wt-86-32-3zw1 ; yeacreate-nscreen32 ; wz2432r028 + ; ws_esp32_s3_touch_lcd_4p3 ;endregion ;region -- Define your local COM ports for each environment --- From 91074746039acdb7e90b5ac58988ffd3c0ea090e Mon Sep 17 00:00:00 2001 From: adampr1 Date: Thu, 30 May 2024 17:14:42 +0200 Subject: [PATCH 052/142] Add support for Waveshare ESP32-S3-Touch-LCD-4.3 Add support for Waveshare ESP32-S3-Touch-LCD-4.3 from https://github.com/HASwitchPlate/openHASP/discussions/602 --- .../esp32s3/ws_esp32_s3_touch_lcd_4p3.ini | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 user_setups/esp32s3/ws_esp32_s3_touch_lcd_4p3.ini diff --git a/user_setups/esp32s3/ws_esp32_s3_touch_lcd_4p3.ini b/user_setups/esp32s3/ws_esp32_s3_touch_lcd_4p3.ini new file mode 100644 index 00000000..fd766e4a --- /dev/null +++ b/user_setups/esp32s3/ws_esp32_s3_touch_lcd_4p3.ini @@ -0,0 +1,86 @@ +;***************************************************; +; Waveshare ESP32-S3-Touch-LCD-4.3 ; +; - 16-bit RGB TFT ; +; - GT911 touch controller ; +;***************************************************; + + +[ws_esp32_s3_touch] +extends = arduino_esp32s3_v2, flash_8mb +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi + +build_flags = + ${arduino_esp32s3_v2.build_flags} + ${esp32s3.ps_ram} + ;-DARDUINO_USB_CDC_ON_BOOT + ;-DUSE_USB_CDC_CONSOLE + +;region -- ArduinoGFX build options ------------------------ + -D HASP_USE_ARDUINOGFX=1 + -D HASP_LV_USE_SW_ROTATE=1 +;endregion + +lib_deps = + ${arduino_esp32s3_v2.lib_deps} + ${arduinogfx.lib_deps} + Arduino_RPi_DPI_RGBPanel_mod + ${goodix.lib_deps} + +[env:ws_esp32_s3_touch_lcd_4p3] +extends = ws_esp32_s3_touch + +build_flags = + -D HASP_MODEL="Waveshare ESP32-S3-Touch-LCD-4.3" + ${ws_esp32_s3_touch.build_flags} + ; Bus Settings + -D LV_VDB_SIZE=76800 ; 10% of full framebuffer + -D TFT_WIDTH=800 + -D TFT_HEIGHT=480 + -D TFT_DE=5 + -D TFT_VSYNC=3 + -D TFT_HSYNC=46 + -D TFT_PCLK=7 + -D TFT_B0=14 + -D TFT_B1=38 + -D TFT_B2=18 + -D TFT_B3=17 + -D TFT_B4=10 + -D TFT_G0=39 + -D TFT_G1=0 + -D TFT_G2=45 + -D TFT_G3=48 + -D TFT_G4=47 + -D TFT_G5=21 + -D TFT_R0=1 + -D TFT_R1=2 + -D TFT_R2=42 + -D TFT_R3=41 + -D TFT_R4=40 + -D TFT_BCKL=6 ; use GPIO06 as backlight PIN + ; Panel Settings + -D TFT_HSYNC_POLARITY=0 + -D TFT_HSYNC_FRONT_PORCH=20 ; Maximum HSYNC Front Porch + -D TFT_HSYNC_PULSE_WIDTH=10 ; Typical HSYNC Pulse Width + -D TFT_HSYNC_BACK_PORCH=10 ; Typical HSYNC Back Porch + -D TFT_VSYNC_POLARITY=0 + -D TFT_VSYNC_FRONT_PORCH=10 ; Maximum VSYNC Front Porch + -D TFT_VSYNC_PULSE_WIDTH=10 ; Typical VSYNC Pulse Width + -D TFT_VSYNC_BACK_PORCH=10 ; Typical VSYNC Back Porch + -D TFT_PCLK_ACTIVE_NEG=0 + -D TFT_PREFER_SPEED=14000000 ; 1/2 of Typical DCLK Frequency + -D TFT_AUTO_FLUSH=1 + ; Touch Settings + -D TOUCH_WIDTH=800 + -D TOUCH_HEIGHT=480 + -D TOUCH_DRIVER=0x911 + -D TOUCH_SCL=9 + -D TOUCH_SDA=8 + -D TOUCH_IRQ=-1 + -D TOUCH_RST=-1 + -D I2C_TOUCH_ADDRESS=0x5d ; or 0x5D + -D I2C_TOUCH_FREQUENCY=400000 + -D BACKLIGHT_FREQUENCY=1000 ;adopted frerquency for MP3302DJ-LF-Z (200 to 1000Hz) ->higher is better for sound! +lib_deps = + ${sunton-esp32-s3-tft.lib_deps} + ${goodix.lib_deps} From 94ceaf2cf132d1e1bef4b231ecac40f99779a9a6 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Fri, 14 Jun 2024 00:03:26 +0100 Subject: [PATCH 053/142] Was a mistake to hide TFT_BCKL gpio pin from the user. On some boards, it can be reassigned by the user (on others, it is baked in to the hardware). --- src/drv/tft/tft_driver_arduinogfx.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index f9fc214f..4bc12004 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -296,9 +296,6 @@ bool ArduinoGfx::is_driver_pin(uint8_t pin) #ifdef TFT_HSYNC || (pin == TFT_HSYNC) #endif -#ifdef TFT_BCKL - || (pin == TFT_BCKL) -#endif #ifdef TFT_RST || (pin == TFT_RST) #endif From 20256b2953bf58edb07fc3e5a00e4e0bb6b9d97b Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 18 Jul 2024 20:03:07 +0200 Subject: [PATCH 054/142] Update ace.js to v1.35.3 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 41bcd04b..1a112286 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index da51ed7d..93a1d96d 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.34.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 89ef57346a8f8aa51df4b243f8cba9f224cda2a4 Mon Sep 17 00:00:00 2001 From: FreeBear Date: Fri, 19 Jul 2024 15:20:11 +0100 Subject: [PATCH 055/142] TFT_G5 was missing from the list of used GPIO pins. Add the USB TX/RX pins to the list for the Guition ESP32-S3 4848S040 board. --- src/drv/tft/tft_driver_arduinogfx.cpp | 9 +++++++++ user_setups/esp32s3/esp32-s3-4848S040.ini | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 4bc12004..a1cc3c89 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -335,6 +335,9 @@ bool ArduinoGfx::is_driver_pin(uint8_t pin) #ifdef TFT_G4 || (pin == TFT_G4) #endif +#ifdef TFT_G5 + || (pin == TFT_G5) +#endif #ifdef TFT_B0 || (pin == TFT_B0) #endif @@ -361,6 +364,12 @@ bool ArduinoGfx::is_driver_pin(uint8_t pin) #endif #ifdef TOUCH_IRQ || (pin == TOUCH_IRQ) +#endif +#ifdef USB_TXD + || (pin == USB_TXD) +#endif +#ifdef USB_RXD + || (pin == USB_RXD) #endif ) { return true; diff --git a/user_setups/esp32s3/esp32-s3-4848S040.ini b/user_setups/esp32s3/esp32-s3-4848S040.ini index 95c800ac..27d89050 100644 --- a/user_setups/esp32s3/esp32-s3-4848S040.ini +++ b/user_setups/esp32s3/esp32-s3-4848S040.ini @@ -76,6 +76,10 @@ build_flags = -D I2C_TOUCH_FREQUENCY=400000 -D I2C_TOUCH_ADDRESS=0x5D ; or 0x14 -D I2C_TOUCH_PORT=1 + ; USB GPIO - Only need to define these so that the pins do not + ; show up in the list of available GPIO + -D USB_TXD=43 + -D USB_RXD=44 ;endregion lib_deps = From 0b30b075fa806b13ceeff7058654d41745e7685c Mon Sep 17 00:00:00 2001 From: FreeBear Date: Fri, 19 Jul 2024 16:15:45 +0100 Subject: [PATCH 056/142] Move USB_TXD/RXD to is_system_pin() --- src/drv/tft/tft_driver_arduinogfx.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index a1cc3c89..ae73d504 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -364,12 +364,6 @@ bool ArduinoGfx::is_driver_pin(uint8_t pin) #endif #ifdef TOUCH_IRQ || (pin == TOUCH_IRQ) -#endif -#ifdef USB_TXD - || (pin == USB_TXD) -#endif -#ifdef USB_RXD - || (pin == USB_RXD) #endif ) { return true; From 734f11d3d8596d43d889fc60958346067ac5c385 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 22 Jul 2024 16:44:12 +0200 Subject: [PATCH 057/142] Update ace?js to v1.35.4 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 1a112286..c0a35dc2 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 93a1d96d..afd735c2 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.4")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 348852476ddc87aa14776b64eb8b2439654b7433 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 23 Jul 2024 22:28:36 +0200 Subject: [PATCH 058/142] Use "event" group for pushbuttons in discovery { --- src/hasp/hasp_dispatch.cpp | 44 ++++++++++++++++++++++++++++++++++---- src/sys/gpio/hasp_gpio.cpp | 8 +++++-- src/sys/gpio/hasp_gpio.h | 2 +- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 72c6b4f0..33cffc77 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -868,10 +868,45 @@ void dispatch_run_script(const char*, const char* payload, uint8_t source) #endif } -void dispatch_dir(const char*, const char* payload, uint8_t source) +/* +void dispatch_fs(const char*, const char* payload, uint8_t source) { - filesystem_list_path(payload); + StaticJsonDocument<512> json; + + // Note: Deserialization needs to be (const char *) so the objects WILL be copied + // this uses more memory but otherwise the mqtt receive buffer can get overwritten by the send buffer !! + DeserializationError jsonError = deserializeJson(json, payload); + // json.shrinkToFit(); + + if(!jsonError && json.is()) { // Only JsonObject is valid + JsonVariant action; + + const char* cmd = json["cmd"].as(); + const char* src = json["src"].as(); + const char* dst = json["dst"].as(); + int res = 0; + + if(String(cmd) == "stat") { + res = filesystem_vfs_file_exists(src); + } + if(String(cmd) == "rm") { + res = filesystem_vfs_delete_file(src); + } + if(String(cmd) == "cp") { + res = filesystem_vfs_copy_file(src, dst); + } + if(String(cmd) == "ls") { + filesystem_list_path(src); + } + + if(res) { + LOG_WARNING(TAG_MSGR, "Succes"); + } else { + LOG_WARNING(TAG_MSGR, "Failed"); + } + } } +*/ #if HASP_TARGET_PC static void shell_command_thread(char* cmdline) @@ -1327,9 +1362,10 @@ void dispatch_get_discovery_data(JsonDocument& doc) JsonArray relay = doc.createNestedArray(F("power")); JsonArray led = doc.createNestedArray(F("light")); JsonArray dimmer = doc.createNestedArray(F("dim")); + JsonArray event = doc.createNestedArray(F("event")); #if HASP_USE_GPIO > 0 - gpio_discovery(input, relay, led, dimmer); + gpio_discovery(input, relay, led, dimmer, event); #endif } @@ -1601,7 +1637,7 @@ void dispatchSetup() dispatch_add_command(PSTR("sensors"), dispatch_send_sensordata); dispatch_add_command(PSTR("theme"), dispatch_theme); dispatch_add_command(PSTR("run"), dispatch_run_script); - dispatch_add_command(PSTR("dir"), dispatch_dir); + // dispatch_add_command(PSTR("fs"), dispatch_fs); #if HASP_TARGET_PC dispatch_add_command(PSTR("shell"), dispatch_shell_execute); #endif diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 0094f80b..69f1feb8 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -835,7 +835,7 @@ hasp_gpio_config_t gpioGetPinConfig(uint8_t num) return gpioConfig[num]; } -void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonArray& dimmer) +void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonArray& dimmer, JsonArray& event) { char description[20] = ""; @@ -848,6 +848,10 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA case hasp_gpio_type_t::POWER_RELAY: relay.add(gpioConfig[i].pin); break; + + case BUTTON ... TOUCH: + event.add(gpioConfig[i].pin); + break; case hasp_gpio_type_t::HASP_DAC: case hasp_gpio_type_t::LED: // Don't include the moodlight @@ -857,8 +861,8 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA dimmer.add(gpioConfig[i].pin); break; + // case BUTTON ... TOUCH: case SWITCH: - case BUTTON ... TOUCH: strcpy_P(description, PSTR("none")); break; case BATTERY: diff --git a/src/sys/gpio/hasp_gpio.h b/src/sys/gpio/hasp_gpio.h index df093048..105f4460 100644 --- a/src/sys/gpio/hasp_gpio.h +++ b/src/sys/gpio/hasp_gpio.h @@ -47,7 +47,7 @@ bool gpio_set_pin_state(uint8_t pin, bool power, int32_t val); void gpio_set_moodlight(moodlight_t& moodlight); -void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonArray& dimmer); +void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonArray& dimmer, JsonArray& event); bool gpioSavePinConfig(uint8_t config_num, uint8_t pin, uint8_t type, uint8_t group, uint8_t pinfunc, bool inverted); bool gpioIsSystemPin(uint8_t gpio); From 31572ef9d05722ae53ec72ec57f3b6c1150917fb Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 23 Jul 2024 22:44:50 +0200 Subject: [PATCH 059/142] Add "event" key to discovery message for push button events --- src/sys/gpio/hasp_gpio.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 69f1feb8..693eec7b 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -954,8 +954,8 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA strcpy_P(description, PSTR("unknown")); } - if((gpioConfig[i].type >= hasp_gpio_type_t::SWITCH && gpioConfig[i].type <= hasp_gpio_type_t::WINDOW) || - (gpioConfig[i].type >= hasp_gpio_type_t::BUTTON && gpioConfig[i].type <= hasp_gpio_type_t::TOUCH)) { + if((gpioConfig[i].type >= hasp_gpio_type_t::SWITCH && gpioConfig[i].type <= hasp_gpio_type_t::WINDOW)) { + // || (gpioConfig[i].type >= hasp_gpio_type_t::BUTTON && gpioConfig[i].type <= hasp_gpio_type_t::TOUCH)) { JsonArray arr = input[description]; if(arr.isNull()) arr = input.createNestedArray(description); arr.add(gpioConfig[i].pin); From 1ffa7b86368257408199e7e6980a0b3d862c5ff8 Mon Sep 17 00:00:00 2001 From: yetanothercarbot <55005345+yetanothercarbot@users.noreply.github.com> Date: Tue, 30 Jul 2024 17:56:00 +1000 Subject: [PATCH 060/142] ESP32-S3-BOX-3 support finalised --- user_setups/esp32s3/esp-box.ini | 47 +++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/user_setups/esp32s3/esp-box.ini b/user_setups/esp32s3/esp-box.ini index aff0848e..31899248 100644 --- a/user_setups/esp32s3/esp-box.ini +++ b/user_setups/esp32s3/esp-box.ini @@ -4,20 +4,19 @@ ; - TT21100 touch controller ; ;***************************************************; -[env:esp-box] +[esp_box] extends = arduino_esp32s3_v2, flash_16mb -board = esp32s3box +board = esp32-s3-devkitc-1 ; setting board to 'esp32s3box' breaks ESP32-S3-BOX-3 sadly as that overrides the TFT_RST parameter. board_build.arduino.memory_type = qio_opi build_flags = - -D HASP_MODEL="ESP-BOX" ${arduino_esp32s3_v2.build_flags} ${esp32s3.ps_ram} -;region -- TFT_eSPI build options ------------------------ +;region -- display build options ------------------------ -D LGFX_USE_V1=1 -D HASP_USE_LGFX_TOUCH=1 - -D TOUCH_DRIVER=0x21100 + -D ILI9341_DRIVER=1 -D INVERT_COLORS=0 -D TFT_ROTATION=2 @@ -25,21 +24,47 @@ build_flags = -D TFT_HEIGHT=240 -D TOUCH_SDA=8 -D TOUCH_SCL=18 - -D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy, 2=invert x, 4=inverty -D TOUCH_IRQ=3 -D I2C_TOUCH_FREQUENCY=400000 - -D I2C_TOUCH_PORT=1 - -D I2C_TOUCH_ADDRESS=0x24 -D TFT_DC=4 -D TFT_CS=5 -D TFT_MOSI=6 + -D TFT_MISO=-1 -D TFT_SCLK=7 - -D TFT_RST=48 - -D TFT_BCKL=45 -D SPI_FREQUENCY=40000000 + ; -D SERIAL_SPEED=-1 ;endregion lib_deps = ${arduino_esp32s3_v2.lib_deps} ${lovyangfx.lib_deps} - ${tft_espi.lib_deps} + + +[env:esp32-s3-box] +extends = esp_box + +build_flags = + -D HASP_MODEL="ESP32-S3-BOX" + ${esp_box.build_flags} + + -D TOUCH_DRIVER=0x21100 + -D I2C_TOUCH_ADDRESS=0x24 + -D I2C_TOUCH_PORT=1 + -D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy axis (rotate), 2=invert x, 4=inverty + -D TFT_BCKL=45 + -D TFT_RST=48 + +; GPIO1 for mute status +[env:esp32-s3-box-3] +extends = esp_box + +build_flags = + -D HASP_MODEL="ESP32-S3-BOX-3" + ${esp_box.build_flags} + + -D TOUCH_DRIVER=0x911 + -D I2C_TOUCH_ADDRESS=0x14 + -D I2C_TOUCH_PORT=0 + -D TOUCH_OFFSET_ROTATION=2 ; 1=swap xy axis (rotate), 2=invert x, 4=inverty + -D TFT_BCKL=47 + -D TFT_RST=-1 \ No newline at end of file From 8b173815c9dd545fcd64ae642d31fe60bda6cb61 Mon Sep 17 00:00:00 2001 From: GiorgioAresu Date: Sun, 11 Aug 2024 22:37:28 +0200 Subject: [PATCH 061/142] Add devcontainer configuration --- .devcontainer/devcontainer.json | 35 ++++++++++++++++++++++++++++++++ .github/dependabot.yml | 12 +++++++++++ platformio_override-template.ini | 5 ++++- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/dependabot.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..505ce0d9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,35 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu +{ + "name": "Ubuntu", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:jammy", + + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/python:1": {} + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.cpptools", + "platformio.platformio-ide" + ] + } + }, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" + + // Allow uploading to device + "mounts": ["type=bind,source=/dev/bus/usb,target=/dev/bus/usb"], + "runArgs": ["--privileged"] +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..f33a02cd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/platformio_override-template.ini b/platformio_override-template.ini index c3791ae8..97f2fbf0 100644 --- a/platformio_override-template.ini +++ b/platformio_override-template.ini @@ -22,7 +22,7 @@ build_flags = ;region -- Default Build Environments : Used when Build All --- extra_default_envs = - ; Uncomment specific environments or create extra: + ; Uncomment specific environments or create extra (copy names from square brackets in user_setups/*/*.ini): ; az-touch-mod-esp32_ili9341_4MB ; az-touch-mod-esp32_ili9341_8MB ; d1-mini-esp32_ili9341 @@ -64,6 +64,9 @@ extra_default_envs = ; makerfabs-tft35-cap_4MB ; makerfabs-tft-s2_ili9488 ; nodemcu32s-raspi + ; panlee-zw3d95ce01s-ar-4848_16MB + ; panlee-zw3d95ce01s-tr-4848_16MB + ; panlee-zw3d95ce01s-ur-4848_16MB ; s2-mini-esp32s2_ili9341 ; ttgo_esp32_poe-ili9341 ; lilygo-lily-pi_ili9481 From be7eba0191f94fd1420d0cb7d778e7b9ea11791c Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 19 Aug 2024 18:49:58 +0200 Subject: [PATCH 062/142] Downgrade acejs to 1.35.3 #783 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index c0a35dc2..1a112286 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index afd735c2..93a1d96d 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.4")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From e6eae8b39180ab6d5bec53fade06fdecda84d104 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 22 Aug 2024 14:29:40 +0200 Subject: [PATCH 063/142] Add retain flag to mqtt_send_state #781 --- src/mqtt/hasp_mqtt.h | 2 +- src/mqtt/hasp_mqtt_esp.cpp | 4 ++-- src/mqtt/hasp_mqtt_paho_async.cpp | 4 ++-- src/mqtt/hasp_mqtt_paho_single.cpp | 4 ++-- src/mqtt/hasp_mqtt_pubsubclient.cpp | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index 89ced6c1..5aba7497 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -24,7 +24,7 @@ void mqttStart(); void mqttStop(); // int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload); -int mqtt_send_state(const char* subtopic, const char* payload); +int mqtt_send_state(const char* subtopic, const char* payload, bool retain=false); int mqtt_send_discovery(const char* payload, size_t len); int mqttPublish(const char* topic, const char* payload, size_t len, bool retain); diff --git a/src/mqtt/hasp_mqtt_esp.cpp b/src/mqtt/hasp_mqtt_esp.cpp index 8864c107..f19f3c5d 100644 --- a/src/mqtt/hasp_mqtt_esp.cpp +++ b/src/mqtt/hasp_mqtt_esp.cpp @@ -165,7 +165,7 @@ bool mqtt_send_lwt(bool online) // return mqttPublish(tmp_topic, payload, false); // } -int mqtt_send_state(const char* subtopic, const char* payload) +int mqtt_send_state(const char* subtopic, const char* payload, bool retain) { String tmp_topic((char*)0); tmp_topic.reserve(128); @@ -174,7 +174,7 @@ int mqtt_send_state(const char* subtopic, const char* payload) // tmp_topic += "/"; tmp_topic += subtopic; - return mqttPublish(tmp_topic.c_str(), payload, false); + return mqttPublish(tmp_topic.c_str(), payload, retain); } int mqtt_send_discovery(const char* payload, size_t len) diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index 28b81d10..a75bb699 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -284,11 +284,11 @@ bool mqttIsConnected() return mqttConnected; // MQTTAsync_isConnected(mqtt_client); // <- deadlocking on Linux } -int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) +int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload, bool retain) { char tmp_topic[mqttNodeTopic.length() + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), ("%s" MQTT_TOPIC_STATE "/%s"), mqttNodeTopic.c_str(), subtopic); - return mqttPublish(tmp_topic, payload, strlen(payload), false); + return mqttPublish(tmp_topic, payload, strlen(payload), retain); } int mqtt_send_discovery(const char* payload, size_t len) diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index 50044044..2d1565b3 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -226,11 +226,11 @@ bool mqttIsConnected() return MQTTClient_isConnected(mqtt_client); } -int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) +int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload, bool retain) { char tmp_topic[mqttNodeTopic.length() + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), ("%s" MQTT_TOPIC_STATE "/%s"), mqttNodeTopic.c_str(), subtopic); - return mqttPublish(tmp_topic, payload, strlen(payload), false); + return mqttPublish(tmp_topic, payload, strlen(payload), retain); } int mqtt_send_discovery(const char* payload, size_t len) diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 9acd5ce8..84e2a2b5 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -117,11 +117,11 @@ bool mqtt_send_lwt(bool online) // return mqttPublish(tmp_topic, payload, false); // } -int mqtt_send_state(const char* subtopic, const char* payload) +int mqtt_send_state(const char* subtopic, const char* payload, bool retain) { char tmp_topic[strlen(mqttNodeTopic) + strlen(subtopic) + 16]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%s" MQTT_TOPIC_STATE "/%s"), mqttNodeTopic, subtopic); - return mqttPublish(tmp_topic, payload, false); + return mqttPublish(tmp_topic, payload, retain); } int mqtt_send_discovery(const char* payload, size_t len) From ca346e868f8b97fd409751aecc47162850bd8955 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 24 Aug 2024 20:00:05 +0200 Subject: [PATCH 064/142] Fix anti-burn when software rotation is enabled #764 --- src/hasp/hasp.cpp | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp index 35388570..4e0f4eef 100644 --- a/src/hasp/hasp.cpp +++ b/src/hasp/hasp.cpp @@ -217,11 +217,12 @@ void hasp_antiburn_cb(lv_task_t* task) lv_obj_t* layer = lv_disp_get_layer_sys(NULL); if(layer) { // Fill a buffer with random colors - lv_color_t color[1223]; - size_t len = sizeof(color) / sizeof(color[0]); - for(size_t x = 0; x < len; x++) { + lv_color_t color[1223]; // prime + size_t max_len = sizeof(color) / sizeof(color[0]); + for(size_t x = 0; x < max_len; x++) { color[x].full = HASP_RANDOM(UINT16_MAX); } + max_len -= 64; // leave some headroom to randomize // list of possible draw widths; prime numbers combat recurring patterns on the screen uint8_t prime[] = {61, 67, 73, 79, 83, 89, 97, 103, 109, 113, 127, 131, 137, 139, 149, @@ -230,17 +231,27 @@ void hasp_antiburn_cb(lv_task_t* task) lv_disp_t* disp = lv_disp_get_default(); lv_disp_drv_t* disp_drv = &disp->driver; - lv_coord_t scr_h = lv_obj_get_height(layer) - 1; - lv_coord_t scr_w = lv_obj_get_width(layer) - 1; - lv_coord_t w = 487; // first prime larger than 480 + lv_coord_t scr_h; + lv_coord_t scr_w; + + if(disp_drv->sw_rotate) { + scr_w = disp_drv->hor_res - 1; // use hardware w + scr_h = disp_drv->ver_res - 1; // use hardware h + } else { + scr_w = lv_obj_get_width(layer) - 1; // use software w + scr_h = lv_obj_get_height(layer) - 1; // use software h + } + + lv_coord_t w = scr_w; // maximum screen width lv_area_t area; area.y1 = 0; while(area.y1 <= scr_h) { - if(w > scr_w) w = scr_w; // limit to the actual screenwidth - if(w > len) w = len; // don't overrun the buffer - lv_coord_t h = len / w; - size_t headroom = len % w; // additional bytes in the buffer that can be used for a random offset + if(w > scr_w) w = scr_w; // limit to the actual screenwidth + if(w > max_len) w = max_len; // don't overrun the buffer + lv_coord_t h = max_len / w; + size_t headroom = (sizeof(color) / sizeof(color[0])) - + (h * w); // additional bytes in the buffer that can be used for a random offset area.y2 = area.y1 + h - 1; if(area.y2 > scr_h) area.y2 = scr_h; @@ -255,16 +266,16 @@ void hasp_antiburn_cb(lv_task_t* task) area.x1 += w; } - w = prime[HASP_RANDOM(sizeof(prime))]; // new random width + w = prime[HASP_RANDOM(sizeof(prime) / sizeof(prime[0]))]; // new random width area.y1 += h; } } - if(task->repeat_count != 1) return; // don't stop yet - // task is about to get deleted - hasp_stop_antiburn(); - dispatch_state_antiburn(HASP_EVENT_OFF); + if(task->repeat_count == 1) { + hasp_stop_antiburn(); + dispatch_state_antiburn(HASP_EVENT_OFF); + } } /** From 401a134658bb55a374ff51f32e97a3c596ff5193 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 01:21:10 +0200 Subject: [PATCH 065/142] Add minifests to build step --- .github/workflows/build.yaml | 2 +- platformio.ini | 2 +- tools/esp_merge_bin.py | 51 ++++++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 64838bd1..ec5fbb22 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -101,7 +101,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: ${{ matrix.environment.out }} - path: build_output/firmware/*.bin + path: build_output/firmware/*.*n - name: Create release and upload firmware if: github.ref != 'refs/heads/master' run: | diff --git a/platformio.ini b/platformio.ini index a003dc93..90ddcee9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -75,7 +75,7 @@ build_flags = -D HASP_VER_MAJ=0 -D HASP_VER_MIN=7 ;-D HASP_VER_REV=4 - -D HASP_VER_REV=0-rc12 + -D HASP_VER_REV=0-rc13 ;-D HASP_VER_REV=4-rc1 ${override.build_flags} diff --git a/tools/esp_merge_bin.py b/tools/esp_merge_bin.py index 4c484f78..520f6c66 100644 --- a/tools/esp_merge_bin.py +++ b/tools/esp_merge_bin.py @@ -1,6 +1,5 @@ Import('env') -import os -import sys +import os, sys, json import shutil import subprocess import pkg_resources @@ -106,6 +105,53 @@ def copy_merge_bins(source, target, env): print(stdout.decode("utf-8") ) print(stderr.decode("utf-8") ) +def create_manifest(source, target, env): + short_version = 'v' + str(HASP_VER_MAJ) + '.' + str(HASP_VER_MIN) + '.' + str(HASP_VER_REV) + long_version = short_version + '_' + get_firmware_commit_hash() + name = str(target[0]).split(os.path.sep)[2] + name = name.replace('_4MB', '').replace('_8MB', '').replace('_16MB', '').replace('_32MB', '') + flash_size = env.GetProjectOption("board_upload.flash_size") + board = env.BoardConfig() + filename = "{}_full_{}_{}.json".format(name, flash_size, long_version) + output_json ="{}firmware{}{}".format(OUTPUT_DIR, os.path.sep, filename) + + data = {"name":"openHASP", "version": short_version, "home_assistant_domain": "openhasp", "funding_url": "https://ko-fi.com/openhasp", "new_install_prompt_erase": True, "builds": "d"} + builds = [] + parts = [] + parts.append({ "path": filename, "offset": 0 }) + + mcu = board.get("build.mcu", "esp32") + if (mcu == 'esp32'): + builds.append({ "chipFamily": "ESP32", "improv": False }) + elif (mcu == 'esp32s2'): + builds.append({ "chipFamily": "ESP32-S2", "improv": False }) + elif (mcu == 'esp32s3'): + builds.append({ "chipFamily": "ESP32-S3", "improv": False }) + elif (mcu == 'esp32c3'): + builds.append({ "chipFamily": "ESP32-C3", "improv": False }) + elif (mcu == 'esp32c6'): + builds.append({ "chipFamily": "ESP32-C6", "improv": False }) + builds[0]["parts"] = parts + data["builds"] = builds + json_data = json.dumps(data, indent=4, sort_keys=False) + print(json_data) + + # check if output directories exist and create if necessary + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + for d in ['firmware', 'map']: + if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)): + os.mkdir("{}{}".format(OUTPUT_DIR, d)) + + # check if new target files exist and remove if necessary + for f in [output_json]: + if os.path.isfile(f): + os.remove(f) + + with open(output_json, "w") as outfile: + outfile.write(json_data) + def copy_ota(source, target, env): version = 'v' + str(HASP_VER_MAJ) + '.' + str(HASP_VER_MIN) + '.' + str(HASP_VER_REV) + '_' + get_firmware_commit_hash() name =str(target[0]).split(os.path.sep)[2] @@ -135,4 +181,5 @@ def copy_ota(source, target, env): env.AddPreAction("$BUILD_DIR/${PROGNAME}.bin", [get_fw_version]) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [copy_merge_bins]) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [create_manifest]) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [copy_ota]) From 962b01d91f2a36c0bb21eb5d16307861ccce4aae Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 01:49:45 +0200 Subject: [PATCH 066/142] Update build.yaml --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ec5fbb22..d97220fb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -2,7 +2,7 @@ name: Build branch on: release: - types: [created] + types: [published] push: branches: - master From d6f3b52911503595f4dd351b2d9deae0c10057dc Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:05:57 +0200 Subject: [PATCH 067/142] Update asset upload on release --- .github/workflows/build.yaml | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d97220fb..52687e45 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -103,17 +103,22 @@ jobs: name: ${{ matrix.environment.out }} path: build_output/firmware/*.*n - name: Create release and upload firmware - if: github.ref != 'refs/heads/master' - run: | - set -x - assets=() - for asset in build_output/firmware/*.bin; do - assets+=("-a" "$asset") - done - tag_name="${GITHUB_REF##*/}" - hub release edit "${assets[@]}" -m "$tag_name" "$tag_name" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: AButler/upload-release-assets@v3.0 + with: + files: "build_output/firmware/*.bin" + repo-token: ${{ secrets.GITHUB_TOKEN }} + # - name: Create release and upload firmware + # if: github.ref != 'refs/heads/master' + # run: | + # set -x + # assets=() + # for asset in build_output/firmware/*.bin; do + # assets+=("-a" "$asset") + # done + # tag_name="${GITHUB_REF##*/}" + # hub release edit "${assets[@]}" -m "$tag_name" "$tag_name" + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} #- name: Create release and upload firmware # run: | # set -x From 1f01ece609266e08a2686454dfa89d6f1b2ed44c Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:12:32 +0200 Subject: [PATCH 068/142] Update release workflow --- .github/workflows/build.yaml | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 52687e45..de28675d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -102,34 +102,13 @@ jobs: with: name: ${{ matrix.environment.out }} path: build_output/firmware/*.*n - - name: Create release and upload firmware + - name: On Release, upload assets to that Release uses: AButler/upload-release-assets@v3.0 with: files: "build_output/firmware/*.bin" repo-token: ${{ secrets.GITHUB_TOKEN }} - # - name: Create release and upload firmware - # if: github.ref != 'refs/heads/master' - # run: | - # set -x - # assets=() - # for asset in build_output/firmware/*.bin; do - # assets+=("-a" "$asset") - # done - # tag_name="${GITHUB_REF##*/}" - # hub release edit "${assets[@]}" -m "$tag_name" "$tag_name" - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - #- name: Create release and upload firmware - # run: | - # set -x - # assets=() - # for asset in build_output/firmware/*.bin; do - # assets+=("-a" "$asset") - # done - # tag_name="${GITHUB_REF##*/}" - # hub release create "${assets[@]}" -m "$tag_name" "$tag_name" - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + linux_build: runs-on: ubuntu-latest steps: From 4e1663979401c5809a6754bdc054a10229c052e2 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:22:51 +0200 Subject: [PATCH 069/142] Zip atrifacts before release upload --- .github/workflows/build.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index de28675d..6a6bf8a1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -102,13 +102,16 @@ jobs: with: name: ${{ matrix.environment.out }} path: build_output/firmware/*.*n + ## Release only: + - name: Zip artifact for deployment + run: zip ${{ matrix.environment.out }}.zip "build_output/firmware/*.bin" -r - name: On Release, upload assets to that Release uses: AButler/upload-release-assets@v3.0 with: - files: "build_output/firmware/*.bin" + files: ${{ matrix.environment.out }}.zip repo-token: ${{ secrets.GITHUB_TOKEN }} - + linux_build: runs-on: ubuntu-latest steps: From 7053024146a669f249b9525241ef4f3eabf3d6ed Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:27:33 +0200 Subject: [PATCH 070/142] Upload assets only on release --- .github/workflows/build.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6a6bf8a1..185e3ae5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -104,8 +104,11 @@ jobs: path: build_output/firmware/*.*n ## Release only: - name: Zip artifact for deployment - run: zip ${{ matrix.environment.out }}.zip "build_output/firmware/*.bin" -r + if: github.ref != 'refs/heads/master' + run: | + zip ${{ matrix.environment.out }}.zip "build_output/firmware/*.bin" -r - name: On Release, upload assets to that Release + if: github.ref != 'refs/heads/master' uses: AButler/upload-release-assets@v3.0 with: files: ${{ matrix.environment.out }}.zip From 042fe057254706f9ac04ae842a948fa3fd236606 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:32:55 +0200 Subject: [PATCH 071/142] Update build.yaml zip step --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 185e3ae5..2353593d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -106,7 +106,7 @@ jobs: - name: Zip artifact for deployment if: github.ref != 'refs/heads/master' run: | - zip ${{ matrix.environment.out }}.zip "build_output/firmware/*.bin" -r + zip ${{ matrix.environment.out }}.zip build_output/firmware/*.bin -r - name: On Release, upload assets to that Release if: github.ref != 'refs/heads/master' uses: AButler/upload-release-assets@v3.0 From 08dd9c5004bea92f4a0bf9c380763c5d7d81bc4c Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 26 Aug 2024 02:47:24 +0200 Subject: [PATCH 072/142] Obsolete workflows --- .github/workflows/build_linux.yaml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_linux.yaml b/.github/workflows/build_linux.yaml index cd92d6be..5d081c18 100644 --- a/.github/workflows/build_linux.yaml +++ b/.github/workflows/build_linux.yaml @@ -1,4 +1,4 @@ -name: Build branch +name: Build Linux (Obsolete) on: workflow_dispatch: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ed1ce258..7464a8e3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ on: # types: [created] workflow_dispatch: -name: Create Release +name: Create Release (Obsolete) jobs: build: From 825f5c6da582596785ff919bc686174a478a2a73 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:44:50 +0200 Subject: [PATCH 073/142] New translations en.json (Spanish) --- data/es_ES.json | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/data/es_ES.json b/data/es_ES.json index 7df5c933..2bacf1cd 100644 --- a/data/es_ES.json +++ b/data/es_ES.json @@ -15,18 +15,18 @@ "theme": "Tema de IU", "color1": "Color Primario", "color2": "Color Secundario", - "pages": "Diseño inicial", + "pages": "Diseño Inicial", "font": "Fuente por Defecto", - "startpage": "Página inicial", - "startdim": "Brillo inicial" + "startpage": "Página de Inicio", + "startdim": "Brillo Inicial" }, "screenshot": { - "title": "Captura de pantalla", - "btn": "Captura de pantalla", - "nav": "Captura de pantalla", - "prev": "Página Previa", + "title": "Captura de Pantalla", + "btn": "Captura de Pantalla", + "nav": "Captura de Pantalla", + "prev": "Prev Página", "next": "Siguiente Página", - "refresh": "Refrescar" + "refresh": "Actualizar" }, "info": { "title": "Información", @@ -36,16 +36,16 @@ "config": { "title": "Configuración", "btn": "Configuración", - "nav": "Configuración" + "nav": "Configuraciones" }, "ota": { - "title": "Actualización de firmware", - "btn": "Actualización de firmware", + "title": "Actualización de Firmware", + "btn": "Actualización de Firmware", "nav": "Firmware", "submit": "Actualizar Firmware", "file": "Archivo Firmware", - "url": "URL del firmware", - "redirect": "Seguir redirecciones", + "url": "URL del Firmware", + "redirect": "Sigue Redirecciones", "never": "Nunca", "strict": "Estricto", "always": "Siempre" @@ -56,10 +56,10 @@ "nav": "Editor de Archivos" }, "reset": { - "title": "Restaurar conf de fábrica", - "btn": "Restaurar conf de fábrica", + "title": "Reconfiguración de Fábrica", + "btn": "Restaurar conf de Fábrica", "warning": "Aviso", - "message": "Este proceso restablecerá todos los ajustes a los valores por defecto. El flash interno se borrará y el dispositivo se reiniciará. Puede que necesite conectarse al AP WiFi mostrado en el panel para reconfigurar el dispositivo antes de volver a acceder a él.", + "message": "Este proceso restablecerá todos los ajustes a los valores predeterminados. El flash interno se borrará y el dispositivo se reiniciará. Es posible que necesite conectarse al AP WiFi mostrado en el panel para reconfigurar el dispositivo antes de volver a acceder a él.", "fileloss": "¡TODOS LOS ARCHIVOS SERÁN PERDIDOS!" }, "reboot": { @@ -124,9 +124,9 @@ }, "gpio": "Ajustes GPIO", "debug": { - "title": "Ajustes de depuración", - "btn": "Ajustes de depuración", - "baud": "Baudios", + "title": "Ajustes de Depuración", + "btn": "Ajustes de Depuración", + "baud": "Tasa Baudios", "tele": "Periodo de Tele", "ansi": "Usar códigos ANSI", "host": "Servidor Syslog", @@ -139,9 +139,9 @@ "title": "Ajustes de Tiempo", "btn": "Ajustes de Tiempo", "region": "Región", - "zone": "Zona horaria", - "tz": "Zona horaria", - "ntp": "Servidores NTP" + "zone": "Zona Horaria", + "tz": "Zona Horaria", + "ntp": "Servidor NTP" }, "region": { "etc": "Etcetera ", @@ -149,7 +149,7 @@ "af": "Africa ", "as": "Asia ", "au": "Australia ", - "aq": "Antarctica ", + "aq": "Antártida", "eu": "Europa ", "na": "América del Norte ", "sa": "América del Sur ", From e799a01bc522143b74f558357ffe89611a9a93af Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:44:51 +0200 Subject: [PATCH 074/142] New translations en.json (Swedish) --- data/sv_SE.json | 162 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 data/sv_SE.json diff --git a/data/sv_SE.json b/data/sv_SE.json new file mode 100644 index 00000000..fc90532d --- /dev/null +++ b/data/sv_SE.json @@ -0,0 +1,162 @@ +{ + "en": { + "language": "Svenska", + "home": { + "title": "Huvudmeny", + "btn": "Huvudmeny", + "nav": "Home" + }, + "save": "Spara Inställningar", + "user": "Username", + "pass": "Password", + "hasp": { + "title": "HASP Design", + "btn": "HASP Design", + "theme": "UI Theme", + "color1": "Primary color", + "color2": "Secondary color", + "pages": "Start Layout", + "font": "Default Font", + "startpage": "Startup Page", + "startdim": "Startup Dim" + }, + "screenshot": { + "title": "Screenshot", + "btn": "Screenshot", + "nav": "Screenshot", + "prev": "Prev Page", + "next": "Next Page", + "refresh": "Refresh" + }, + "info": { + "title": "Information", + "btn": "Information", + "nav": "Information" + }, + "config": { + "title": "Configuration", + "btn": "Configuration", + "nav": "Settings" + }, + "ota": { + "title": "Firmware Update", + "btn": "Firmware Update", + "nav": "Firmware", + "submit": "Update Firmware", + "file": "Firmware File", + "url": "Firmware URL", + "redirect": "Follow Redirects", + "never": "Never", + "strict": "Strict", + "always": "Always" + }, + "editor": { + "title": "File Editor", + "btn": "File Editor", + "nav": "File Editor" + }, + "reset": { + "title": "Factory Reset", + "btn": "Factory Reset", + "warning": "Warning", + "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.", + "fileloss": "ALL FILES WILL BE LOST!" + }, + "reboot": { + "title": "Rebooting...", + "btn": "Restart", + "nav": "Reboot", + "message": "The device is rebooting." + }, + "about": { + "credits": "Based on the previous work of the following open source developers:", + "copyright": "Copyright ", + "rights": "All rights reserved.", + "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "mit": "MIT License", + "bsd": "BSD License", + "freebsd": "FreeBSD License", + "apache2": "Apache2 License" + }, + "wifi": { + "title": "Wifi Settings", + "btn": "Wifi Settings", + "ssid": "SSID" + }, + "wg": { + "title": "WireGuard Settings", + "btn": "WireGuard Settings", + "vpnip": "VPN IP", + "privkey": "Private Key", + "host": "Remote IP", + "port": "Remote Port", + "pubkey": "Remote Public Key" + }, + "mqtt": { + "title": "MQTT Settings", + "btn": "MQTT Settings", + "name": "Hostname", + "group": "Groupname", + "host": "Broker", + "port": "Port", + "node_t": "Node Topic", + "group_t": "Group Topic", + "broadcast_t": "Broadcast Topic", + "hass_t": "HA LWT Topic" + }, + "http": { + "title": "HTTP Settings", + "btn": "HTTP Settings" + }, + "ftp": { + "title": "FTP Settings", + "btn": "FTP Settings", + "port": "FTP Port", + "pasv": "Passive Port" + }, + "gui": { + "title": "Display Settings", + "btn": "Display Settings", + "antiburn": "Antiburn", + "calibrate": "Calibrate" + }, + "gpio": "GPIO Settings", + "debug": { + "title": "Debug Settings", + "btn": "Debug Settings", + "baud": "Baudrate", + "tele": "Tele Period", + "ansi": "Use ANSI codes", + "host": "Syslog Server", + "port": "Syslog Port", + "ietf": "IETF (RFC 5424)", + "bsd": "BSD (RFC 3164)", + "log": "Facility" + }, + "time": { + "title": "Time Settings", + "btn": "Time Settings", + "region": "Region", + "zone": "Timezone", + "tz": "Timezone", + "ntp": "NTP Servers" + }, + "region": { + "etc": "Etcetera ", + "continents": "Continents ", + "af": "Africa ", + "as": "Asia ", + "au": "Australia ", + "aq": "Antarctica ", + "eu": "Europe ", + "na": "North America ", + "sa": "South America ", + "islands": "Islands ", + "at": "Atlantic Ocean ", + "in": "Indian Ocean ", + "pa": "Pacific Ocean " + } + } +} \ No newline at end of file From 5cbb92d6176f1ce490d31fdc56db84ad3387a090 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:44:52 +0200 Subject: [PATCH 075/142] New translations en_us.h (Swedish) --- src/lang/sv_SE.h | 242 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 src/lang/sv_SE.h diff --git a/src/lang/sv_SE.h b/src/lang/sv_SE.h new file mode 100644 index 00000000..334ce96e --- /dev/null +++ b/src/lang/sv_SE.h @@ -0,0 +1,242 @@ +// This translation file is maintained on https://crowdin.com/project/openhasp/ +// Do not edit directly! + +#ifndef HASP_LANG_SV_SE_H +#define HASP_LANG_SV_SE_H + +#define D_ISO_LANG_CODE "sv-SE" + +#define D_USERNAME "Användarnamn:" +#define D_PASSWORD "Lösenord:" +#define D_SSID "Ssid:" +#define D_YES "Ja" +#define D_NO "Nej" + +#define D_ERROR_OUT_OF_MEMORY "Out of memory" +#define D_ERROR_UNKNOWN "Unknown error" + +#define D_CONFIG_NOT_CHANGED "Settings did not change" +#define D_CONFIG_CHANGED "Settings changed" +#define D_CONFIG_LOADED "Settings loaded" + +#define D_FILE_LOADING "Loading %s" +#define D_FILE_LOADED "Loaded %s" +#define D_FILE_LOAD_FAILED "Failed to load %s" +#define D_FILE_SAVING "Saving %s" +#define D_FILE_SAVED "Saved %s" +#define D_FILE_SAVE_FAILED "Failed to save %s" +#define D_FILE_NOT_FOUND "File not found" +#define D_FILE_SIZE_BYTES "bytes" +#define D_FILE_SIZE_KILOBYTES "KiB" +#define D_FILE_SIZE_MEGABYTES "MiB" +#define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" +#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes +#define D_DECIMAL_POINT "." // decimal comma or point + +#define D_SERVICE_STARTING "Starting..." +#define D_SERVICE_STARTED "Started" +#define D_SERVICE_START_FAILED "Failed to start" +#define D_SERVICE_STOPPED "Stopped" +#define D_SERVICE_DISABLED "Disabled" +#define D_SERVICE_CONNECTED "Connected" +#define D_SERVICE_DISCONNECTED "Disconnected" + +#define D_SETTING_ENABLED "Enabled" +#define D_SETTING_DISABLED "Disabled" +#define D_SETTING_DEFAULT "Default" + +#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s" +#define D_NETWORK_ONLINE "online" +#define D_NETWORK_OFFLINE "offline" +#define D_NETWORK_CONNECTION_FAILED "Connection failed" +#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed" + +#define D_MQTT_DEFAULT_NAME "plate_%s" +#define D_MQTT_CONNECTING "Connecting..." +#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s" +#define D_MQTT_NOT_CONNECTED "Not connected ???" +#define D_MQTT_DISCONNECTING "Disconnecting..." +#define D_MQTT_DISCONNECTED "Disconnected" +#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..." +#define D_MQTT_NOT_CONFIGURED "Broker not configured" +#define D_MQTT_STARTED "Started: %d bytes" +#define D_MQTT_FAILED "Failed:" +#define D_MQTT_INVALID_TOPIC "Message has invalid topic" +#define D_MQTT_SUBSCRIBED "Subscribed to %s" +#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s" +#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery" +#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)" + +#define D_TELNET_CLOSING_CONNECTION "Closing session from %s" +#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s" +#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s" +#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected" +#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s" +#define D_TELNET_STARTED "Telnet console started" +#define D_TELNET_FAILED "Failed to start telnet console" +#define D_TELNET_CLIENT_CONNECTED "Client connected" +#define D_TELNET_CLIENT_REJECTED "Client rejected" + +#define D_HASP_INVALID_PAGE "Invalid page %u" +#define D_HASP_INVALID_LAYER "Cannot clear system layer" +#define D_HASP_CHANGE_PAGE "Changing page to %u" +#define D_HASP_CLEAR_PAGE "Clearing page %u" + +#define D_OBJECT_DELETED "Object deleted" +#define D_OBJECT_UNKNOWN "Unknown object" +#define D_OBJECT_MISMATCH "Objects DO NOT match!" +#define D_OBJECT_LOST "Lost object!" +#define D_OBJECT_CREATE_FAILED "Failed to create object id %u" +#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined" +#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d" + +#define D_ATTRIBUTE_UNKNOWN "Unknown property %s" +// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone +#define D_ATTRIBUTE_OBSOLETE "%s is obsolete" +#define D_ATTRIBUTE_INSTEAD ", use %s instead" +#define D_ATTRIBUTE_READ_ONLY "%s is read-only" +#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page" +#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s" +#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s" +#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s" + +#define D_OOBE_SSID_VALIDATED "SSID %s validated" +#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled" +#define D_OOBE_CALIBRATED "Already calibrated" + +#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found" +#define D_DISPATCH_INVALID_PAGE "Invalid page %s" +#define D_DISPATCH_REBOOT "Rebooting the MCU now!" + +#define D_JSON_FAILED "JSON parsing failed:" +#define D_JSONL_FAILED "JSONL parsing failed at line %u" +#define D_JSONL_SUCCEEDED "Jsonl fully parsed" + +#define D_OTA_CHECK_UPDATE "Trying update URL: %s" +#define D_OTA_CHECK_COMPLETE "Update check complete" +#define D_OTA_CHECK_FAILED "Update check failed: %s" +#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update" +#define D_OTA_UPDATE_COMPLETE "OTA Update complete" +#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot" +#define D_OTA_UPDATE_FAILED "OTA Update failed" +#define D_OTA_UPDATING_FIRMWARE "Updating firmware..." +#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..." + +#define D_HTTP_HASP_DESIGN "HASP Design" +#define D_HTTP_INFORMATION "Information" +#define D_HTTP_HTTP_SETTINGS "HTTP Settings" +#define D_HTTP_FTP_SETTINGS "FTP Settings" +#define D_HTTP_WIFI_SETTINGS "Wifi Settings" +#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" +#define D_HTTP_MQTT_SETTINGS "MQTT Settings" +#define D_HTTP_GPIO_SETTINGS "GPIO Settings" +#define D_HTTP_MDNS_SETTINGS "mDNS Settings" +#define D_HTTP_TELNET_SETTINGS "Telnet Settings" +#define D_HTTP_DEBUG_SETTINGS "Debug Settings" +#define D_HTTP_GUI_SETTINGS "Display Settings" +#define D_HTTP_SAVE_SETTINGS "Save Settings" +#define D_HTTP_UPLOAD_FILE "Upload File" +#define D_HTTP_ERASE_DEVICE "Reset All Settings" +#define D_HTTP_ADD_GPIO "Add New Pin" +#define D_HTTP_BACK "Back" +#define D_HTTP_REFRESH "Refresh" +#define D_HTTP_PREV_PAGE "Prev Page" +#define D_HTTP_NEXT_PAGE "Next Page" +#define D_HTTP_CALIBRATE "Calibrate" +#define D_HTTP_ANTIBURN "Run Anti Burn-in" +#define D_HTTP_SCREENSHOT "Screenshot" +#define D_HTTP_FILE_BROWSER "File Editor" +#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade" +#define D_HTTP_UPDATE_FIRMWARE "Update Firmware" +#define D_HTTP_FACTORY_RESET "Factory Reset" +#define D_HTTP_MAIN_MENU "Main Menu" +#define D_HTTP_REBOOT "Restart" +#define D_HTTP_CONFIGURATION "Configuration" +#define D_HTTP_CONFIG_CHANGED \ + "The configuration has changed, please click Restart to save changes to flash." +#define D_HTTP_SENDING_PAGE "Sent %S page to %s" +#define D_HTTP_FOOTER "by Francis Van Roie" + +#define D_INFO_VERSION "Version" +#define D_INFO_BUILD_DATETIME "Build DateTime" +#define D_INFO_ENVIRONMENT "Environment" +#define D_INFO_UPTIME "Uptime" +#define D_INFO_FREE_HEAP "Free Heap" +#define D_INFO_FREE_BLOCK "Free Block" +#define D_INFO_DEVICE_MEMORY "Device Memory" +#define D_INFO_LVGL_MEMORY "LVGL Memory" +#define D_INFO_TOTAL_MEMORY "Total" +#define D_INFO_FREE_MEMORY "Free" +#define D_INFO_FRAGMENTATION "Fragmentation" +#define D_INFO_PSRAM_FREE "PSRam Free" +#define D_INFO_PSRAM_SIZE "PSRam Size" +#define D_INFO_FLASH_SIZE "Flash Size" +#define D_INFO_SKETCH_USED "Program Size Used" +#define D_INFO_SKETCH_FREE "Program Size Free" +#define D_INFO_FS_SIZE "Filesystem Size" +#define D_INFO_FS_USED "Filesystem Used" +#define D_INFO_FS_FREE "Filesystem Free" +#define D_INFO_MODULE "Module" +#define D_INFO_MODEL "Model" +#define D_INFO_FREQUENCY "Frequency" +#define D_INFO_CORE_VERSION "Core Version" +#define D_INFO_RESET_REASON "Reset Reason" +#define D_INFO_STATUS "Status" +#define D_INFO_SERVER "Server" +#define D_INFO_USERNAME "Username" +#define D_INFO_CLIENTID "Client ID" +// #define D_INFO_CONNECTED "Connected" +// #define D_INFO_DISCONNECTED "Disconnected" +#define D_INFO_RECEIVED "Received" +#define D_INFO_PUBLISHED "Published" +#define D_INFO_FAILED "Failed" +#define D_INFO_ETHERNET "Ethernet" +#define D_INFO_WIFI "Wifi" +#define D_INFO_WIREGUARD "WireGuard" +#define D_INFO_LINK_SPEED "Link Speed" +#define D_INFO_FULL_DUPLEX "Full Duplex" +#define D_INFO_BSSID "BSSID" +#define D_INFO_SSID "SSID" +#define D_INFO_RSSI "Signal Strength" +#define D_INFO_IP_ADDRESS "IP Address" +#define D_INFO_MAC_ADDRESS "MAC Address" +#define D_INFO_GATEWAY "Gateway" +#define D_INFO_DNS_SERVER "DNS Server" +#define D_INFO_ENDPOINT_IP "Endpoint IP" +#define D_INFO_ENDPOINT_PORT "Endpoint Port" + +#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:" +#define D_OOBE_SCAN_TO_CONNECT "Scan to connect" + +#define D_WIFI_CONNECTING_TO "Connecting to %s" +#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..." +#define D_WIFI_RSSI_EXCELLENT "Excellent" +#define D_WIFI_RSSI_GOOD "Good" +#define D_WIFI_RSSI_FAIR "Fair" +#define D_WIFI_RSSI_WEAK "Weak" +#define D_WIFI_RSSI_BAD "Very bad" + +#define D_WG_INITIALIZED "Initialized" +#define D_WG_BAD_CONFIG "Missing or bad configuration" + +#define D_GPIO_SWITCH "Switch" +#define D_GPIO_BUTTON "Push Button" +#define D_GPIO_TOUCH "Capacitive Touch" +#define D_GPIO_LED "Led" +#define D_GPIO_LED_R "Mood Red" +#define D_GPIO_LED_G "Mood Green" +#define D_GPIO_LED_B "Mood Blue" +#define D_GPIO_POWER_RELAY "Power Relay" +#define D_GPIO_LIGHT_RELAY "Light Relay" +#define D_GPIO_PWM "PWM" +#define D_GPIO_DAC "DAC" +#define D_GPIO_SERIAL_DIMMER "Serial Dimmer" +#define D_GPIO_UNKNOWN "Unknown" +#define D_GPIO_PIN "Pin" +#define D_GPIO_GROUP "Group" +#define D_GPIO_GROUP_NONE "None" +#define D_GPIO_STATE_NORMAL "Normal" +#define D_GPIO_STATE_INVERTED "Inverted" + +#endif \ No newline at end of file From 391401b3a3468ef398b73245d36d99ff7aa8ee6c Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:55:05 +0200 Subject: [PATCH 076/142] New translations en.json (Spanish) --- data/es_ES.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/es_ES.json b/data/es_ES.json index 2bacf1cd..0906e404 100644 --- a/data/es_ES.json +++ b/data/es_ES.json @@ -81,8 +81,8 @@ "apache2": "Licencia Apache2" }, "wifi": { - "title": "Ajustes Wifi", - "btn": "Ajustes Wifi", + "title": "Ajustes WiFi", + "btn": "Ajustes WiFi", "ssid": "SSID" }, "wg": { @@ -97,7 +97,7 @@ "mqtt": { "title": "Ajustes MQTT", "btn": "Ajustes MQTT", - "name": "Nombre de equipo", + "name": "Nombre del Host", "group": "Nombre del Grupo", "host": "Broker", "port": "Puerto", @@ -149,7 +149,7 @@ "af": "Africa ", "as": "Asia ", "au": "Australia ", - "aq": "Antártida", + "aq": "Antártida ", "eu": "Europa ", "na": "América del Norte ", "sa": "América del Sur ", From 4b89d9ca521dcdf041aa113b9655ee170b95ad93 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:45:49 +0200 Subject: [PATCH 077/142] New translations en.json (Swedish) --- data/sv_SE.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/sv_SE.json b/data/sv_SE.json index fc90532d..b3b3bb25 100644 --- a/data/sv_SE.json +++ b/data/sv_SE.json @@ -72,16 +72,16 @@ "credits": "Based on the previous work of the following open source developers:", "copyright": "Copyright ", "rights": "All rights reserved.", - "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", - "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", - "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "clause1": "Härmed beviljas tillstånd, utan kostnad, till alla personer som erhåller en kopia av denna programvara och tillhörande dokumentationsfiler (\"Programvaran\"), att hantera Programvaran utan begränsningar, inklusive men inte begränsat till rätten att använda, kopiera, modifiera, sammanfoga, publicera, distribuera, underlicensiera och/eller sälja kopior av Programvaran, samt att tillåta personer till vilka Programvaran tillhandahålls att göra detsamma, under förutsättning av följande villkor:", + "clause2": "Ovanstående meddelande om upphovsrätt och detta tillståndsmeddelande ska inkluderas i alla kopior eller väsentliga delar av programvaran.", + "clause3": "PROGRAMVARAN TILLHANDAHÅLLS \"I BEFINTLIGT SKICK\", UTAN NÅGON SOM HELST GARANTI, VARE SIG UTTRYCKLIG ELLER UNDERFÖRSTÅDD, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER OM SÄLJBARHET, LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL OCH ICKE-INTRÅNG. UNDER INGA OMSTÄNDIGHETER SKALL FÖRFATTARNA ELLER UPPHOVSRÄTTSINNEHAVARNA VARA ANSVARIGA FÖR NÅGON TYP AV KRAV, SKADOR ELLER ANNAT ANSVAR, VARE SIG I KONTRAKT, SKADESTÅND ELLER ANNAT, SOM UPPSTÅR FRÅN, UR ELLER I SAMBAND MED PROGRAMVARAN ELLER ANVÄNDNINGEN ELLER ANDRA ÅTGÄRDER I SAMBAND MED PROGRAMVARAN.", "mit": "MIT License", - "bsd": "BSD License", - "freebsd": "FreeBSD License", - "apache2": "Apache2 License" + "bsd": "BSD Licens", + "freebsd": "FreeBSD Licens", + "apache2": "Apache2 Licens" }, "wifi": { - "title": "Wifi Settings", + "title": "Inställningar för WiFi", "btn": "Wifi Settings", "ssid": "SSID" }, From 4d2aa8d8e0e7089f9b5759ac8f933310fe1764df Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:45:50 +0200 Subject: [PATCH 078/142] New translations en_us.h (Swedish) --- src/lang/sv_SE.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/sv_SE.h b/src/lang/sv_SE.h index 334ce96e..048cb6e6 100644 --- a/src/lang/sv_SE.h +++ b/src/lang/sv_SE.h @@ -50,7 +50,7 @@ #define D_NETWORK_ONLINE "online" #define D_NETWORK_OFFLINE "offline" #define D_NETWORK_CONNECTION_FAILED "Connection failed" -#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed" +#define D_NETWORK_CONNECTION_UNAUTHORIZED "Auktorisering misslyckades" #define D_MQTT_DEFAULT_NAME "plate_%s" #define D_MQTT_CONNECTING "Connecting..." @@ -115,7 +115,7 @@ #define D_OTA_CHECK_UPDATE "Trying update URL: %s" #define D_OTA_CHECK_COMPLETE "Update check complete" -#define D_OTA_CHECK_FAILED "Update check failed: %s" +#define D_OTA_CHECK_FAILED "Uppdateringskontroll misslyckades: %s" #define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update" #define D_OTA_UPDATE_COMPLETE "OTA Update complete" #define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot" From 4809ac3915ace62c23a9f3747950e887b2257094 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 09:53:27 +0200 Subject: [PATCH 079/142] New translations en.json (Swedish) --- data/sv_SE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/sv_SE.json b/data/sv_SE.json index b3b3bb25..d4a3dacd 100644 --- a/data/sv_SE.json +++ b/data/sv_SE.json @@ -82,14 +82,14 @@ }, "wifi": { "title": "Inställningar för WiFi", - "btn": "Wifi Settings", + "btn": "Inställningar för Wifi", "ssid": "SSID" }, "wg": { "title": "WireGuard Settings", "btn": "WireGuard Settings", "vpnip": "VPN IP", - "privkey": "Private Key", + "privkey": "Privat nyckel", "host": "Remote IP", "port": "Remote Port", "pubkey": "Remote Public Key" From f0506d185d501850c805359a3077f00da690a7bc Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:33:52 +0200 Subject: [PATCH 080/142] New translations en.json (Swedish) --- data/sv_SE.json | 184 ++++++++++++++++++++++++------------------------ 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/data/sv_SE.json b/data/sv_SE.json index d4a3dacd..33672264 100644 --- a/data/sv_SE.json +++ b/data/sv_SE.json @@ -4,29 +4,29 @@ "home": { "title": "Huvudmeny", "btn": "Huvudmeny", - "nav": "Home" + "nav": "Hem" }, "save": "Spara Inställningar", - "user": "Username", - "pass": "Password", + "user": "Användarnamn", + "pass": "Lösenord", "hasp": { "title": "HASP Design", "btn": "HASP Design", - "theme": "UI Theme", - "color1": "Primary color", - "color2": "Secondary color", - "pages": "Start Layout", - "font": "Default Font", - "startpage": "Startup Page", - "startdim": "Startup Dim" + "theme": "UI Tema", + "color1": "Primärfärg", + "color2": "Sekundärfärg", + "pages": "Starta Layout", + "font": "Standardtypsnitt", + "startpage": "Startsida", + "startdim": "Startljusstyrka" }, "screenshot": { - "title": "Screenshot", - "btn": "Screenshot", - "nav": "Screenshot", - "prev": "Prev Page", - "next": "Next Page", - "refresh": "Refresh" + "title": "Skärmbild", + "btn": "Skärmbild", + "nav": "Skärmbild", + "prev": "Föregående Sida", + "next": "Nästa Sida", + "refresh": "Uppdatera" }, "info": { "title": "Information", @@ -34,48 +34,48 @@ "nav": "Information" }, "config": { - "title": "Configuration", - "btn": "Configuration", - "nav": "Settings" + "title": "Inställningar", + "btn": "Konfiguration", + "nav": "Inställningar" }, "ota": { - "title": "Firmware Update", - "btn": "Firmware Update", + "title": "Firmware-uppdatering", + "btn": "Firmware-uppdatering", "nav": "Firmware", - "submit": "Update Firmware", - "file": "Firmware File", + "submit": "Uppdatera Firmware", + "file": "Firmware-fil", "url": "Firmware URL", - "redirect": "Follow Redirects", - "never": "Never", - "strict": "Strict", - "always": "Always" + "redirect": "Följ omdirigeringar", + "never": "Aldrig", + "strict": "Strikt", + "always": "Alltid" }, "editor": { - "title": "File Editor", - "btn": "File Editor", - "nav": "File Editor" + "title": "Filredigerare", + "btn": "Filredigerare", + "nav": "Filredigerare" }, "reset": { - "title": "Factory Reset", - "btn": "Factory Reset", - "warning": "Warning", - "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.", - "fileloss": "ALL FILES WILL BE LOST!" + "title": "Fabriksåterställning", + "btn": "Fabriksåterställning", + "warning": "Varning", + "message": "Denna process kommer att återställa alla inställningar till standardvärden. Det interna minnet kommer att raderas och enheten startas om. Du kan behöva ansluta till WiFi AP som visas på panelen för att konfigurera om enheten innan du öppnar den igen.", + "fileloss": "ALLA FILLER KOMMER ATT FÖRLORAS!" }, "reboot": { - "title": "Rebooting...", - "btn": "Restart", - "nav": "Reboot", - "message": "The device is rebooting." + "title": "Startar om...", + "btn": "Omstart", + "nav": "Omstart", + "message": "Enheten startar om." }, "about": { - "credits": "Based on the previous work of the following open source developers:", - "copyright": "Copyright ", - "rights": "All rights reserved.", - "clause1": "Härmed beviljas tillstånd, utan kostnad, till alla personer som erhåller en kopia av denna programvara och tillhörande dokumentationsfiler (\"Programvaran\"), att hantera Programvaran utan begränsningar, inklusive men inte begränsat till rätten att använda, kopiera, modifiera, sammanfoga, publicera, distribuera, underlicensiera och/eller sälja kopior av Programvaran, samt att tillåta personer till vilka Programvaran tillhandahålls att göra detsamma, under förutsättning av följande villkor:", + "credits": "Baserat på det tidigare arbetet av följande utvecklare av öppen källkod:", + "copyright": "Upphovsrätt ", + "rights": "Alla rättigheter förbehållna.", + "clause1": "Härmed beviljas tillstånd, utan kostnad, till alla personer som erhåller en kopia av denna programvara och tillhörande dokumentation (\"Programvaran\"), att hantera Programvaran utan begränsningar, inklusive men inte begränsat till rätten att använda, kopiera, modifiera, sammanfoga, publicera, distribuera, underlicensiera och/eller sälja kopior av Programvaran, samt att tillåta personer till vilka Programvaran tillhandahålls att göra detsamma, under förutsättning av följande villkor:", "clause2": "Ovanstående meddelande om upphovsrätt och detta tillståndsmeddelande ska inkluderas i alla kopior eller väsentliga delar av programvaran.", "clause3": "PROGRAMVARAN TILLHANDAHÅLLS \"I BEFINTLIGT SKICK\", UTAN NÅGON SOM HELST GARANTI, VARE SIG UTTRYCKLIG ELLER UNDERFÖRSTÅDD, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER OM SÄLJBARHET, LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL OCH ICKE-INTRÅNG. UNDER INGA OMSTÄNDIGHETER SKALL FÖRFATTARNA ELLER UPPHOVSRÄTTSINNEHAVARNA VARA ANSVARIGA FÖR NÅGON TYP AV KRAV, SKADOR ELLER ANNAT ANSVAR, VARE SIG I KONTRAKT, SKADESTÅND ELLER ANNAT, SOM UPPSTÅR FRÅN, UR ELLER I SAMBAND MED PROGRAMVARAN ELLER ANVÄNDNINGEN ELLER ANDRA ÅTGÄRDER I SAMBAND MED PROGRAMVARAN.", - "mit": "MIT License", + "mit": "MIT Licens", "bsd": "BSD Licens", "freebsd": "FreeBSD Licens", "apache2": "Apache2 Licens" @@ -86,77 +86,77 @@ "ssid": "SSID" }, "wg": { - "title": "WireGuard Settings", - "btn": "WireGuard Settings", - "vpnip": "VPN IP", + "title": "Inställningar för WireGuard", + "btn": "Inställningar för WireGuard", + "vpnip": "VPN IP-adress", "privkey": "Privat nyckel", - "host": "Remote IP", - "port": "Remote Port", - "pubkey": "Remote Public Key" + "host": "Fjärr-IP", + "port": "Fjärrport", + "pubkey": "Publik fjärrnyckel" }, "mqtt": { - "title": "MQTT Settings", - "btn": "MQTT Settings", - "name": "Hostname", - "group": "Groupname", + "title": "MQTT Inställningar", + "btn": "MQTT Inställningar", + "name": "Servernamn", + "group": "Gruppnamn", "host": "Broker", "port": "Port", - "node_t": "Node Topic", - "group_t": "Group Topic", - "broadcast_t": "Broadcast Topic", - "hass_t": "HA LWT Topic" + "node_t": "Nod topic", + "group_t": "Grupp topic", + "broadcast_t": "Broadcast topic", + "hass_t": "HA LWT topic" }, "http": { - "title": "HTTP Settings", - "btn": "HTTP Settings" + "title": "HTTP Inställningar", + "btn": "HTTP Inställningar" }, "ftp": { - "title": "FTP Settings", - "btn": "FTP Settings", + "title": "FTP Inställningar", + "btn": "FTP Inställningar", "port": "FTP Port", - "pasv": "Passive Port" + "pasv": "Passiv port" }, "gui": { - "title": "Display Settings", - "btn": "Display Settings", + "title": "Bildskärmsinställningar", + "btn": "Bildskärmsinställningar", "antiburn": "Antiburn", - "calibrate": "Calibrate" + "calibrate": "Kalibrera" }, - "gpio": "GPIO Settings", + "gpio": "GPIO Inställningar", "debug": { - "title": "Debug Settings", - "btn": "Debug Settings", - "baud": "Baudrate", - "tele": "Tele Period", - "ansi": "Use ANSI codes", - "host": "Syslog Server", - "port": "Syslog Port", + "title": "Debug inställningar", + "btn": "Debug inställningar", + "baud": "Datahastighet", + "tele": "Telemetri period", + "ansi": "Använd ANSI-kod", + "host": "Syslog server", + "port": "Syslog port", "ietf": "IETF (RFC 5424)", "bsd": "BSD (RFC 3164)", - "log": "Facility" + "log": "Facilitet" }, "time": { - "title": "Time Settings", - "btn": "Time Settings", + "title": "Tidsinställningar", + "btn": "Tidsinställningar", "region": "Region", - "zone": "Timezone", - "tz": "Timezone", - "ntp": "NTP Servers" + "zone": "Tidszon", + "tz": "Tidszon", + "ntp": "NTP-servrar" }, "region": { "etc": "Etcetera ", - "continents": "Continents ", - "af": "Africa ", - "as": "Asia ", - "au": "Australia ", - "aq": "Antarctica ", - "eu": "Europe ", - "na": "North America ", - "sa": "South America ", - "islands": "Islands ", - "at": "Atlantic Ocean ", - "in": "Indian Ocean ", - "pa": "Pacific Ocean " + "continents": "Kontinenter ", + "af": "Afrika ", + "as": "Asien ", + "au": "Australien ", + "aq": "Antarktis", + "eu": "Europa ", + "na": "Nordamerika ", + "sa": "Sydamerika ", + "islands": "Öar ", + "at": "Atlanten ", + "in": "Indiska oceanen ", + "pa": "Stilla havet " } } } \ No newline at end of file From b83276bca0d3780c0128f7fd7c919026f0151bbb Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:33:53 +0200 Subject: [PATCH 081/142] New translations en_us.h (Swedish) --- src/lang/sv_SE.h | 364 +++++++++++++++++++++++------------------------ 1 file changed, 182 insertions(+), 182 deletions(-) diff --git a/src/lang/sv_SE.h b/src/lang/sv_SE.h index 048cb6e6..6659ffce 100644 --- a/src/lang/sv_SE.h +++ b/src/lang/sv_SE.h @@ -1,5 +1,5 @@ -// This translation file is maintained on https://crowdin.com/project/openhasp/ -// Do not edit directly! +// Denna översättningsfil bibehålls på https://crowdin.com/project/openhasp/ +// Redigera inte direkt! #ifndef HASP_LANG_SV_SE_H #define HASP_LANG_SV_SE_H @@ -12,231 +12,231 @@ #define D_YES "Ja" #define D_NO "Nej" -#define D_ERROR_OUT_OF_MEMORY "Out of memory" -#define D_ERROR_UNKNOWN "Unknown error" +#define D_ERROR_OUT_OF_MEMORY "Slut minne" +#define D_ERROR_UNKNOWN "Okänt fel" -#define D_CONFIG_NOT_CHANGED "Settings did not change" -#define D_CONFIG_CHANGED "Settings changed" -#define D_CONFIG_LOADED "Settings loaded" +#define D_CONFIG_NOT_CHANGED "Inställningar ändrades inte" +#define D_CONFIG_CHANGED "Inställningar ändrade" +#define D_CONFIG_LOADED "Inställningarna inlästa" -#define D_FILE_LOADING "Loading %s" -#define D_FILE_LOADED "Loaded %s" -#define D_FILE_LOAD_FAILED "Failed to load %s" -#define D_FILE_SAVING "Saving %s" -#define D_FILE_SAVED "Saved %s" -#define D_FILE_SAVE_FAILED "Failed to save %s" -#define D_FILE_NOT_FOUND "File not found" +#define D_FILE_LOADING "Läser %s" +#define D_FILE_LOADED "Läst %s" +#define D_FILE_LOAD_FAILED "Misslyckades att läsa %s" +#define D_FILE_SAVING "Sparar %s" +#define D_FILE_SAVED "Sparat %s" +#define D_FILE_SAVE_FAILED "Kunde inte spara %s" +#define D_FILE_NOT_FOUND "Filen hittades inte" #define D_FILE_SIZE_BYTES "bytes" #define D_FILE_SIZE_KILOBYTES "KiB" #define D_FILE_SIZE_MEGABYTES "MiB" #define D_FILE_SIZE_GIGABYTES "GiB" #define D_FILE_SIZE_TERABYTES "TiB" -#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes -#define D_DECIMAL_POINT "." // decimal comma or point +#define D_FILE_SIZE_DIVIDER 1024 // kibi eller kilo bytes +#define D_DECIMAL_POINT "." // kommatecken eller punkt -#define D_SERVICE_STARTING "Starting..." -#define D_SERVICE_STARTED "Started" -#define D_SERVICE_START_FAILED "Failed to start" -#define D_SERVICE_STOPPED "Stopped" -#define D_SERVICE_DISABLED "Disabled" -#define D_SERVICE_CONNECTED "Connected" -#define D_SERVICE_DISCONNECTED "Disconnected" +#define D_SERVICE_STARTING "Startar..." +#define D_SERVICE_STARTED "Startat" +#define D_SERVICE_START_FAILED "Misslyckades att starta" +#define D_SERVICE_STOPPED "Stoppat" +#define D_SERVICE_DISABLED "Inaktiverad" +#define D_SERVICE_CONNECTED "Ansluten" +#define D_SERVICE_DISCONNECTED "Frånkopplad" -#define D_SETTING_ENABLED "Enabled" -#define D_SETTING_DISABLED "Disabled" -#define D_SETTING_DEFAULT "Default" +#define D_SETTING_ENABLED "Aktiverad" +#define D_SETTING_DISABLED "Inaktiverad" +#define D_SETTING_DEFAULT "Standard" -#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s" +#define D_NETWORK_IP_ADDRESS_RECEIVED "Mottagen IP-adress %s" #define D_NETWORK_ONLINE "online" #define D_NETWORK_OFFLINE "offline" -#define D_NETWORK_CONNECTION_FAILED "Connection failed" +#define D_NETWORK_CONNECTION_FAILED "Anslutning misslyckades" #define D_NETWORK_CONNECTION_UNAUTHORIZED "Auktorisering misslyckades" #define D_MQTT_DEFAULT_NAME "plate_%s" -#define D_MQTT_CONNECTING "Connecting..." -#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s" -#define D_MQTT_NOT_CONNECTED "Not connected ???" -#define D_MQTT_DISCONNECTING "Disconnecting..." -#define D_MQTT_DISCONNECTED "Disconnected" -#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..." -#define D_MQTT_NOT_CONFIGURED "Broker not configured" -#define D_MQTT_STARTED "Started: %d bytes" -#define D_MQTT_FAILED "Failed:" -#define D_MQTT_INVALID_TOPIC "Message has invalid topic" -#define D_MQTT_SUBSCRIBED "Subscribed to %s" -#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s" -#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery" -#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)" +#define D_MQTT_CONNECTING "Ansluter..." +#define D_MQTT_CONNECTED "Ansluten till broker %s som clientID %s" +#define D_MQTT_NOT_CONNECTED "Inte ansluten ???" +#define D_MQTT_DISCONNECTING "Kopplar från..." +#define D_MQTT_DISCONNECTED "Frånkopplad" +#define D_MQTT_RECONNECTING "Frånkopplad från broker, återansluter..." +#define D_MQTT_NOT_CONFIGURED "Broker är inte konfigurerad" +#define D_MQTT_STARTED "Startat: %d bytes" +#define D_MQTT_FAILED "Misslyckades:" +#define D_MQTT_INVALID_TOPIC "Meddelande har ogiltigt topic" +#define D_MQTT_SUBSCRIBED "Prenumererade på %s" +#define D_MQTT_NOT_SUBSCRIBED "Misslyckades att prenumerera på %s" +#define D_MQTT_HA_AUTO_DISCOVERY "Registrera HA auto-discovery" +#define D_MQTT_PAYLOAD_TOO_LONG "Payload för lång (%u bytes)" -#define D_TELNET_CLOSING_CONNECTION "Closing session from %s" -#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s" -#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s" -#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected" -#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s" -#define D_TELNET_STARTED "Telnet console started" -#define D_TELNET_FAILED "Failed to start telnet console" -#define D_TELNET_CLIENT_CONNECTED "Client connected" -#define D_TELNET_CLIENT_REJECTED "Client rejected" +#define D_TELNET_CLOSING_CONNECTION "Stänger session från %s" +#define D_TELNET_CLIENT_LOGIN_FROM "Klientinloggning från %s" +#define D_TELNET_CLIENT_CONNECT_FROM "Klient ansluten från %s" +#define D_TELNET_CLIENT_NOT_CONNECTED "Klient INTE ansluten" +#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Felaktigt inloggningsförsök från %s" +#define D_TELNET_STARTED "Telnet-konsol startad" +#define D_TELNET_FAILED "Misslyckades att starta telnet-konsolen" +#define D_TELNET_CLIENT_CONNECTED "Klient ansluten" +#define D_TELNET_CLIENT_REJECTED "Klient avvisad" -#define D_HASP_INVALID_PAGE "Invalid page %u" -#define D_HASP_INVALID_LAYER "Cannot clear system layer" -#define D_HASP_CHANGE_PAGE "Changing page to %u" -#define D_HASP_CLEAR_PAGE "Clearing page %u" +#define D_HASP_INVALID_PAGE "Ogiltig sida %u" +#define D_HASP_INVALID_LAYER "Kan inte rensa systemlager" +#define D_HASP_CHANGE_PAGE "Byter sida till %u" +#define D_HASP_CLEAR_PAGE "Rensar sida %u" -#define D_OBJECT_DELETED "Object deleted" -#define D_OBJECT_UNKNOWN "Unknown object" -#define D_OBJECT_MISMATCH "Objects DO NOT match!" -#define D_OBJECT_LOST "Lost object!" -#define D_OBJECT_CREATE_FAILED "Failed to create object id %u" -#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined" -#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d" +#define D_OBJECT_DELETED "Objektet borttaget" +#define D_OBJECT_UNKNOWN "Okänt objekt" +#define D_OBJECT_MISMATCH "Objekt matchar INTE!" +#define D_OBJECT_LOST "Förlorat objekt!" +#define D_OBJECT_CREATE_FAILED "Misslyckades att skapa objekt-id %u" +#define D_OBJECT_PAGE_UNKNOWN "Sida ID %u inte skapad" +#define D_OBJECT_EVENT_UNKNOWN "Okänd händelse %d" -#define D_ATTRIBUTE_UNKNOWN "Unknown property %s" -// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone -#define D_ATTRIBUTE_OBSOLETE "%s is obsolete" -#define D_ATTRIBUTE_INSTEAD ", use %s instead" -#define D_ATTRIBUTE_READ_ONLY "%s is read-only" -#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page" -#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s" -#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s" -#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s" +#define D_ATTRIBUTE_UNKNOWN "Okänd egenskap %s" +// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD kan användas tillsammans eller bara D_ATTRIBUTE_OBSOLETE ensam +#define D_ATTRIBUTE_OBSOLETE "%s är föråldrad" +#define D_ATTRIBUTE_INSTEAD ", använd %s istället" +#define D_ATTRIBUTE_READ_ONLY "%s är skrivskyddad" +#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Kan inte anropa %s på en sida" +#define D_ATTRIBUTE_ALIGN_INVALID "Ogiltig align-värde: %s" +#define D_ATTRIBUTE_COLOR_INVALID "Ogiltig färg-värde: %s" +#define D_ATTRIBUTE_LONG_MODE_INVALID "Ogiltigt long-läge: %s" -#define D_OOBE_SSID_VALIDATED "SSID %s validated" -#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled" -#define D_OOBE_CALIBRATED "Already calibrated" +#define D_OOBE_SSID_VALIDATED "SSID %s validerat" +#define D_OOBE_AUTO_CALIBRATE "Automatisk kalibrering aktiverad" +#define D_OOBE_CALIBRATED "Redan kalibrerad" -#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found" -#define D_DISPATCH_INVALID_PAGE "Invalid page %s" -#define D_DISPATCH_REBOOT "Rebooting the MCU now!" +#define D_DISPATCH_COMMAND_NOT_FOUND "Kommando '%s' hittades inte +#define D_DISPATCH_INVALID_PAGE "Ogiltig sida %s" +#define D_DISPATCH_REBOOT "Startar om MCU nu!" -#define D_JSON_FAILED "JSON parsing failed:" -#define D_JSONL_FAILED "JSONL parsing failed at line %u" -#define D_JSONL_SUCCEEDED "Jsonl fully parsed" +#define D_JSON_FAILED "JSON parsning misslyckades:" +#define D_JSONL_FAILED "JSONL parsning misslyckades på rad %u" +#define D_JSONL_SUCCEEDED "Jsonl helt tolkad" -#define D_OTA_CHECK_UPDATE "Trying update URL: %s" -#define D_OTA_CHECK_COMPLETE "Update check complete" +#define D_OTA_CHECK_UPDATE "Försöker uppdatera URL: %s" +#define D_OTA_CHECK_COMPLETE "Uppdateringskontroll slutförd" #define D_OTA_CHECK_FAILED "Uppdateringskontroll misslyckades: %s" -#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update" -#define D_OTA_UPDATE_COMPLETE "OTA Update complete" -#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot" -#define D_OTA_UPDATE_FAILED "OTA Update failed" -#define D_OTA_UPDATING_FIRMWARE "Updating firmware..." -#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..." +#define D_OTA_UPDATE_FIRMWARE "OTA Uppdatering" +#define D_OTA_UPDATE_COMPLETE "OTA Uppdatering klar" +#define D_OTA_UPDATE_APPLY "Sparar fast programvara och startar om" +#define D_OTA_UPDATE_FAILED "OTA Uppdatering misslyckades" +#define D_OTA_UPDATING_FIRMWARE "Uppdatera den inbyggda programvaran..." +#define D_OTA_UPDATING_FILESYSTEM "Uppdaterar filsystemet..." #define D_HTTP_HASP_DESIGN "HASP Design" #define D_HTTP_INFORMATION "Information" -#define D_HTTP_HTTP_SETTINGS "HTTP Settings" -#define D_HTTP_FTP_SETTINGS "FTP Settings" -#define D_HTTP_WIFI_SETTINGS "Wifi Settings" -#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" -#define D_HTTP_MQTT_SETTINGS "MQTT Settings" -#define D_HTTP_GPIO_SETTINGS "GPIO Settings" -#define D_HTTP_MDNS_SETTINGS "mDNS Settings" -#define D_HTTP_TELNET_SETTINGS "Telnet Settings" -#define D_HTTP_DEBUG_SETTINGS "Debug Settings" -#define D_HTTP_GUI_SETTINGS "Display Settings" -#define D_HTTP_SAVE_SETTINGS "Save Settings" -#define D_HTTP_UPLOAD_FILE "Upload File" -#define D_HTTP_ERASE_DEVICE "Reset All Settings" -#define D_HTTP_ADD_GPIO "Add New Pin" -#define D_HTTP_BACK "Back" -#define D_HTTP_REFRESH "Refresh" -#define D_HTTP_PREV_PAGE "Prev Page" -#define D_HTTP_NEXT_PAGE "Next Page" -#define D_HTTP_CALIBRATE "Calibrate" -#define D_HTTP_ANTIBURN "Run Anti Burn-in" -#define D_HTTP_SCREENSHOT "Screenshot" -#define D_HTTP_FILE_BROWSER "File Editor" -#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade" -#define D_HTTP_UPDATE_FIRMWARE "Update Firmware" -#define D_HTTP_FACTORY_RESET "Factory Reset" -#define D_HTTP_MAIN_MENU "Main Menu" -#define D_HTTP_REBOOT "Restart" -#define D_HTTP_CONFIGURATION "Configuration" -#define D_HTTP_CONFIG_CHANGED \ - "The configuration has changed, please click Restart to save changes to flash." -#define D_HTTP_SENDING_PAGE "Sent %S page to %s" -#define D_HTTP_FOOTER "by Francis Van Roie" +#define D_HTTP_HTTP_SETTINGS "HTTP-inställningar" +#define D_HTTP_FTP_SETTINGS "FTP-inställningar" +#define D_HTTP_WIFI_INSTÄLLNINGAR "Wifi-inställningar" +#define D_HTTP_WIREGUARD_INSTÄLLNINGAR "WireGuard inställningar" +#define D_HTTP_MQTT_INSTÄLLNINGAR "MQTT-inställningar" +#define D_HTTP_GPIO_SETTINGS "GPIO-inställningar" +#define D_HTTP_MDNS_INSTÄLLNINGAR "mDNS-inställningar" +#define D_HTTP_TELNET_INSTÄLLNINGAR "Telnet-inställningar" +#define D_HTTP_DEBUG_INSTÄLLNINGAR "Debug-inställningar" +#define D_HTTP_GUI_INSTÄLLNINGAR "Visningsinställningar" +#define D_HTTP_SAVE_SETTINGS "Spara inställningar" +#define D_HTTP_UPLOAD_FILE "Ladda upp fil" +#define D_HTTP_ERASE_DEVICE "Återställ alla inställningar" +#define D_HTTP_ADD_GPIO "Lägg till ny GPIO" +#define D_HTTP_BACK "Tillbaka" +#define D_HTTP_REFRESH "Uppdatera" +#define D_HTTP_PREV_PAGE "Föregående sida" +#define D_HTTP_NEXT_PAGE "Nästa sida" +#define D_HTTP_CALIBRATE "Kalibrera" +#define D_HTTP_ANTIBURN "Kör Anti Burn-in" +#define D_HTTP_SCREENSHOT "Skärmdump" +#define D_HTTP_FILE_BROWSER "Filredigerare" +#define D_HTTP_FIRMWARE_UPGRADE "Uppgradering av fast programvara" +#define D_HTTP_UPDATE_FIRMWARE "Uppdatera fast programvara" +#define D_HTTP_FACTORY_RESET "Fabriksåterställning" +#define D_HTTP_MAIN_MENU "Huvudmeny" +#define D_HTTP_REBOOT "Omstart" +#define D_HTTP_CONFIGURATION "Konfiguration" +#define D_HTTP_CONFIG_CHANGED \ + "Konfigurationen har ändrats, klicka på Starta om för att spara ändringar." +#define D_HTTP_SENDING_PAGE "Skickat %S sida till %s" +#define D_HTTP_FOOTER "av Francis Van Roie" #define D_INFO_VERSION "Version" -#define D_INFO_BUILD_DATETIME "Build DateTime" -#define D_INFO_ENVIRONMENT "Environment" +#define D_INFO_BUILD_DATETIME "Byggd datum/tid" +#define D_INFO_ENVIRONMENT "Miljö" #define D_INFO_UPTIME "Uptime" -#define D_INFO_FREE_HEAP "Free Heap" -#define D_INFO_FREE_BLOCK "Free Block" -#define D_INFO_DEVICE_MEMORY "Device Memory" -#define D_INFO_LVGL_MEMORY "LVGL Memory" -#define D_INFO_TOTAL_MEMORY "Total" -#define D_INFO_FREE_MEMORY "Free" -#define D_INFO_FRAGMENTATION "Fragmentation" -#define D_INFO_PSRAM_FREE "PSRam Free" -#define D_INFO_PSRAM_SIZE "PSRam Size" -#define D_INFO_FLASH_SIZE "Flash Size" -#define D_INFO_SKETCH_USED "Program Size Used" -#define D_INFO_SKETCH_FREE "Program Size Free" -#define D_INFO_FS_SIZE "Filesystem Size" -#define D_INFO_FS_USED "Filesystem Used" -#define D_INFO_FS_FREE "Filesystem Free" -#define D_INFO_MODULE "Module" -#define D_INFO_MODEL "Model" -#define D_INFO_FREQUENCY "Frequency" -#define D_INFO_CORE_VERSION "Core Version" -#define D_INFO_RESET_REASON "Reset Reason" +#define D_INFO_FREE_HEAP "Ledig Heap" +#define D_INFO_FREE_BLOCK "Lediga Block" +#define D_INFO_DEVICE_MEMORY "Enhetsminne" +#define D_INFO_LVGL_MEMORY "LVGL-minne" +#define D_INFO_TOTAL_MEMORY "Totalt" +#define D_INFO_FREE_MEMORY "Ledigt" +#define D_INFO_FRAGMENTATION "Fragmentering" +#define D_INFO_PSRAM_FREE "Ledigt PSRam" +#define D_INFO_PSRAM_SIZE "PSRam storlek" +#define D_INFO_FLASH_SIZE "Flash storlek" +#define D_INFO_SKETCH_USED "Använd programstorlek" +#define D_INFO_SKETCH_FREE "Ledig programstorlek" +#define D_INFO_FS_SIZE "Storlek på filsystem" +#define D_INFO_FS_USED "Använt av filsystem" +#define D_INFO_FS_FREE "Filsystem ledigt" +#define D_INFO_MODULE "Modul" +#define D_INFO_MODEL "Modell" +#define D_INFO_FREQUENCY "Frekvens" +#define D_INFO_CORE_VERSION "Core version" +#define D_INFO_RESET_REASON "Omstartsorsak" #define D_INFO_STATUS "Status" #define D_INFO_SERVER "Server" #define D_INFO_USERNAME "Username" -#define D_INFO_CLIENTID "Client ID" -// #define D_INFO_CONNECTED "Connected" -// #define D_INFO_DISCONNECTED "Disconnected" -#define D_INFO_RECEIVED "Received" -#define D_INFO_PUBLISHED "Published" -#define D_INFO_FAILED "Failed" +#define D_INFO_CLIENTID "Klient-ID" +// #define D_INFO_CONNECTED "Ansluten" +// #define D_INFO_DISCONNECTED "Frånkopplad" +#define D_INFO_RECEIVED "Mottaget" +#define D_INFO_PUBLISHED "Publicerat" +#define D_INFO_FAILED "Misslyckade" #define D_INFO_ETHERNET "Ethernet" #define D_INFO_WIFI "Wifi" #define D_INFO_WIREGUARD "WireGuard" -#define D_INFO_LINK_SPEED "Link Speed" -#define D_INFO_FULL_DUPLEX "Full Duplex" +#define D_INFO_LINK_SPEED "Länkhastighet" +#define D_INFO_FULL_DUPLEX "Full duplex" #define D_INFO_BSSID "BSSID" #define D_INFO_SSID "SSID" -#define D_INFO_RSSI "Signal Strength" -#define D_INFO_IP_ADDRESS "IP Address" -#define D_INFO_MAC_ADDRESS "MAC Address" +#define D_INFO_RSSI "Signalstyrka" +#define D_INFO_IP_ADDRESS "IP-adress" +#define D_INFO_MAC_ADDRESS "MAC-adress" #define D_INFO_GATEWAY "Gateway" -#define D_INFO_DNS_SERVER "DNS Server" -#define D_INFO_ENDPOINT_IP "Endpoint IP" -#define D_INFO_ENDPOINT_PORT "Endpoint Port" +#define D_INFO_DNS_SERVER "DNS-server" +#define D_INFO_ENDPOINT_IP "Slutpunkt IP" +#define D_INFO_ENDPOINT_PORT "Slutpunkt port" -#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:" -#define D_OOBE_SCAN_TO_CONNECT "Scan to connect" +#define D_OOBE_MSG "Tryck på skärmen för att konfigurera WiFi eller ansluta till denna accesspunkt:" +#define D_OOBE_SCAN_TO_CONNECT "Skanna för att ansluta" -#define D_WIFI_CONNECTING_TO "Connecting to %s" -#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..." -#define D_WIFI_RSSI_EXCELLENT "Excellent" -#define D_WIFI_RSSI_GOOD "Good" -#define D_WIFI_RSSI_FAIR "Fair" -#define D_WIFI_RSSI_WEAK "Weak" -#define D_WIFI_RSSI_BAD "Very bad" +#define D_WIFI_CONNECTING_TO "Ansluter till %s" +#define D_WIFI_CONNECTED_TO "Ansluten till %s, begär IP..." +#define D_WIFI_RSSI_EXCELLENT "Utmärkt" +#define D_WIFI_RSSI_GOOD "Bra" +#define D_WIFI_RSSI_FAIR "Hygglig" +#define D_WIFI_RSSI_WEAK "Svag" +#define D_WIFI_RSSI_BAD "Mycket dålig" -#define D_WG_INITIALIZED "Initialized" -#define D_WG_BAD_CONFIG "Missing or bad configuration" +#define D_WG_INITIALIZED "Initierad" +#define D_WG_BAD_CONFIG "Saknad eller felaktig konfiguration" -#define D_GPIO_SWITCH "Switch" -#define D_GPIO_BUTTON "Push Button" -#define D_GPIO_TOUCH "Capacitive Touch" -#define D_GPIO_LED "Led" -#define D_GPIO_LED_R "Mood Red" -#define D_GPIO_LED_G "Mood Green" -#define D_GPIO_LED_B "Mood Blue" -#define D_GPIO_POWER_RELAY "Power Relay" -#define D_GPIO_LIGHT_RELAY "Light Relay" +#define D_GPIO_SWITCH "Omkopplare" +#define D_GPIO_BUTTON "Tryckknapp" +#define D_GPIO_TOUCH "Kapacitiv beröring" +#define D_GPIO_LED "Lysdiod" +#define D_GPIO_LED_R "Stämning röd" +#define D_GPIO_LED_G "Stämning grön" +#define D_GPIO_LED_B "Stämning blå" +#define D_GPIO_POWER_RELAY "Effektrelä" +#define D_GPIO_LIGHT_RELAY "Relä" #define D_GPIO_PWM "PWM" #define D_GPIO_DAC "DAC" -#define D_GPIO_SERIAL_DIMMER "Serial Dimmer" -#define D_GPIO_UNKNOWN "Unknown" -#define D_GPIO_PIN "Pin" -#define D_GPIO_GROUP "Group" -#define D_GPIO_GROUP_NONE "None" +#define D_GPIO_SERIAL_DIMMER "Seriell dimmer" +#define D_GPIO_UNKNOWN "Okänt" +#define D_GPIO_PIN "GPIO" +#define D_GPIO_GROUP "Grupp" +#define D_GPIO_GROUP_NONE "Ingen" #define D_GPIO_STATE_NORMAL "Normal" -#define D_GPIO_STATE_INVERTED "Inverted" +#define D_GPIO_STATE_INVERTED "Inverterad" #endif \ No newline at end of file From be953b904a389b723e7a8590f0eae7fa0f09df2e Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:49:56 +0200 Subject: [PATCH 082/142] New translations en.json (Swedish) --- data/sv_SE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/sv_SE.json b/data/sv_SE.json index 33672264..a500ed96 100644 --- a/data/sv_SE.json +++ b/data/sv_SE.json @@ -82,7 +82,7 @@ }, "wifi": { "title": "Inställningar för WiFi", - "btn": "Inställningar för Wifi", + "btn": "Inställningar för WiFi", "ssid": "SSID" }, "wg": { @@ -124,8 +124,8 @@ }, "gpio": "GPIO Inställningar", "debug": { - "title": "Debug inställningar", - "btn": "Debug inställningar", + "title": "Debug Inställningar", + "btn": "Debug Inställningar", "baud": "Datahastighet", "tele": "Telemetri period", "ansi": "Använd ANSI-kod", From 24c39a4b7155ddfb9c0fa391cf926d234663a1f9 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 28 Aug 2024 23:04:50 +0200 Subject: [PATCH 083/142] New translations en_us.h (Swedish) --- src/lang/sv_SE.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/sv_SE.h b/src/lang/sv_SE.h index 6659ffce..35e7628c 100644 --- a/src/lang/sv_SE.h +++ b/src/lang/sv_SE.h @@ -1,5 +1,5 @@ -// Denna översättningsfil bibehålls på https://crowdin.com/project/openhasp/ -// Redigera inte direkt! +// This translation file is maintained on https://crowdin.com/project/openhasp/ +// Do not edit directly! #ifndef HASP_LANG_SV_SE_H #define HASP_LANG_SV_SE_H From 1e0b85b3e4ba09d71be059ba2ece161483cc777b Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:32:09 +0200 Subject: [PATCH 084/142] New translations en.json (Swedish) --- data/sv_SE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/sv_SE.json b/data/sv_SE.json index a500ed96..f308542f 100644 --- a/data/sv_SE.json +++ b/data/sv_SE.json @@ -70,11 +70,11 @@ }, "about": { "credits": "Baserat på det tidigare arbetet av följande utvecklare av öppen källkod:", - "copyright": "Upphovsrätt ", + "copyright": "Copyright ", "rights": "Alla rättigheter förbehållna.", - "clause1": "Härmed beviljas tillstånd, utan kostnad, till alla personer som erhåller en kopia av denna programvara och tillhörande dokumentation (\"Programvaran\"), att hantera Programvaran utan begränsningar, inklusive men inte begränsat till rätten att använda, kopiera, modifiera, sammanfoga, publicera, distribuera, underlicensiera och/eller sälja kopior av Programvaran, samt att tillåta personer till vilka Programvaran tillhandahålls att göra detsamma, under förutsättning av följande villkor:", - "clause2": "Ovanstående meddelande om upphovsrätt och detta tillståndsmeddelande ska inkluderas i alla kopior eller väsentliga delar av programvaran.", - "clause3": "PROGRAMVARAN TILLHANDAHÅLLS \"I BEFINTLIGT SKICK\", UTAN NÅGON SOM HELST GARANTI, VARE SIG UTTRYCKLIG ELLER UNDERFÖRSTÅDD, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER OM SÄLJBARHET, LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL OCH ICKE-INTRÅNG. UNDER INGA OMSTÄNDIGHETER SKALL FÖRFATTARNA ELLER UPPHOVSRÄTTSINNEHAVARNA VARA ANSVARIGA FÖR NÅGON TYP AV KRAV, SKADOR ELLER ANNAT ANSVAR, VARE SIG I KONTRAKT, SKADESTÅND ELLER ANNAT, SOM UPPSTÅR FRÅN, UR ELLER I SAMBAND MED PROGRAMVARAN ELLER ANVÄNDNINGEN ELLER ANDRA ÅTGÄRDER I SAMBAND MED PROGRAMVARAN.", + "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "mit": "MIT Licens", "bsd": "BSD Licens", "freebsd": "FreeBSD Licens", From 707078560d0e451e03ac323480e2457a2d8dea37 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 29 Aug 2024 15:58:44 +0200 Subject: [PATCH 085/142] Disable useSoftTabs #788 --- data/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/script.js b/data/script.js index 93a1d96d..7458a17c 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 52259a34a0c66f56fae5b01acd305793e3389a6d Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 29 Aug 2024 23:07:19 +0200 Subject: [PATCH 086/142] Update ace.js to 1.36.1 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 1a112286..cc93ecf5 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 7458a17c..1ad21431 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 53bd3281783c78be7d132ad5c0306de0c124b397 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 30 Aug 2024 17:19:14 +0200 Subject: [PATCH 087/142] Update ace.js to 1.36.2 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index cc93ecf5..87e87abc 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 1ad21431..ec3ae438 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From ff83c7717c409db748501567e66f1eac3a36152f Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 31 Aug 2024 23:43:08 +0200 Subject: [PATCH 088/142] Test platform 5.4.0 for rc14 #643 --- platformio.ini | 2 +- user_setups/esp32/_esp32.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 90ddcee9..13f1f16b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -75,7 +75,7 @@ build_flags = -D HASP_VER_MAJ=0 -D HASP_VER_MIN=7 ;-D HASP_VER_REV=4 - -D HASP_VER_REV=0-rc13 + -D HASP_VER_REV=0-rc14 ;-D HASP_VER_REV=4-rc1 ${override.build_flags} diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini index 93079589..9d82084a 100644 --- a/user_setups/esp32/_esp32.ini +++ b/user_setups/esp32/_esp32.ini @@ -145,8 +145,8 @@ framework = arduino ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip ;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip ;;;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.11.01/platform-espressif32.zip -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip -;platform = espressif32@5.3.0 +;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip +platform = espressif32@5.4.0 lib_ignore = ${esp32.lib_ignore} LittleFS_esp32 ; Not needed for Arduino v2 From 80a9ddb3ea038f1d5702dd39637b0f9892689092 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sun, 1 Sep 2024 16:21:18 +0200 Subject: [PATCH 089/142] Downgrade platform --- user_setups/esp32/_esp32.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini index 9d82084a..7243e02e 100644 --- a/user_setups/esp32/_esp32.ini +++ b/user_setups/esp32/_esp32.ini @@ -145,8 +145,8 @@ framework = arduino ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip ;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip ;;;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.11.01/platform-espressif32.zip -;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip -platform = espressif32@5.4.0 +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip +;platform = espressif32@5.4.0 lib_ignore = ${esp32.lib_ignore} LittleFS_esp32 ; Not needed for Arduino v2 From 0f64a3b0f457414a534e62855885af05b35d0c05 Mon Sep 17 00:00:00 2001 From: Shubham Sharma <10323297+shubham-vunet@users.noreply.github.com> Date: Wed, 2 Oct 2024 21:17:45 +0530 Subject: [PATCH 090/142] Add "Lilygo T-Panel v1.2" pinmap and touch screen --- src/drv/tft/tft_driver_arduinogfx.cpp | 22 ++++++- src/sys/svc/hasp_http_async.cpp | 2 +- user_setups/esp32s3/lilygo-t-panel.ini | 87 ++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 user_setups/esp32s3/lilygo-t-panel.ini diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index ae73d504..5c80d750 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -25,7 +25,27 @@ void ArduinoGfx::init(int w, int h) { LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); -#if(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) +#if(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_PANEL) + + // pinMode(TFT_SCLK, OUTPUT); + // pinMode(TFT_MOSI, OUTPUT); + // pinMode(TFT_MISO, OUTPUT); + Arduino_DataBus* bus = new Arduino_XL9535SWSPI(17 /* SDA */, 18 /* SCL */, -1 /* XL PWD */, 17 /* XL CS */, + 15 /* XL SCK */, 16 /* XL MOSI */); + Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel( + -1 /* DE */, TFT_VSYNC /* VSYNC */, TFT_HSYNC /* HSYNC */, TFT_PCLK /* PCLK */, + TFT_B0 /* B0 */, TFT_B1 /* B1 */, TFT_B2 /* B2 */, TFT_B3 /* B3 */, TFT_B4 /* B4 */, + TFT_G0 /* G0 */, TFT_G1 /* G1 */, TFT_G2 /* G2 */, TFT_G3 /* G3 */, TFT_G4 /* G4 */, TFT_G5 /* G5 */, + TFT_R0 /* R0 */, TFT_R1 /* R1 */, TFT_R2 /* R2 */, TFT_R3 /* R3 */, TFT_R4 /* R4 */, + 1 /* hsync_polarity */, 20 /* hsync_front_porch */, 2 /* hsync_pulse_width */, 0 /* hsync_back_porch */, + 1 /* vsync_polarity */, 30 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 1 /* vsync_back_porch */, + 10 /* pclk_active_neg */, 6000000L /* prefer_speed */, false /* useBigEndian */, + 0 /* de_idle_high*/, 0 /* pclk_idle_high */); + + tft = new Arduino_RGB_Display(TFT_WIDTH /* width */, TFT_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */, + bus, -1 /* RST */, st7701_sensecap_indicator_init_operations, sizeof(st7701_sensecap_indicator_init_operations)); + +#elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) Wire.begin(8 /* SDA */, 48 /* SCL */, 800000L /* speed */); Arduino_DataBus* bus = new Arduino_XL9535SWSPI(8 /* SDA */, 48 /* SCL */, 2 /* XL PWD */, 3 /* XL CS */, 5 /* XL SCK */, 4 /* XL MOSI */); diff --git a/src/sys/svc/hasp_http_async.cpp b/src/sys/svc/hasp_http_async.cpp index e4e882ef..5a561bca 100644 --- a/src/sys/svc/hasp_http_async.cpp +++ b/src/sys/svc/hasp_http_async.cpp @@ -1311,7 +1311,7 @@ void webHandleGuiConfig(AsyncWebServerRequest* request) httpMessage += getOption(-1, F("None"), bcklpin == -1); #if defined(ARDUINO_ARCH_ESP32) add_gpio_select_option(httpMessage, 5, bcklpin); // D8 on ESP32 for D1 mini 32 - add_gpio_select_option(httpMessage, 12, bcklpin); // TFT_LED on the Liligo Pi + add_gpio_select_option(httpMessage, 12, bcklpin); // TFT_LED on the Lilygo Pi add_gpio_select_option(httpMessage, 13, bcklpin); // TFT_LED on the D1 R32 + Waveshare add_gpio_select_option(httpMessage, 15, bcklpin); // TFT_LED on the AZ Touch add_gpio_select_option(httpMessage, 16, bcklpin); // D4 on ESP32 for D1 mini 32 diff --git a/user_setups/esp32s3/lilygo-t-panel.ini b/user_setups/esp32s3/lilygo-t-panel.ini new file mode 100644 index 00000000..d0f4868e --- /dev/null +++ b/user_setups/esp32s3/lilygo-t-panel.ini @@ -0,0 +1,87 @@ +;***************************************************; +; Lilygo T-Panel S3, 4-Inch Touch Screen ; +; - Custom esp32-s3 board ; +; - st7701s TFT ; +; - CST3240 touch controller ; +; - IO Expansion: XL9535 ; +;***************************************************; + +[lilygo-t-panel] +extends = arduino_esp32s3_v2 +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi + +build_flags = + -D HASP_MODEL="Lilygo T-Panel v1.2" + ${arduino_esp32s3_v2.build_flags} + ${esp32s3.ps_ram} + -DLILYGO_T_PANEL + -D LILYGO_T_PANEL=1 + ;-DARDUINO_USB_CDC_ON_BOOT + ;-DUSE_USB_CDC_CONSOLE + +;region -- ArduinoGFX build options ------------------------ + -D HASP_USE_ARDUINOGFX=1 + -D HASP_LV_USE_SW_ROTATE=1 + -D ST7701_DRIVER=1 + -D TFT_WIDTH=480 + -D TFT_HEIGHT=480 + ; Bus Settings + -D TFT_HSYNC=39 + -D TFT_VSYNC=40 + -D TFT_PCLK=41 + -D TFT_B0=1 + -D TFT_B1=2 + -D TFT_B2=3 + -D TFT_B3=4 + -D TFT_B4=5 + -D TFT_G0=6 + -D TFT_G1=7 + -D TFT_G2=8 + -D TFT_G3=9 + -D TFT_G4=10 + -D TFT_G5=11 + -D TFT_R0=12 + -D TFT_R1=13 + -D TFT_R2=42 + -D TFT_R3=46 + -D TFT_R4=45 + -D TFT_BCKL=14 + + + -D TFT_HSYNC_POLARITY=1 + -D TFT_HSYNC_FRONT_PORCH=10 + -D TFT_HSYNC_PULSE_WIDTH=8 + -D TFT_HSYNC_BACK_PORCH=50 + -D TFT_VSYNC_POLARITY=1 + -D TFT_VSYNC_FRONT_PORCH=10 + -D TFT_VSYNC_PULSE_WIDTH=8 + -D TFT_VSYNC_BACK_PORCH=20 + -D TFT_PCLK_ACTIVE_NEG=1 + -D TFT_PREFER_SPEED=12000000 + -D TFT_AUTO_FLUSH=1 + ; Touch Settings + -D TOUCH_WIDTH=480 + -D TOUCH_HEIGHT=480 + -D TOUCH_SDA=17 + -D TOUCH_SCL=18 + -D TOUCH_INT=21 + -D TOUCH_RST=4 + -D TOUCH_CS=-1 + -D TOUCH_DRIVER=0x3240 + ; -D TOUCH_IRQ=-1 + ; -D I2C_TOUCH_FREQUENCY=400000 + ; -D I2C_TOUCH_ADDRESS=0x48 + ; -D I2C_TOUCH_PORT=1 + +;endregion + +lib_deps = + ${arduino_esp32s3_v2.lib_deps} +; moononournation/GFX Library for Arduino@1.4.0 ; Update needs modification of custom PCA class ; ${ft6336.lib_deps} +; ; git+https://github.com/admarschoonen/TouchLib.git + ; moononournation/GFX Library for Arduino@1.4.0 ; +[env:lilygo-t-panel_16MB] +extends = lilygo-t-panel, flash_16mb +monitor_port = COM8 +upload_port = COM8 From f61f0bdfa5da5dfb4106ec0898d56f870362bd2f Mon Sep 17 00:00:00 2001 From: Shubham Sharma <10323297+shubham-vunet@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:28:51 +0530 Subject: [PATCH 091/142] Fix code --- src/drv/tft/tft_driver_arduinogfx.cpp | 4 ---- user_setups/esp32s3/lilygo-t-panel.ini | 22 +++++----------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 5c80d750..be22c08e 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -26,10 +26,6 @@ void ArduinoGfx::init(int w, int h) LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); #if(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_PANEL) - - // pinMode(TFT_SCLK, OUTPUT); - // pinMode(TFT_MOSI, OUTPUT); - // pinMode(TFT_MISO, OUTPUT); Arduino_DataBus* bus = new Arduino_XL9535SWSPI(17 /* SDA */, 18 /* SCL */, -1 /* XL PWD */, 17 /* XL CS */, 15 /* XL SCK */, 16 /* XL MOSI */); Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel( diff --git a/user_setups/esp32s3/lilygo-t-panel.ini b/user_setups/esp32s3/lilygo-t-panel.ini index d0f4868e..54d5f600 100644 --- a/user_setups/esp32s3/lilygo-t-panel.ini +++ b/user_setups/esp32s3/lilygo-t-panel.ini @@ -2,7 +2,7 @@ ; Lilygo T-Panel S3, 4-Inch Touch Screen ; ; - Custom esp32-s3 board ; ; - st7701s TFT ; -; - CST3240 touch controller ; +; - CST3240 touch controller (WIP) ; ; - IO Expansion: XL9535 ; ;***************************************************; @@ -48,18 +48,6 @@ build_flags = -D TFT_R4=45 -D TFT_BCKL=14 - - -D TFT_HSYNC_POLARITY=1 - -D TFT_HSYNC_FRONT_PORCH=10 - -D TFT_HSYNC_PULSE_WIDTH=8 - -D TFT_HSYNC_BACK_PORCH=50 - -D TFT_VSYNC_POLARITY=1 - -D TFT_VSYNC_FRONT_PORCH=10 - -D TFT_VSYNC_PULSE_WIDTH=8 - -D TFT_VSYNC_BACK_PORCH=20 - -D TFT_PCLK_ACTIVE_NEG=1 - -D TFT_PREFER_SPEED=12000000 - -D TFT_AUTO_FLUSH=1 ; Touch Settings -D TOUCH_WIDTH=480 -D TOUCH_HEIGHT=480 @@ -69,10 +57,10 @@ build_flags = -D TOUCH_RST=4 -D TOUCH_CS=-1 -D TOUCH_DRIVER=0x3240 - ; -D TOUCH_IRQ=-1 - ; -D I2C_TOUCH_FREQUENCY=400000 - ; -D I2C_TOUCH_ADDRESS=0x48 - ; -D I2C_TOUCH_PORT=1 + ; -D TOUCH_IRQ= + ; -D I2C_TOUCH_FREQUENCY= + ; -D I2C_TOUCH_ADDRESS= + ; -D I2C_TOUCH_PORT= ;endregion From b55efe007d5bc6fba4b97111d928aad3b0087656 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 5 Oct 2024 00:51:03 +0200 Subject: [PATCH 092/142] Add Lanbon L9 for testing --- src/drv/tft/tft_driver_arduinogfx.cpp | 13 ++++- user_setups/esp32s3/lanbon_l9.ini | 68 +++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 user_setups/esp32s3/lanbon_l9.ini diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index ae73d504..c8eb8961 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -25,7 +25,18 @@ void ArduinoGfx::init(int w, int h) { LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); -#if(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) +#if(TFT_WIDTH == 170) && (TFT_HEIGHT == 320) + Arduino_DataBus *bus = new Arduino_ESP32PAR8Q( + TFT_DC, TFT_CS, TFT_WR, TFT_RD, + TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7); + Arduino_GFX *gfx = new Arduino_ST7789(bus, + TFT_RST /* RST */, TFT_ROTATION /* rotation */, true /* IPS */, + TFT_WIDTH /* width */, TFT_HEIGHT /* height */, + 35 /* col offset 1 */, 0 /* row offset 1 */, + 35 /* col offset 2 */, 0 /* row offset 2 */ + ); + +#elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) Wire.begin(8 /* SDA */, 48 /* SCL */, 800000L /* speed */); Arduino_DataBus* bus = new Arduino_XL9535SWSPI(8 /* SDA */, 48 /* SCL */, 2 /* XL PWD */, 3 /* XL CS */, 5 /* XL SCK */, 4 /* XL MOSI */); diff --git a/user_setups/esp32s3/lanbon_l9.ini b/user_setups/esp32s3/lanbon_l9.ini new file mode 100644 index 00000000..9dfb0616 --- /dev/null +++ b/user_setups/esp32s3/lanbon_l9.ini @@ -0,0 +1,68 @@ +;***************************************************; +; Lanbon L9 with ST7789 ; +;***************************************************; + +[env:lanbon_l9] +extends = arduino_esp32s3_v2, flash_16mb +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi + +build_flags = + ${env.build_flags} + ${esp32s3.build_flags} + ${esp32s3.ps_ram} + -D HASP_MODEL="Lanbon L9" + ;-D ARDUINO_USB_MODE=0 + ;-DARDUINO_USB_CDC_ON_BOOT + ;-DUSE_USB_CDC_CONSOLE + +;region -- TFT_eSPI build options ------------------------ + -D ST7789_DRIVER=1 + -D HASP_USE_ARDUINOGFX=1 + -D TFT_WIDTH=170 + -D TFT_HEIGHT=320 + -D TFT_ROTATION=0 ; see TFT_ROTATION values + ; -D TFT_INVERSION_OFF ; for normal colors + ;-D TFT_INVERSION_ON + ;-D TFT_RGB_ORDER=0 ; Colour order Blue-Green-Red + ;-D INVERT_COLORS=1 ; for inverted colors + + -D TFT_RST=-1 + -D TFT_CS=21 + -D TFT_DC=17 + -D TFT_WR=13 + -D TFT_RD=18 + -D TFT_D0=6 + -D TFT_D1=7 + -D TFT_D2=15 + -D TFT_D3=16 + -D TFT_D4=10 + -D TFT_D5=9 + -D TFT_D6=46 + -D TFT_D7=3 + -D TFT_BCKL=42 + ; Touch Setttings + -D TOUCH_WIDTH=170 + -D TOUCH_HEIGHT=320 + -D TOUCH_DRIVER=0x911 + -D TOUCH_SCL=0 + -D TOUCH_SDA=35 + -D TOUCH_IRQ=-1 + -D TOUCH_RST=-1 + -D I2C_TOUCH_ADDRESS=0x5d ; or 0x14 + -D I2C_TOUCH_FREQUENCY=400000 +;endregion + +;region -- Library options ------------------------------- +lib_deps = + ${env.lib_deps} + ${esp32s3.lib_deps} + ${arduino_esp32s3_v2.lib_deps} + ${arduinogfx.lib_deps} + ${goodix.lib_deps} + +lib_ignore = + ${env.lib_ignore} + ${esp32s3.lib_ignore} + ${arduino_esp32s3_v2.lib_ignore} +;endregion \ No newline at end of file From 31a1272c5ea809aa975143b5316215b21d0facd7 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 8 Oct 2024 20:00:41 +0200 Subject: [PATCH 093/142] Fix dropdown text when show_selected=0 --- src/hasp/hasp_attribute.cpp | 1 + src/hasp/hasp_attribute_helper.h | 25 +++++++++++++++++++++++++ src/hasp/hasp_event.cpp | 8 ++++++-- src/hasp/hasp_object.cpp | 1 + 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index b8b42eca..7bba5ed4 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -1751,6 +1751,7 @@ static hasp_attribute_type_t attribute_common_text(lv_obj_t* obj, uint16_t attr_ {LV_HASP_LABEL, ATTR_TEXT, my_label_set_text, my_label_get_text}, {LV_HASP_LABEL, ATTR_TEMPLATE, my_obj_set_template, my_obj_get_template}, {LV_HASP_CHECKBOX, ATTR_TEXT, lv_checkbox_set_text, lv_checkbox_get_text}, + {LV_HASP_DROPDOWN, ATTR_TEXT, my_dropdown_set_text, my_dropdown_get_text}, {LV_HASP_TABVIEW, ATTR_TEXT, my_tabview_set_text, my_tabview_get_text}, {LV_HASP_TEXTAREA, ATTR_TEXT, lv_textarea_set_text, lv_textarea_get_text}, {LV_HASP_TAB, ATTR_TEXT, my_tab_set_text, my_tab_get_text}, diff --git a/src/hasp/hasp_attribute_helper.h b/src/hasp/hasp_attribute_helper.h index a88e716f..b900182b 100644 --- a/src/hasp/hasp_attribute_helper.h +++ b/src/hasp/hasp_attribute_helper.h @@ -472,6 +472,31 @@ lv_obj_t* FindButtonLabel(lv_obj_t* btn) return NULL; } +// OK - lvgl does not return a const char * +static const char* my_dropdown_get_text(const lv_obj_t* dd) +{ + const char* str_p = lv_dropdown_get_text((lv_obj_t*)dd); + return str_p ? str_p : ""; +} + +// OK - lvgl does not return a const char * +static void my_dropdown_set_text(lv_obj_t* dd, const char* text) +{ + size_t len = 0; + if(text) len = strlen(text) + 1; + + // release previous text + char* str_p = (char*)lv_dropdown_get_text(dd); + if(str_p) lv_mem_free(str_p); + + // reserve and copy new text + str_p = (char*)lv_mem_alloc(len); + if(str_p != NULL) strncpy(str_p, text, len); + + lv_dropdown_set_text((lv_obj_t*)dd, str_p); // library does not return const + lv_obj_invalidate(dd); // Needed if old ptr is equal to new ptr +} + // OK - lvgl does not return a const char * static const char* my_label_get_text(const lv_obj_t* label) { diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 051a65c8..ed801f8b 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -99,6 +99,10 @@ void delete_event_handler(lv_obj_t* obj, lv_event_t event) my_obj_del_task(obj); break; + case LV_HASP_DROPDOWN: + lv_mem_free(lv_dropdown_get_text(obj)); + break; + default: break; } @@ -302,8 +306,8 @@ static void event_object_selection_changed(lv_obj_t* obj, uint8_t eventid, int16 char eventname[8]; Parser::get_event_name(eventid, eventname, sizeof(eventname)); if(const char* tag = my_obj_get_tag(obj)) - snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"val\":%d,\"text\":%s,\"tag\":%s}"), eventname, - val, serialized_text, tag); + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"val\":%d,\"text\":%s,\"tag\":%s}"), eventname, val, + serialized_text, tag); else snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"val\":%d,\"text\":%s}"), eventname, val, serialized_text); diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index a28d7946..2bf787e0 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -640,6 +640,7 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id) case HASP_OBJ_DROPDOWN: obj = lv_dropdown_create(parent_obj, NULL); if(obj) { + lv_dropdown_set_text(obj, NULL); // Clear default text lv_dropdown_set_draw_arrow(obj, true); // lv_dropdown_set_anim_time(obj, 200); lv_obj_set_top(obj, true); From e42b27f67aae765e1b7edd2a0ef375d33f8775f0 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 8 Oct 2024 22:35:01 +0200 Subject: [PATCH 094/142] LV_MEM_CUSTOM default allocators use PSram when available #810 --- include/lv_conf_v7.h | 4 ++-- include/lv_conf_v8.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/lv_conf_v7.h b/include/lv_conf_v7.h index 606203cc..20ad2966 100644 --- a/include/lv_conf_v7.h +++ b/include/lv_conf_v7.h @@ -116,8 +116,8 @@ typedef int16_t lv_coord_t; # define LV_MEM_AUTO_DEFRAG 1 #else /*LV_MEM_CUSTOM*/ #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ -#define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/ -#define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/ +#define LV_MEM_CUSTOM_ALLOC hasp_malloc /*Wrapper to malloc*/ +#define LV_MEM_CUSTOM_FREE hasp_free /*Wrapper to free*/ #endif /*LV_MEM_CUSTOM*/ #ifndef LV_VDB_SIZE diff --git a/include/lv_conf_v8.h b/include/lv_conf_v8.h index 494982d7..78bfb3ed 100644 --- a/include/lv_conf_v8.h +++ b/include/lv_conf_v8.h @@ -105,8 +105,8 @@ typedef int16_t lv_coord_t; # define LV_MEM_AUTO_DEFRAG 1 #else /*LV_MEM_CUSTOM*/ # define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ -# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/ -# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/ +# define LV_MEM_CUSTOM_ALLOC hasp_malloc /*Wrapper to malloc*/ +# define LV_MEM_CUSTOM_FREE hasp_free /*Wrapper to free*/ #endif /*LV_MEM_CUSTOM*/ /* Use the standard memcpy and memset instead of LVGL's own functions. From 735b4a170b6b7c7b39b484138d05fab6bf0e6950 Mon Sep 17 00:00:00 2001 From: Lars Michelsen Date: Fri, 11 Oct 2024 21:07:58 +0200 Subject: [PATCH 095/142] Fix support for Adafruit HUZZAH32 V2 ESP32 Featherwing 3.5 V2 * The board of "env:huzzah32-v2-featherwing-35-v2" was changed to adafruit_feather_esp32_v2 Previously it was pointing to the v1 board. See also: V1: https://github.com/platformio/platform-espressif32/blob/develop/boards/featheresp32.json V2: https://github.com/platformio/platform-espressif32/blob/develop/boards/adafruit_feather_esp32_v2.json * Fixed the port numbers * hasp_gpio_type_t::BUTTON had to be renamed because adafruit_feather_esp32_v2/pins_arduino.h defines a macro named BUTTON. --- src/sys/gpio/hasp_gpio.cpp | 14 +++++++------- src/sys/gpio/hasp_gpio.h | 4 ++-- src/sys/svc/hasp_http.cpp | 4 ++-- src/sys/svc/hasp_http_async.cpp | 6 +++--- .../esp32/huzzah32-v2-featherwing-35-v2.ini | 17 +++++++++-------- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 693eec7b..52b60a96 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -123,7 +123,7 @@ static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t but bool state = false; switch(eventType) { case AceButton::kEventPressed: - if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON) { + if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON_TYPE) { eventid = HASP_EVENT_ON; } else { eventid = HASP_EVENT_DOWN; @@ -146,7 +146,7 @@ static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t but // state = true; // do not repeat DOWN + LONG + HOLD // break; case AceButton::kEventReleased: - if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON) { + if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON_TYPE) { eventid = HASP_EVENT_OFF; } else { eventid = HASP_EVENT_RELEASE; @@ -253,7 +253,7 @@ static void gpio_setup_pin(uint8_t index) pinMode(gpio->pin, input_mode); gpio->max = 0; break; - case hasp_gpio_type_t::BUTTON: + case hasp_gpio_type_t::BUTTON_TYPE: if(gpio->btn) delete gpio->btn; gpio->btn = new AceButton(&buttonConfig, gpio->pin, default_state, index); gpio->power = gpio->btn->isPressedRaw(); @@ -849,7 +849,7 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA relay.add(gpioConfig[i].pin); break; - case BUTTON ... TOUCH: + case BUTTON_TYPE ... TOUCH: event.add(gpioConfig[i].pin); break; @@ -861,7 +861,7 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA dimmer.add(gpioConfig[i].pin); break; - // case BUTTON ... TOUCH: + // case BUTTON_TYPE ... TOUCH: case SWITCH: strcpy_P(description, PSTR("none")); break; @@ -955,7 +955,7 @@ void gpio_discovery(JsonObject& input, JsonArray& relay, JsonArray& light, JsonA } if((gpioConfig[i].type >= hasp_gpio_type_t::SWITCH && gpioConfig[i].type <= hasp_gpio_type_t::WINDOW)) { - // || (gpioConfig[i].type >= hasp_gpio_type_t::BUTTON && gpioConfig[i].type <= hasp_gpio_type_t::TOUCH)) { + // || (gpioConfig[i].type >= hasp_gpio_type_t::BUTTON_TYPE && gpioConfig[i].type <= hasp_gpio_type_t::TOUCH)) { JsonArray arr = input[description]; if(arr.isNull()) arr = input.createNestedArray(description); arr.add(gpioConfig[i].pin); @@ -1040,4 +1040,4 @@ bool gpioSetConfig(const JsonObject& settings) return changed; } -#endif // HASP_USE_CONFIG \ No newline at end of file +#endif // HASP_USE_CONFIG diff --git a/src/sys/gpio/hasp_gpio.h b/src/sys/gpio/hasp_gpio.h index 105f4460..559bc762 100644 --- a/src/sys/gpio/hasp_gpio.h +++ b/src/sys/gpio/hasp_gpio.h @@ -134,7 +134,7 @@ enum hasp_gpio_type_t { TAMPER = 0xBB, UPDATE = 0xBC, - BUTTON = 0xF0, + BUTTON_TYPE = 0xF0, BUTTON_TOGGLE_UP = 0xF1, BUTTON_TOGGLE_DOWN = 0xF2, BUTTON_TOGGLE_BOTH = 0xF3, @@ -153,4 +153,4 @@ enum hasp_gpio_type_t { } /* extern "C" */ #endif -#endif \ No newline at end of file +#endif diff --git a/src/sys/svc/hasp_http.cpp b/src/sys/svc/hasp_http.cpp index eba778bb..06af58d8 100644 --- a/src/sys/svc/hasp_http.cpp +++ b/src/sys/svc/hasp_http.cpp @@ -1804,7 +1804,7 @@ static void webHandleGpioConfig() switch(conf.type) { - case hasp_gpio_type_t::BUTTON: + case hasp_gpio_type_t::BUTTON_TYPE: httpMessage += D_GPIO_BUTTON; break; case hasp_gpio_type_t::SWITCH: @@ -2049,7 +2049,7 @@ static void webHandleGpioInput() httpMessage += F("

"); httpMessage += F("

Type "); - selected = (conf.type == hasp_gpio_type_t::BUTTON); - httpMessage += getOption(hasp_gpio_type_t::BUTTON, F(D_GPIO_BUTTON), selected); + selected = (conf.type == hasp_gpio_type_t::BUTTON_TYPE); + httpMessage += getOption(hasp_gpio_type_t::BUTTON_TYPE, F(D_GPIO_BUTTON), selected); selected = (conf.type == hasp_gpio_type_t::SWITCH); httpMessage += getOption(hasp_gpio_type_t::SWITCH, F(D_GPIO_SWITCH), selected); diff --git a/user_setups/esp32/huzzah32-v2-featherwing-35-v2.ini b/user_setups/esp32/huzzah32-v2-featherwing-35-v2.ini index 1cb762f8..59dbca63 100644 --- a/user_setups/esp32/huzzah32-v2-featherwing-35-v2.ini +++ b/user_setups/esp32/huzzah32-v2-featherwing-35-v2.ini @@ -6,8 +6,8 @@ ;***************************************************; [env:huzzah32-v2-featherwing-35-v2] -extends = arduino_esp32_v2, flash_4mb -board = featheresp32 +extends = arduino_esp32_v2, flash_8mb +board = adafruit_feather_esp32_v2 build_flags = -D HASP_MODEL="Adafruit HUZZAH32 V2 ESP32 Featherwing 3.5 V2" @@ -16,13 +16,14 @@ build_flags = -D LV_INDEV_DEF_READ_PERIOD=30 ;region -- TFT_eSPI build options ------------------------ ${lcd.featherwing-35-v2} - -D TFT_MISO=19 - -D TFT_MOSI=18 - -D TFT_SCLK=5 - -D TFT_DC=10 - -D TFT_CS=9 + -D TFT_MISO=21 ; GPIO21 / MISO + -D TFT_MOSI=19 ; GPIO19 / MOSI + -D TFT_SCLK=5 ; GPIO5 / SCK + -D TFT_DC=33 ; GPIO33 / D33 + -D TFT_CS=15 ; GPIO15 / D15 -D TFT_RST=-1 ; RST - -D TFT_BCKL=21 ; Solder the LITE pad to a PWM enabled pin of the ESP, like GPIO 21 + + -D TFT_BCKL=37 ; Solder the LITE pad to a PWM enabled pin of the ESP, like GPIO 21 ;endregion lib_deps = From 769f283b3c1f2c12974411e1c9dced02ed6e12be Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 12 Oct 2024 23:38:41 +0200 Subject: [PATCH 096/142] Add esp32-2432s028_v2 #396 --- .github/workflows/build.yaml | 2 +- src/drv/tft/tft_driver_lovyangfx.cpp | 7 ++- user_setups/esp32/esp32-2432s028.ini | 73 ++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2353593d..618d57f8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -51,7 +51,7 @@ jobs: - out: seeed-studios env: "sensecap-indicator-d1_8MB" - out: sunton - env: "esp32-2432s028r_4MB -e esp32-2432s028r-ili9342_4MB -e esp32-2432s032c_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB" + env: "esp32-2432s028r_4MB -e esp32-2432s028r-ili9342_4MB -e esp32-2432s028r_v2_4MB -e esp32-2432s032c_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB" - out: waveshare env: "esp32-one_ili9486 -e esp32-one_st7796" - out: wireless-tag diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index bc3854f9..798ee7ed 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -95,9 +95,8 @@ static lgfx::Bus_Parallel8* init_parallel_8_bus(Preferences* prefs, int8_t data_ cfg.pin_wr = prefs->getInt("wr", TFT_WR); cfg.pin_rs = prefs->getInt("rs", TFT_DC); #ifndef CONFIG_IDF_TARGET_ESP32C3 - cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); -#endif - + cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); +#endif #if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C3) uint8_t port = prefs->getUInt("i2s_port", 0); @@ -717,7 +716,7 @@ void LovyanGfx::init(int w, int h) cfg.dummy_read_bits = 1; cfg.readable = true; cfg.invert = INVERT_COLORS; - cfg.rgb_order = false; + cfg.rgb_order = (TFT_RGB_ORDER != 0); // true if the red and blue of the panel are swapped cfg.dlen_16bit = false; cfg.bus_shared = false; _panel_instance->config(cfg); diff --git a/user_setups/esp32/esp32-2432s028.ini b/user_setups/esp32/esp32-2432s028.ini index 338e60b2..136c1260 100644 --- a/user_setups/esp32/esp32-2432s028.ini +++ b/user_setups/esp32/esp32-2432s028.ini @@ -128,3 +128,76 @@ lib_deps = ;${tft_espi.lib_deps} ${lovyangfx.lib_deps} ;${goodix.lib_deps} + +[esp32-2432s028_v2] +extends = arduino_esp32_v2 +board = esp32dev +upload_speed = 921600 + +build_flags = + ${arduino_esp32_v2.build_flags} + ${esp32.no_ps_ram} + +; TFT_ROTATION values: +; 0 - 0 deg (= default when not set) +; 1 - 90 deg anti-clockwise (from 0 deg) +; 2 - 180 deg anti-clockwise +; 3 - 270 deg anti-clockwise +; 4 - mirror content, and rotate 180 deg anti-clockwise +; 5 - mirror content, and rotate 270 deg anti-clockwise +; 6 - mirror content, and rotate 0 deg anti-clockwise +; 7 - mirror content, and rotate 90 deg anti-clockwise + +;region -- TFT_eSPI build options ------------------------ + ; -D USER_SETUP_LOADED=1 + -D LGFX_USE_V1=1 + -D ILI9341_DRIVER=1 ; + -D TFT_ROTATION=6 ; 0=0, 1=90, 2=180 or 3=270 degree, Mirrors: 6, 5, 4, 3 + -D TFT_WIDTH=320 + -D TFT_HEIGHT=240 + -D TFT_RST=-1 + -D TFT_SCLK=14 + -D TFT_DC=2 + -D TFT_CS=15 + -D TFT_MOSI=13 + -D TFT_MISO=12 + -D TFT_BCKL=21 + -D SUPPORT_TRANSACTIONS + -D SPI_FREQUENCY=55000000 + -D SPI_READ_FREQUENCY=20000000 + -D TOUCH_OFFSET_ROTATION=2 ; 1=swap xy, 2=invert x, 4=inverty + -D TFT_RGB_ORDER=1 ; Colour order Red-Green-Blue + + -D ESP32_2432S028R=1 +;endregion + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + +lib_deps = + ${arduino_esp32_v2.lib_deps} + ${lovyangfx.lib_deps} + +[env:esp32-2432s028r_v2_4MB] +extends = esp32-2432s028_v2, flash_4mb +build_flags = + ${esp32-2432s028_v2.build_flags} + -D TOUCH_DRIVER=0x2046 ; XPT2606 Resistive touch panel driver + -D HASP_USE_LGFX_TOUCH=1 + -D TOUCH_CS=33 + -D TOUCH_SCLK=25 + -D TOUCH_MOSI=32 + -D TOUCH_MISO=39 + -D TOUCH_SDA=-1 + -D TOUCH_SCL=-1 + -D TOUCH_IRQ=36 + -D SPI_TOUCH_FREQUENCY=2500000 + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE + +lib_deps = + ${esp32-2432s028_v2.lib_deps} + ;${tft_espi.lib_deps} + ${lovyangfx.lib_deps} + ;${goodix.lib_deps} \ No newline at end of file From a771438a08362e477e5523d8888ed84d00418058 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 12 Oct 2024 23:57:34 +0200 Subject: [PATCH 097/142] Add esp32-2432s028_v2 #396 --- user_setups/esp32/esp32-2432s028.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_setups/esp32/esp32-2432s028.ini b/user_setups/esp32/esp32-2432s028.ini index 136c1260..5fa007eb 100644 --- a/user_setups/esp32/esp32-2432s028.ini +++ b/user_setups/esp32/esp32-2432s028.ini @@ -26,6 +26,7 @@ build_flags = -D SUPPORT_TRANSACTIONS -D SPI_READ_FREQUENCY=20000000 -D TOUCH_OFFSET_ROTATION=0 ; 1=swap xy, 2=invert x, 4=inverty + -D TFT_RGB_ORDER=0 ; Colour order Red-Green-Blue -D ESP32_2432S028R=1 ;endregion @@ -152,6 +153,7 @@ build_flags = ; -D USER_SETUP_LOADED=1 -D LGFX_USE_V1=1 -D ILI9341_DRIVER=1 ; + -D INVERT_COLORS=0 -D TFT_ROTATION=6 ; 0=0, 1=90, 2=180 or 3=270 degree, Mirrors: 6, 5, 4, 3 -D TFT_WIDTH=320 -D TFT_HEIGHT=240 From 355e1dbddaf65b555de4c2ee94b627760b9e9e45 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 7 Nov 2024 20:50:42 +0100 Subject: [PATCH 098/142] Add ws_esp32_s3_touch_lcd_4p3 --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 618d57f8..57b43c19 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -53,7 +53,7 @@ jobs: - out: sunton env: "esp32-2432s028r_4MB -e esp32-2432s028r-ili9342_4MB -e esp32-2432s028r_v2_4MB -e esp32-2432s032c_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB" - out: waveshare - env: "esp32-one_ili9486 -e esp32-one_st7796" + env: "esp32-one_ili9486 -e esp32-one_st7796 -e ws_esp32_s3_touch_lcd_4p3" - out: wireless-tag env: "wt32-sc01_4MB -e wt32-sc01_16MB -e wt-86-32-3zw1 -e wt32-sc01-plus_8MB -e wt32-sc01-plus_16MB" - out: yeacreate From 5f29881e12d39a073c4022996227d0b6679c1cd4 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 14 Nov 2024 21:59:12 +0100 Subject: [PATCH 099/142] Update ace.js to 1.36.5 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 87e87abc..e5bf05aa 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor

L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index ec3ae438..0644d3ea 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.5")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 52861a6a5d2af151ee47c18bc915ad510f9cefdd Mon Sep 17 00:00:00 2001 From: LILYGO_L <13073925292@163.com> Date: Thu, 21 Nov 2024 14:21:53 +0800 Subject: [PATCH 100/142] The addition of support for T-Panel (verified). --- boards/esp32s3_flash_16MB.json | 43 ++++++ .../Arduino_RGB_Display_mod.h | 130 ++++++++++++++++++ src/drv/tft/tft_driver_arduinogfx.cpp | 5 +- src/drv/touch/touch_driver.h | 3 + src/drv/touch/touch_driver_cst3240.cpp | 72 ++++++++++ src/drv/touch/touch_driver_cst3240.h | 26 ++++ user_setups/esp32s3/_esp32s3.ini | 11 +- user_setups/esp32s3/lilygo-t-panel.ini | 43 ++++-- 8 files changed, 312 insertions(+), 21 deletions(-) create mode 100644 boards/esp32s3_flash_16MB.json create mode 100644 src/drv/touch/touch_driver_cst3240.cpp create mode 100644 src/drv/touch/touch_driver_cst3240.h diff --git a/boards/esp32s3_flash_16MB.json b/boards/esp32s3_flash_16MB.json new file mode 100644 index 00000000..2f4ff022 --- /dev/null +++ b/boards/esp32s3_flash_16MB.json @@ -0,0 +1,43 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ESP32S3_DEV", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "default_tool": "esp-builtin", + "onboard_tools": [ + "esp-builtin" + ], + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "ESP32-S3-FLASH-16MB", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 921600 + }, + "url": "null", + "vendor": "null" +} \ No newline at end of file diff --git a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h index ae343534..b9c78a6e 100644 --- a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h +++ b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h @@ -265,6 +265,136 @@ static const uint8_t st7701_sensecap_indicator_init_operations[] = { DELAY, 120, }; +static const uint8_t st7701_t_panel_init_operations[] = { + + BEGIN_WRITE, + WRITE_COMMAND_8, 0xFF, + WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x13, + + WRITE_C8_D8, 0xEF, 0x08, + + WRITE_COMMAND_8, 0xFF, + WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x10, + + WRITE_C8_D16, 0xC0, 0x3B, 0x00, + WRITE_C8_D16, 0xC1, 0x0B, 0x02, + + WRITE_COMMAND_8, 0xC2, + WRITE_BYTES, 3, 0x30, 0x02, 0x37, + + WRITE_C8_D8, 0xCC, 0x10, + + WRITE_COMMAND_8, 0xB0, // Positive Voltage Gamma Control + WRITE_BYTES, 16, + 0x00, 0x0F, 0x16, 0x0E, + 0x11, 0x07, 0x09, 0x09, + 0x08, 0x23, 0x05, 0x11, + 0x0F, 0x28, 0x2D, 0x18, + + WRITE_COMMAND_8, 0xB1, // Negative Voltage Gamma Control + WRITE_BYTES, 16, + 0x00, 0x0F, 0x16, 0x0E, + 0x11, 0x07, 0x09, 0x08, + 0x09, 0x23, 0x05, 0x11, + 0x0F, 0x28, 0x2D, 0x18, + + WRITE_COMMAND_8, 0xFF, + WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x11, + + WRITE_C8_D8, 0xB0, 0x4D, + WRITE_C8_D8, 0xB1, 0x33, + WRITE_C8_D8, 0xB2, 0x87, + WRITE_C8_D8, 0xB5, 0x4B, + WRITE_C8_D8, 0xB7, 0x8C, + WRITE_C8_D8, 0xB8, 0x20, + WRITE_C8_D8, 0xC1, 0x78, + WRITE_C8_D8, 0xC2, 0x78, + WRITE_C8_D8, 0xD0, 0x88, + + WRITE_COMMAND_8, 0xE0, + WRITE_BYTES, 3, 0x00, 0x00, 0x02, + + WRITE_COMMAND_8, 0xE1, + WRITE_BYTES, 11, + 0x02, 0xF0, 0x00, 0x00, + 0x03, 0xF0, 0x00, 0x00, + 0x00, 0x44, 0x44, + + WRITE_COMMAND_8, 0xE2, + WRITE_BYTES, 12, + 0x10, 0x10, 0x40, 0x40, + 0xF2, 0xF0, 0x00, 0x00, + 0xF2, 0xF0, 0x00, 0x00, + + WRITE_COMMAND_8, 0xE3, + WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11, + + WRITE_C8_D16, 0xE4, 0x44, 0x44, + + WRITE_COMMAND_8, 0xE5, + WRITE_BYTES, 16, + 0x07, 0xEF, 0xF0, 0xF0, + 0x09, 0xF1, 0xF0, 0xF0, + 0x03, 0xF3, 0xF0, 0xF0, + 0x05, 0xED, 0xF0, 0xF0, + + WRITE_COMMAND_8, 0xE6, + WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11, + + WRITE_C8_D16, 0xE7, 0x44, 0x44, + + WRITE_COMMAND_8, 0xE8, + WRITE_BYTES, 16, + 0x08, 0xF0, 0xF0, 0xF0, + 0x0A, 0xF2, 0xF0, 0xF0, + 0x04, 0xF4, 0xF0, 0xF0, + 0x06, 0xEE, 0xF0, 0xF0, + + WRITE_COMMAND_8, 0xEB, + WRITE_BYTES, 7, + 0x00, 0x00, 0xE4, 0xE4, + 0x44, 0x88, 0x40, + + WRITE_C8_D16, 0xEC, 0x78, 0x00, + + WRITE_COMMAND_8, 0xED, + WRITE_BYTES, 16, + 0x20, 0xF9, 0x87, 0x76, + 0x65, 0x54, 0x4F, 0xFF, + 0xFF, 0xF4, 0x45, 0x56, + 0x67, 0x78, 0x9F, 0x02, + + WRITE_COMMAND_8, 0xEF, + WRITE_BYTES, 6, + 0x10, 0x0D, 0x04, 0x08, + 0x3F, 0x1F, + + // WRITE_C8_D8, 0xCD, 0x05,//Test + + WRITE_C8_D8, 0x3A, 0x55, + + WRITE_C8_D8, 0x36, 0x08, + + WRITE_COMMAND_8, 0x11, + + // WRITE_COMMAND_8, 0xFF,//Test + // WRITE_BYTES, 5, + // 0x77, 0x01, 0x00, 0x00, + // 0x12, + + // WRITE_C8_D8, 0xD1, 0x81,//Test + // WRITE_C8_D8, 0xD2, 0x08,//Test + + WRITE_COMMAND_8, 0x29, // Display On + + // WRITE_C8_D8, 0x35, 0x00,//Test + // WRITE_C8_D8, 0xCE, 0x04,//Test + + // WRITE_COMMAND_8, 0xF2,//Test + // WRITE_BYTES, 4, + // 0xF0, 0xA3, 0xA3, 0x71, + + END_WRITE}; class Arduino_RGB_Display_Mod : public Arduino_GFX{ public: diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 70406e72..8826cef8 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -37,8 +37,9 @@ void ArduinoGfx::init(int w, int h) ); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_PANEL) + Wire.begin(17, 18); Arduino_DataBus* bus = new Arduino_XL9535SWSPI(17 /* SDA */, 18 /* SCL */, -1 /* XL PWD */, 17 /* XL CS */, - 15 /* XL SCK */, 16 /* XL MOSI */); + 15 /* XL SCK */, 16 /* XL MOSI */,&Wire); Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel( -1 /* DE */, TFT_VSYNC /* VSYNC */, TFT_HSYNC /* HSYNC */, TFT_PCLK /* PCLK */, TFT_B0 /* B0 */, TFT_B1 /* B1 */, TFT_B2 /* B2 */, TFT_B3 /* B3 */, TFT_B4 /* B4 */, @@ -50,7 +51,7 @@ void ArduinoGfx::init(int w, int h) 0 /* de_idle_high*/, 0 /* pclk_idle_high */); tft = new Arduino_RGB_Display(TFT_WIDTH /* width */, TFT_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */, - bus, -1 /* RST */, st7701_sensecap_indicator_init_operations, sizeof(st7701_sensecap_indicator_init_operations)); + bus, -1 /* RST */, st7701_t_panel_init_operations, sizeof(st7701_t_panel_init_operations)); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) Wire.begin(8 /* SDA */, 48 /* SCL */, 800000L /* speed */); diff --git a/src/drv/touch/touch_driver.h b/src/drv/touch/touch_driver.h index 054e8cad..f3e2ccfd 100644 --- a/src/drv/touch/touch_driver.h +++ b/src/drv/touch/touch_driver.h @@ -90,6 +90,9 @@ class BaseTouch { #elif defined(LGFX_USE_V1) #warning Building for LovyanGfx Touch #include "touch_driver_lovyangfx.h" +#elif TOUCH_DRIVER == 0x3240 +#warning Building for CST3240 +#include "touch_driver_cst3240.h" #else #warning Building for Generic Touch using dev::BaseTouch; diff --git a/src/drv/touch/touch_driver_cst3240.cpp b/src/drv/touch/touch_driver_cst3240.cpp new file mode 100644 index 00000000..3c6cbec8 --- /dev/null +++ b/src/drv/touch/touch_driver_cst3240.cpp @@ -0,0 +1,72 @@ +/* MIT License - Copyright (c) 2019-2024 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#if defined(ARDUINO) && (TOUCH_DRIVER == 0x3240) && !defined(HASP_USE_LGFX_TOUCH) +#include +#include "ArduinoLog.h" +#include "hasp_conf.h" +#include "touch_driver_cst3240.h" + +#include +#include "TouchLib.h" + +#include "touch_driver.h" // base class +#include "touch_helper.h" // i2c scanner + +#include "../../hasp/hasp.h" // for hasp_sleep_state +extern uint8_t hasp_sleep_state; + +TouchLib touch(Wire, TOUCH_SDA, TOUCH_SCL, I2C_TOUCH_ADDRESS); + +namespace dev { + +IRAM_ATTR bool TouchCst3240::read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) +{ + touch.read(); + TP_Point t = touch.getPoint(0); + + if((touch.getPointNum() == 1) && (t.pressure > 0) && (t.state != 0)) { + + if(hasp_sleep_state != HASP_SLEEP_OFF) hasp_update_sleep_state(); // update Idle + +#ifdef TOUCH_WIDTH + data->point.x = map(t.x, 0, TOUCH_WIDTH - 1, 0, TFT_WIDTH - 1); +#else + data->point.x = t.x; +#endif + +#ifdef TOUCH_HEIGHT + data->point.y = map(t.y, 0, TOUCH_HEIGHT - 1, 0, TFT_HEIGHT - 1); +#else + data->point.y = t.y; +#endif + + data->state = LV_INDEV_STATE_PR; + hasp_set_sleep_offset(0); // Reset the offset + + } else { + data->state = LV_INDEV_STATE_REL; + } + + /*Return `false` because we are not buffering and no more data to read*/ + return false; +} + +void TouchCst3240::init(int w, int h) +{ + Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY); + if(touch.init() == true) { + LOG_INFO(TAG_DRVR, "CST3240 %s (480x480)", D_SERVICE_STARTED); + } else { + LOG_WARNING(TAG_DRVR, "CST3240 %s", D_SERVICE_START_FAILED); + } + + Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY); + touch_scan(Wire); // The address could change during begin, so scan afterwards +} + +} // namespace dev + +dev::TouchCst3240 haspTouch; + +#endif // ARDUINO diff --git a/src/drv/touch/touch_driver_cst3240.h b/src/drv/touch/touch_driver_cst3240.h new file mode 100644 index 00000000..776e29a9 --- /dev/null +++ b/src/drv/touch/touch_driver_cst3240.h @@ -0,0 +1,26 @@ +/* MIT License - Copyright (c) 2019-2024 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#ifndef HASP_CST3240_TOUCH_DRIVER_H +#define HASP_CST3240_TOUCH_DRIVER_H + +#ifdef ARDUINO +#include "lvgl.h" +#include "touch_driver.h" + +namespace dev { + +class TouchCst3240 : public BaseTouch { + public: + IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data); + void init(int w, int h); +}; + +} // namespace dev + +using dev::TouchCst3240; +extern dev::TouchCst3240 haspTouch; + +#endif // ARDUINO + +#endif // HASP_CST3240_TOUCH_DRIVER_H diff --git a/user_setups/esp32s3/_esp32s3.ini b/user_setups/esp32s3/_esp32s3.ini index 71ad202d..9ede4641 100644 --- a/user_setups/esp32s3/_esp32s3.ini +++ b/user_setups/esp32s3/_esp32s3.ini @@ -5,11 +5,11 @@ board_build.mcu = esp32s3 ps_ram = -DBOARD_HAS_PSRAM - -D HASP_USE_FREETYPE=1 - -D LV_USE_FREETYPE=1 + -D HASP_USE_FREETYPE=0 + -D LV_USE_FREETYPE=0 no_ps_ram = - -D HASP_USE_FREETYPE=1 - -D LV_USE_FREETYPE=1 + -D HASP_USE_FREETYPE=0 + -D LV_USE_FREETYPE=0 ; -- The Arduino ESP32 v2.0.2 with 3 available flash sizes: [arduino_esp32s3_v2] @@ -18,4 +18,5 @@ framework = arduino ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.01/platform-espressif32.zip ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip \ No newline at end of file +; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip +platform = espressif32 @6.5.0 \ No newline at end of file diff --git a/user_setups/esp32s3/lilygo-t-panel.ini b/user_setups/esp32s3/lilygo-t-panel.ini index 54d5f600..8260f8c0 100644 --- a/user_setups/esp32s3/lilygo-t-panel.ini +++ b/user_setups/esp32s3/lilygo-t-panel.ini @@ -8,8 +8,13 @@ [lilygo-t-panel] extends = arduino_esp32s3_v2 -board = esp32-s3-devkitc-1 -board_build.arduino.memory_type = qio_opi +board = esp32s3_flash_16MB + +; board_build.memory_type = qio_opi ;Enable internal PSRAM +board_build.memory_type = qio_qspi ;Enable external PSRAM + +board_upload.flash_size = 16MB +board_build.partitions = default_16MB.csv build_flags = -D HASP_MODEL="Lilygo T-Panel v1.2" @@ -17,8 +22,16 @@ build_flags = ${esp32s3.ps_ram} -DLILYGO_T_PANEL -D LILYGO_T_PANEL=1 - ;-DARDUINO_USB_CDC_ON_BOOT - ;-DUSE_USB_CDC_CONSOLE + + -Wall ;all errors that everybody could agree on + -Wextra ;somebody agree on + ; -Werror ;Think of "Warning" as "Error". + ; -D CORE_DEBUG_LEVEL=1 ;Debug level 0-5 + -D BOARD_HAS_PSRAM ;Enable external PSRAM + -D ARDUINO_USB_MODE=1 + -D ARDUINO_USB_CDC_ON_BOOT=0 ;1 is to use the USB port as a serial port + -D ARDUINO_RUNNING_CORE=1 ; Arduino Runs On Core (setup, loop) + -D ARDUINO_EVENT_RUNNING_CORE=1 ; Events Run On Core ;region -- ArduinoGFX build options ------------------------ -D HASP_USE_ARDUINOGFX=1 @@ -49,27 +62,29 @@ build_flags = -D TFT_BCKL=14 ; Touch Settings + -D TOUCH_MODULES_CST_MUTUAL + -D TOUCH_DRIVER=0x3240 -D TOUCH_WIDTH=480 -D TOUCH_HEIGHT=480 -D TOUCH_SDA=17 -D TOUCH_SCL=18 -D TOUCH_INT=21 - -D TOUCH_RST=4 + -D TOUCH_RST=-1 -D TOUCH_CS=-1 - -D TOUCH_DRIVER=0x3240 - ; -D TOUCH_IRQ= - ; -D I2C_TOUCH_FREQUENCY= - ; -D I2C_TOUCH_ADDRESS= + -D TOUCH_IRQ=TOUCH_INT + -D I2C_TOUCH_FREQUENCY=400000UL + -D I2C_TOUCH_ADDRESS=0x5A ; -D I2C_TOUCH_PORT= + -D LV_DISP_DEF_REFR_PERIOD=10 + ;endregion lib_deps = ${arduino_esp32s3_v2.lib_deps} -; moononournation/GFX Library for Arduino@1.4.0 ; Update needs modification of custom PCA class ; ${ft6336.lib_deps} -; ; git+https://github.com/admarschoonen/TouchLib.git - ; moononournation/GFX Library for Arduino@1.4.0 ; + git+https://github.com/mmMicky/TouchLib.git + moononournation/GFX Library for Arduino@1.4.0 [env:lilygo-t-panel_16MB] extends = lilygo-t-panel, flash_16mb -monitor_port = COM8 -upload_port = COM8 +; monitor_port = COM8 +; upload_port = COM8 From 81d35626aed92486fefa968323b724bb6049c8c3 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:38:45 +0100 Subject: [PATCH 101/142] Update _esp32s3.ini --- user_setups/esp32s3/_esp32s3.ini | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user_setups/esp32s3/_esp32s3.ini b/user_setups/esp32s3/_esp32s3.ini index 9ede4641..0a1e6c7d 100644 --- a/user_setups/esp32s3/_esp32s3.ini +++ b/user_setups/esp32s3/_esp32s3.ini @@ -5,11 +5,11 @@ board_build.mcu = esp32s3 ps_ram = -DBOARD_HAS_PSRAM - -D HASP_USE_FREETYPE=0 - -D LV_USE_FREETYPE=0 + -D HASP_USE_FREETYPE=1 + -D LV_USE_FREETYPE=1 no_ps_ram = - -D HASP_USE_FREETYPE=0 - -D LV_USE_FREETYPE=0 + -D HASP_USE_FREETYPE=1 + -D LV_USE_FREETYPE=1 ; -- The Arduino ESP32 v2.0.2 with 3 available flash sizes: [arduino_esp32s3_v2] @@ -18,5 +18,5 @@ framework = arduino ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.01/platform-espressif32.zip ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip ; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip -; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip -platform = espressif32 @6.5.0 \ No newline at end of file +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.10.03/platform-espressif32.zip +; platform = espressif32 @6.5.0 From 932805d3bd0ed5da75dcaaf72fc4dd7c1398170f Mon Sep 17 00:00:00 2001 From: marsman7 Date: Tue, 3 Dec 2024 21:37:06 +0100 Subject: [PATCH 102/142] Fix compiling errors when HASP_USE_CUSTOM set to zero --- src/custom/my_custom_fan_template.cpp | 2 +- src/custom/my_custom_template.cpp | 2 +- src/custom/my_custom_template.h | 2 +- src/hasp/hasp_dispatch.cpp | 4 ++-- src/hasp/hasp_task.cpp | 4 ++-- src/hasplib.h | 2 +- src/main.cpp | 8 ++++---- src/mqtt/hasp_mqtt_esp.cpp | 2 +- src/mqtt/hasp_mqtt_paho_async.cpp | 2 +- src/mqtt/hasp_mqtt_paho_single.cpp | 2 +- src/mqtt/hasp_mqtt_pubsubclient.cpp | 2 +- src/sys/gpio/hasp_gpio.cpp | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/custom/my_custom_fan_template.cpp b/src/custom/my_custom_fan_template.cpp index a8775242..5de68952 100644 --- a/src/custom/my_custom_fan_template.cpp +++ b/src/custom/my_custom_fan_template.cpp @@ -13,7 +13,7 @@ #include "hasplib.h" -#if defined(HASP_USE_CUSTOM) && false // <-- set this to true in your code +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 && false // <-- set this to true in your code #include "hasp_debug.h" diff --git a/src/custom/my_custom_template.cpp b/src/custom/my_custom_template.cpp index 358bbd0f..e32ea4f6 100644 --- a/src/custom/my_custom_template.cpp +++ b/src/custom/my_custom_template.cpp @@ -6,7 +6,7 @@ #include "hasplib.h" -#if defined(HASP_USE_CUSTOM) && false // <-- set this to true in your code +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 && false // <-- set this to true in your code #include "hasp_debug.h" diff --git a/src/custom/my_custom_template.h b/src/custom/my_custom_template.h index 3e25c031..5f156e85 100644 --- a/src/custom/my_custom_template.h +++ b/src/custom/my_custom_template.h @@ -9,7 +9,7 @@ #define HASP_CUSTOM_H #include "hasplib.h" -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 /* This function is called at boot */ void custom_setup(); diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 33cffc77..c8988f85 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -452,7 +452,7 @@ void dispatch_topic_payload(const char* topic, const char* payload, bool update, } #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 if(topic == strstr_P(topic, PSTR(MQTT_TOPIC_CUSTOM "/"))) { // startsWith custom topic += 7u; custom_topic_payload(topic, (char*)payload, source); @@ -1295,7 +1295,7 @@ void dispatch_send_sensordata(const char*, const char*, uint8_t source) haspDevice.get_sensors(doc); -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_get_sensors(doc); #endif diff --git a/src/hasp/hasp_task.cpp b/src/hasp/hasp_task.cpp index 272285d7..09650380 100644 --- a/src/hasp/hasp_task.cpp +++ b/src/hasp/hasp_task.cpp @@ -32,7 +32,7 @@ void task_every_second_cb(lv_task_t* task) telnetEverySecond(); #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_every_second(); #endif // debugEverySecond(); @@ -53,7 +53,7 @@ void task_every_second_cb(lv_task_t* task) break; case 3: -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_every_5seconds(); #endif break; diff --git a/src/hasplib.h b/src/hasplib.h index d4b578ad..0c621f12 100644 --- a/src/hasplib.h +++ b/src/hasplib.h @@ -70,6 +70,6 @@ #endif #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 #include "custom/my_custom.h" #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c68c2bf4..4d428db4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -136,7 +136,7 @@ void setup() slaveSetup(); #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_setup(); #endif @@ -195,7 +195,7 @@ IRAM_ATTR void loop() consoleLoop(); #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_loop(); #endif @@ -222,7 +222,7 @@ IRAM_ATTR void loop() telnetEverySecond(); #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_every_second(); #endif // debugEverySecond(); @@ -243,7 +243,7 @@ IRAM_ATTR void loop() // gpioEvery5Seconds(); #endif -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 custom_every_5seconds(); #endif break; diff --git a/src/mqtt/hasp_mqtt_esp.cpp b/src/mqtt/hasp_mqtt_esp.cpp index f19f3c5d..7d076d15 100644 --- a/src/mqtt/hasp_mqtt_esp.cpp +++ b/src/mqtt/hasp_mqtt_esp.cpp @@ -371,7 +371,7 @@ void onMqttConnect(esp_mqtt_client_handle_t client) // mqttSubscribeTo(mqttGroupTopic + subtopic); // mqttSubscribeTo(mqttNodeTopic + subtopic); -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 String subtopic = F(MQTT_TOPIC_CUSTOM "/#"); mqttSubscribeTo(mqttGroupCommandTopic + subtopic); mqttSubscribeTo(mqttNodeCommandTopic + subtopic); diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index a75bb699..176d6bc4 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -328,7 +328,7 @@ static void onConnect(void* context, MQTTAsync_successData* response) topic = mqttNodeTopic + "config/#"; mqtt_subscribe(mqtt_client, topic.c_str()); -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 topic = mqttGroupTopic + MQTT_TOPIC_CUSTOM "/#"; mqtt_subscribe(mqtt_client, topic.c_str()); diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index 2d1565b3..010320d7 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -269,7 +269,7 @@ static void onConnect(void* context) topic = mqttNodeTopic + "config/#"; mqtt_subscribe(mqtt_client, topic.c_str()); -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 topic = mqttGroupTopic + MQTT_TOPIC_CUSTOM "/#"; mqtt_subscribe(mqtt_client, topic.c_str()); diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 84e2a2b5..e72e468f 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -311,7 +311,7 @@ void mqttStart() snprintf_P(topic, sizeof(topic), PSTR("%s" MQTT_TOPIC_CONFIG "/#"), mqttNodeTopic); mqttSubscribeTo(topic); -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 snprintf_P(topic, sizeof(topic), PSTR("%s" MQTT_TOPIC_CUSTOM "/#"), mqttGroupTopic); mqttSubscribeTo(topic); snprintf_P(topic, sizeof(topic), PSTR("%s" MQTT_TOPIC_CUSTOM "/#"), mqttNodeTopic); diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 52b60a96..ec083dcd 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -776,7 +776,7 @@ bool gpioIsSystemPin(uint8_t gpio) return true; } -#if defined(HASP_USE_CUSTOM) +#if defined(HASP_USE_CUSTOM) && HASP_USE_CUSTOM > 0 if(custom_pin_in_use(gpio)) { LOG_DEBUG(TAG_GPIO, F(D_BULLET D_GPIO_PIN " %d => Custom"), gpio); return true; From c89d10dd902907b4d2ee2965dd41728696d22792 Mon Sep 17 00:00:00 2001 From: Lincoln Lavoie Date: Thu, 5 Dec 2024 23:08:22 -0500 Subject: [PATCH 103/142] Updated settings for the Lanbon L9 * Fixed the TFT driver, bad reference to gfx object. * Added setting for GFX parallel driver speed. * Corrected touch drive to FT6336. --- src/drv/tft/tft_driver_arduinogfx.cpp | 6 +++--- user_setups/esp32s3/lanbon_l9.ini | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 8826cef8..71a52a96 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -26,10 +26,10 @@ void ArduinoGfx::init(int w, int h) LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); #if(TFT_WIDTH == 170) && (TFT_HEIGHT == 320) - Arduino_DataBus *bus = new Arduino_ESP32PAR8Q( + Arduino_DataBus *bus = new Arduino_ESP32LCD8( TFT_DC, TFT_CS, TFT_WR, TFT_RD, TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7); - Arduino_GFX *gfx = new Arduino_ST7789(bus, + tft = new Arduino_ST7789(bus, TFT_RST /* RST */, TFT_ROTATION /* rotation */, true /* IPS */, TFT_WIDTH /* width */, TFT_HEIGHT /* height */, 35 /* col offset 1 */, 0 /* row offset 1 */, @@ -142,7 +142,7 @@ void ArduinoGfx::init(int w, int h) /* TFT init */ LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); - tft->begin(GFX_NOT_DEFINED); + tft->begin(SPI_FREQUENCY); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); // tft.setSwapBytes(true); /* set endianness */ LOG_INFO(TAG_TFT, F(D_SERVICE_STARTED)); diff --git a/user_setups/esp32s3/lanbon_l9.ini b/user_setups/esp32s3/lanbon_l9.ini index 9dfb0616..216dfcf8 100644 --- a/user_setups/esp32s3/lanbon_l9.ini +++ b/user_setups/esp32s3/lanbon_l9.ini @@ -26,6 +26,7 @@ build_flags = ;-D TFT_INVERSION_ON ;-D TFT_RGB_ORDER=0 ; Colour order Blue-Green-Red ;-D INVERT_COLORS=1 ; for inverted colors + -D SPI_FREQUENCY=16000000 -D TFT_RST=-1 -D TFT_CS=21 @@ -44,13 +45,13 @@ build_flags = ; Touch Setttings -D TOUCH_WIDTH=170 -D TOUCH_HEIGHT=320 - -D TOUCH_DRIVER=0x911 + -D TOUCH_DRIVER=0x6336 -D TOUCH_SCL=0 -D TOUCH_SDA=35 -D TOUCH_IRQ=-1 -D TOUCH_RST=-1 - -D I2C_TOUCH_ADDRESS=0x5d ; or 0x14 - -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_ADDRESS=0x38 + -D I2C_TOUCH_FREQUENCY=100000 ;endregion ;region -- Library options ------------------------------- From 113b6838f2c3c6fa49babf03a3536ec1e5c698cb Mon Sep 17 00:00:00 2001 From: Lincoln Lavoie Date: Fri, 6 Dec 2024 16:01:00 -0500 Subject: [PATCH 104/142] Working setup for Lanbon L9 * Changed to Arduino_ESP32PAR8 bus driver. * Fixed touch driver options, added missing port settings. * Increased frequency of i2c to 400kHz. --- src/drv/tft/tft_driver_arduinogfx.cpp | 2 +- user_setups/esp32s3/lanbon_l9.ini | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 71a52a96..2e377c39 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -26,7 +26,7 @@ void ArduinoGfx::init(int w, int h) LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); #if(TFT_WIDTH == 170) && (TFT_HEIGHT == 320) - Arduino_DataBus *bus = new Arduino_ESP32LCD8( + Arduino_DataBus *bus = new Arduino_ESP32PAR8( TFT_DC, TFT_CS, TFT_WR, TFT_RD, TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7); tft = new Arduino_ST7789(bus, diff --git a/user_setups/esp32s3/lanbon_l9.ini b/user_setups/esp32s3/lanbon_l9.ini index 216dfcf8..b4ead53a 100644 --- a/user_setups/esp32s3/lanbon_l9.ini +++ b/user_setups/esp32s3/lanbon_l9.ini @@ -51,7 +51,8 @@ build_flags = -D TOUCH_IRQ=-1 -D TOUCH_RST=-1 -D I2C_TOUCH_ADDRESS=0x38 - -D I2C_TOUCH_FREQUENCY=100000 + -D I2C_TOUCH_PORT=1 + -D I2C_TOUCH_FREQUENCY=400000 ;endregion ;region -- Library options ------------------------------- @@ -61,6 +62,7 @@ lib_deps = ${arduino_esp32s3_v2.lib_deps} ${arduinogfx.lib_deps} ${goodix.lib_deps} + ${ft6336.lib_deps} lib_ignore = ${env.lib_ignore} From fea7be0700ac59e4b5abdb95296e813bd2342ccb Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 7 Dec 2024 02:16:11 +0100 Subject: [PATCH 105/142] Add lanbon_l9 #830 --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 57b43c19..0e5ac36d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -37,7 +37,7 @@ jobs: - out: guition env: esp32-s3-4848s040_16MB -e guition-jc4827w543c_4MB - out: lanbon - env: lanbon_l8 + env: lanbon_l8 -e lanbon_l9 - out: lilygo-ttgo env: "lilygo-lily-pi_st7796 -e lilygo-lily-pi_ili9481 -e ttgo-t7-v1_5_ili9341_4MB -e ttgo-t7-v1_5_ili9341_16MB" - out: lolin From 0c82612e8eb5f5de0cdd7163450d4063690f0b26 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 7 Dec 2024 03:11:33 +0100 Subject: [PATCH 106/142] Update toubuntu-24.04 --- .github/workflows/build.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0e5ac36d..cbb5c4e9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -14,7 +14,8 @@ on: jobs: build_esp32: - runs-on: ubuntu-latest + #runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: fail-fast: false From 0dce321aa5684a0afdb51e57fdcb69eb31899f69 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 7 Dec 2024 03:43:15 +0100 Subject: [PATCH 107/142] Remove HASP_USE_HA #813 --- include/user_config_override-template.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/user_config_override-template.h b/include/user_config_override-template.h index 2d6c97c7..113acc7e 100644 --- a/include/user_config_override-template.h +++ b/include/user_config_override-template.h @@ -148,7 +148,6 @@ **************************************************/ //#define HASP_USE_MDNS 0 // Disable MDNS //#define HASP_USE_CUSTOM 1 // Enable compilation of custom code from /src/custom -//#define HASP_USE_HA // Enable Home Assistant auto-discovery //#define HASP_START_CONSOLE 0 // Disable starting of serial console at boot //#define HASP_START_TELNET 0 // Disable starting of telnet service at boot //#define HASP_START_HTTP 0 // Disable starting of web interface at boot From 7ced77a7a95ff56a68d145c0a68bc8ed0aa7a09b Mon Sep 17 00:00:00 2001 From: marsman7 Date: Sat, 7 Dec 2024 22:21:27 +0100 Subject: [PATCH 108/142] add lovyangfx custom offset for tft --- src/drv/tft/tft_defines.h | 6 ++++++ src/drv/tft/tft_driver_lovyangfx.cpp | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/drv/tft/tft_defines.h b/src/drv/tft/tft_defines.h index ab789682..66904dfd 100644 --- a/src/drv/tft/tft_defines.h +++ b/src/drv/tft/tft_defines.h @@ -113,6 +113,12 @@ #ifndef SPI_READ_FREQUENCY #define SPI_READ_FREQUENCY 0 #endif +#ifndef TFT_OFFSET_X +#define TFT_OFFSET_X 0 +#endif +#ifndef TFT_OFFSET_Y +#define TFT_OFFSET_Y 0 +#endif #ifndef TFT_OFFSET_ROTATION #define TFT_OFFSET_ROTATION 0 #endif diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index 798ee7ed..43e37366 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -204,8 +204,8 @@ static void configure_panel(lgfx::Panel_Device* panel, Preferences* prefs) cfg.memory_width = prefs->getUInt("memory_width", cfg.panel_width); // Maximum width supported by driver IC cfg.memory_height = prefs->getUInt("memory_height", cfg.panel_height); // Maximum height supported by driver IC - cfg.offset_x = prefs->getUInt("offset_x", 0); // Amount of offset in the X direction of the panel - cfg.offset_y = prefs->getUInt("offset_y", 0); // Amount of offset in the Y direction of the panel + cfg.offset_x = prefs->getUInt("offset_x", TFT_OFFSET_X); // Amount of offset in the X direction of the panel + cfg.offset_y = prefs->getUInt("offset_y", TFT_OFFSET_Y); // Amount of offset in the Y direction of the panel cfg.offset_rotation = prefs->getUInt("offset_rotation", TFT_OFFSET_ROTATION); // Offset of the rotation 0 ~ 7 (4 ~ 7 is upside down) From b2517560594798954fc61cca4dfde64d8b0d151d Mon Sep 17 00:00:00 2001 From: marsman7 Date: Sat, 7 Dec 2024 23:34:19 +0100 Subject: [PATCH 109/142] add ini file for waveshare ESP32-S3 1.69inch CTP --- user_setups/esp32s3/waveshare s3 1_69 ctp.ini | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 user_setups/esp32s3/waveshare s3 1_69 ctp.ini diff --git a/user_setups/esp32s3/waveshare s3 1_69 ctp.ini b/user_setups/esp32s3/waveshare s3 1_69 ctp.ini new file mode 100644 index 00000000..738cb619 --- /dev/null +++ b/user_setups/esp32s3/waveshare s3 1_69 ctp.ini @@ -0,0 +1,53 @@ +;**********************************************************; +; Waveshare ESP32-S3 TFT 1.69inch 240x280 C-Touch ; +; - ST7789V2 TFT SPI 4-WIRE ; +; - CST816s touch controller ; +;**********************************************************; + +[env:waveshare-s3-1_69-ctp] +extends = arduino_esp32s3_v2, flash_16mb +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi + +build_flags = + -D HASP_MODEL="Waveshare micro TFT" + ${arduino_esp32s3_v2.build_flags} + ${esp32s3.ps_ram} +; -D USE_USB_CDC_CONSOLE=1 +; -D ARDUINO_USB_MODE=1 +; -D ARDUINO_USB_CDC_ON_BOOT=1 + + # --- Display settings --- + -D LGFX_USE_V1=1 ; for lovyangfx driver + -D HASP_USE_LGFX_TOUCH=1 ; for lovyangfx driver + -D ST7789_DRIVER=1 + -D SPI_FREQUENCY=80000000 + -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree + -D TFT_WIDTH=240 + -D TFT_HEIGHT=280 + -D TFT_OFFSET_Y=20 + -D TFT_MOSI=7 + -D TFT_SCLK=6 + -D TFT_CS=5 + -D TFT_DC=4 + -D TFT_RST=8 + -D TFT_BL=15 + -D TFT_BCKL=15 +; -D TFT_INVERSION_ON +; -D TFT_RGB_ORDER TFT_BGR + + # --- Touch settings --- + -D TOUCH_DRIVER=0x0816 + -D TOUCH_SDA=11 + -D TOUCH_SCL=10 + -D TOUCH_RST=13 + -D TOUCH_IRQ=14 + -D TOUCH_CS=-1 + -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_ADDRESS=0x15 + +lib_deps = + ${arduino_esp32s3_v2.lib_deps} + ${lovyangfx.lib_deps} + +upload_protocol = esp-builtin From f1c588c5a438c12de45af4e4fe0ab486b0bb4f16 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 12 Dec 2024 02:53:58 +0100 Subject: [PATCH 110/142] Update to rc15 --- lib/SimpleFTPServer/FtpServer.cpp | 7 +++---- platformio.ini | 2 +- user_setups/esp32s2/makerfabs-tft-s2.ini | 3 ++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/SimpleFTPServer/FtpServer.cpp b/lib/SimpleFTPServer/FtpServer.cpp index 7107c82b..b035599f 100644 --- a/lib/SimpleFTPServer/FtpServer.cpp +++ b/lib/SimpleFTPServer/FtpServer.cpp @@ -293,10 +293,9 @@ uint8_t FtpServer::handleFTP() { void FtpServer::clientConnected() { // DEBUG_PRINTLN( F(" Client connected!") ); - client.print(F("220 ---")); client.print(welcomeMessage); client.println(F(" ---")); - // client.print(F("220---")); client.print(welcomeMessage); client.println(F(" ---")); - // client.println(F("220--- By Renzo Mischianti ---")); - // client.print(F("220 -- Version ")); client.print(FTP_SERVER_VERSION); client.println(F(" --")); + client.print (F("220--- ")); client.print(welcomeMessage); client.println(F(" ---")); + // client.println(F(" -- By Renzo Mischianti --")); + client.print (F("220 -- Version ")); client.print(FTP_SERVER_VERSION); iCL = 0; if (FtpServer::_callback) { FtpServer::_callback(FTP_CONNECT, free(), capacity()); diff --git a/platformio.ini b/platformio.ini index 13f1f16b..256e7a3e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -75,7 +75,7 @@ build_flags = -D HASP_VER_MAJ=0 -D HASP_VER_MIN=7 ;-D HASP_VER_REV=4 - -D HASP_VER_REV=0-rc14 + -D HASP_VER_REV=0-rc15 ;-D HASP_VER_REV=4-rc1 ${override.build_flags} diff --git a/user_setups/esp32s2/makerfabs-tft-s2.ini b/user_setups/esp32s2/makerfabs-tft-s2.ini index 9990f9cb..6bca6dd1 100644 --- a/user_setups/esp32s2/makerfabs-tft-s2.ini +++ b/user_setups/esp32s2/makerfabs-tft-s2.ini @@ -6,12 +6,13 @@ ;***************************************************; [env:makerfabs-tft-s2_ili9488] -extends = esp32s2-solo_16mb_v2 +extends = arduino_esp32s2-solo_v2, flash_16mb board = esp32s2 build_flags = ${env.build_flags} ${esp32s2.build_flags} + ${esp32s2.no_ps_ram} ;region -- TFT_eSPI build options ------------------------ -D ILI9488_DRIVER=1 From 70c262ebae97c4dece2738d4d64138732bfbc1f7 Mon Sep 17 00:00:00 2001 From: vorbeiei Date: Fri, 13 Dec 2024 21:47:29 +0100 Subject: [PATCH 111/142] add config for huzza32 v2 with featherwing v1 --- .../esp32/huzzah32-v2-featherwing-35.ini | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 user_setups/esp32/huzzah32-v2-featherwing-35.ini diff --git a/user_setups/esp32/huzzah32-v2-featherwing-35.ini b/user_setups/esp32/huzzah32-v2-featherwing-35.ini new file mode 100644 index 00000000..05830d7b --- /dev/null +++ b/user_setups/esp32/huzzah32-v2-featherwing-35.ini @@ -0,0 +1,33 @@ +;***************************************************; +; HUZZAH32 V2 ESP32 with Featherwing TFT 3.5" ; +; - HUZZAH32 V2 w/ 2 MB PSRAM board ; +; - HX8357D TFT Featherwing 3.5" V2 ; +; - STMPE610 touch controller ; +;***************************************************; + +[env:huzzah32-v2-featherwing-35] +extends = arduino_esp32_v2, flash_8mb +board = adafruit_feather_esp32_v2 + +build_flags = + -D HASP_MODEL="Adafruit HUZZAH32 V2 ESP32 Featherwing 3.5" + ${arduino_esp32_v2.build_flags} + ${esp32.ps_ram} + -D LV_INDEV_DEF_READ_PERIOD=30 +;region -- TFT_eSPI build options ------------------------ + ${lcd.featherwing-35} + -D TFT_MISO=21 ; GPIO21 / MISO + -D TFT_MOSI=19 ; GPIO19 / MOSI + -D TFT_SCLK=5 ; GPIO5 / SCK + -D TFT_DC=33 ; GPIO33 / D33 + -D TFT_CS=15 ; GPIO15 / D15 + -D TFT_RST=-1 ; RST + -D TOUCH_CS=32 + + -D TFT_BCKL=26 ; Solder the LITE pad to a PWM enabled pin of the ESP, like GPIO 26 +;endregion + +lib_deps = + ${arduino_esp32_v2.lib_deps} + ${tft_espi.lib_deps} + ${stmpe610.lib_deps} \ No newline at end of file From 78a3b38829710bde490c52a4c95ce6dc90852145 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 14 Dec 2024 16:55:41 +0100 Subject: [PATCH 112/142] Fix duplicate response headers #834 --- src/sys/svc/hasp_http.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sys/svc/hasp_http.cpp b/src/sys/svc/hasp_http.cpp index 06af58d8..99f3c981 100644 --- a/src/sys/svc/hasp_http.cpp +++ b/src/sys/svc/hasp_http.cpp @@ -264,18 +264,18 @@ static void webSendFooter() #endif } -static void http_send_cache_header(int size, int age = 3600) +static void http_send_cache_header(int age = 3600) { - webServer.sendHeader("Content-Length", (String)(size)); webServer.sendHeader("Cache-Control", (String)(F("public, max-age=")) + (String)(age)); } static int http_send_cached(int statuscode, const char* contenttype, const char* data, size_t size, int age = 3600) { - http_send_cache_header(size, age); + http_send_cache_header(age); #if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) webServer.send_P(statuscode, contenttype, data, size); #else + webServer.sendHeader("Content-Length", (String)(size)); webServer.send(statuscode, contenttype, data); #endif return statuscode; From e815e31a5a808c49da6f8f6af26d4f1ef6b42189 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 14 Dec 2024 21:58:22 +0100 Subject: [PATCH 113/142] Remove default SPI_FREQUENCY if not set #153 --- src/drv/tft/tft_defines.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/drv/tft/tft_defines.h b/src/drv/tft/tft_defines.h index 66904dfd..87b02294 100644 --- a/src/drv/tft/tft_defines.h +++ b/src/drv/tft/tft_defines.h @@ -49,9 +49,9 @@ #define TFT_RST -1 #endif -#ifndef SPI_FREQUENCY -#define SPI_FREQUENCY 40000000 -#endif +// #ifndef SPI_FREQUENCY +// #define SPI_FREQUENCY -1 // 40000000 +// #endif #ifndef TFT_D0 #define TFT_D0 -1 From 154a8ff63890814130041c0c993b82e305f82551 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 14 Dec 2024 22:02:22 +0100 Subject: [PATCH 114/142] Check if SPI_FREQUENCY is defined #153 --- src/drv/tft/tft_driver_arduinogfx.cpp | 58 ++++++++++++++------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index 2e377c39..cbe8794d 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -25,33 +25,30 @@ void ArduinoGfx::init(int w, int h) { LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); -#if(TFT_WIDTH == 170) && (TFT_HEIGHT == 320) - Arduino_DataBus *bus = new Arduino_ESP32PAR8( - TFT_DC, TFT_CS, TFT_WR, TFT_RD, - TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7); - tft = new Arduino_ST7789(bus, - TFT_RST /* RST */, TFT_ROTATION /* rotation */, true /* IPS */, - TFT_WIDTH /* width */, TFT_HEIGHT /* height */, - 35 /* col offset 1 */, 0 /* row offset 1 */, - 35 /* col offset 2 */, 0 /* row offset 2 */ +#if(TFT_WIDTH == 170) && (TFT_HEIGHT == 320) + Arduino_DataBus* bus = new Arduino_ESP32PAR8(TFT_DC, TFT_CS, TFT_WR, TFT_RD, TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, + TFT_D5, TFT_D6, TFT_D7); + tft = new Arduino_ST7789(bus, TFT_RST /* RST */, TFT_ROTATION /* rotation */, true /* IPS */, TFT_WIDTH /* width */, + TFT_HEIGHT /* height */, 35 /* col offset 1 */, 0 /* row offset 1 */, + 35 /* col offset 2 */, 0 /* row offset 2 */ ); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_PANEL) Wire.begin(17, 18); - Arduino_DataBus* bus = new Arduino_XL9535SWSPI(17 /* SDA */, 18 /* SCL */, -1 /* XL PWD */, 17 /* XL CS */, - 15 /* XL SCK */, 16 /* XL MOSI */,&Wire); - Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel( - -1 /* DE */, TFT_VSYNC /* VSYNC */, TFT_HSYNC /* HSYNC */, TFT_PCLK /* PCLK */, - TFT_B0 /* B0 */, TFT_B1 /* B1 */, TFT_B2 /* B2 */, TFT_B3 /* B3 */, TFT_B4 /* B4 */, - TFT_G0 /* G0 */, TFT_G1 /* G1 */, TFT_G2 /* G2 */, TFT_G3 /* G3 */, TFT_G4 /* G4 */, TFT_G5 /* G5 */, - TFT_R0 /* R0 */, TFT_R1 /* R1 */, TFT_R2 /* R2 */, TFT_R3 /* R3 */, TFT_R4 /* R4 */, - 1 /* hsync_polarity */, 20 /* hsync_front_porch */, 2 /* hsync_pulse_width */, 0 /* hsync_back_porch */, - 1 /* vsync_polarity */, 30 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 1 /* vsync_back_porch */, - 10 /* pclk_active_neg */, 6000000L /* prefer_speed */, false /* useBigEndian */, - 0 /* de_idle_high*/, 0 /* pclk_idle_high */); + Arduino_DataBus* bus = new Arduino_XL9535SWSPI(17 /* SDA */, 18 /* SCL */, -1 /* XL PWD */, 17 /* XL CS */, + 15 /* XL SCK */, 16 /* XL MOSI */, &Wire); + Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel( + -1 /* DE */, TFT_VSYNC /* VSYNC */, TFT_HSYNC /* HSYNC */, TFT_PCLK /* PCLK */, TFT_B0 /* B0 */, + TFT_B1 /* B1 */, TFT_B2 /* B2 */, TFT_B3 /* B3 */, TFT_B4 /* B4 */, TFT_G0 /* G0 */, TFT_G1 /* G1 */, + TFT_G2 /* G2 */, TFT_G3 /* G3 */, TFT_G4 /* G4 */, TFT_G5 /* G5 */, TFT_R0 /* R0 */, TFT_R1 /* R1 */, + TFT_R2 /* R2 */, TFT_R3 /* R3 */, TFT_R4 /* R4 */, 1 /* hsync_polarity */, 20 /* hsync_front_porch */, + 2 /* hsync_pulse_width */, 0 /* hsync_back_porch */, 1 /* vsync_polarity */, 30 /* vsync_front_porch */, + 8 /* vsync_pulse_width */, 1 /* vsync_back_porch */, 10 /* pclk_active_neg */, 6000000L /* prefer_speed */, + false /* useBigEndian */, 0 /* de_idle_high*/, 0 /* pclk_idle_high */); - tft = new Arduino_RGB_Display(TFT_WIDTH /* width */, TFT_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */, - bus, -1 /* RST */, st7701_t_panel_init_operations, sizeof(st7701_t_panel_init_operations)); + tft = new Arduino_RGB_Display(TFT_WIDTH /* width */, TFT_HEIGHT /* height */, rgbpanel, 0 /* rotation */, + true /* auto_flush */, bus, -1 /* RST */, st7701_t_panel_init_operations, + sizeof(st7701_t_panel_init_operations)); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) Wire.begin(8 /* SDA */, 48 /* SCL */, 800000L /* speed */); @@ -63,7 +60,7 @@ void ArduinoGfx::init(int w, int h) 6 /* B1 */, 5 /* B2 */, 3 /* B3 */, 2 /* B4 */, 1 /* hsync_polarity */, 50 /* hsync_front_porch */, 1 /* hsync_pulse_width */, 30 /* hsync_back_porch */, 1 /* vsync_polarity */, 20 /* vsync_front_porch */, 1 /* vsync_pulse_width */, 30 /* vsync_back_porch */, 1 /* pclk_active_neg */); - tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, + tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_type4_init_operations, sizeof(st7701_type4_init_operations)); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(SENSECAP_INDICATOR_D1) @@ -72,14 +69,15 @@ void ArduinoGfx::init(int w, int h) pinMode(TFT_MOSI, OUTPUT); pinMode(TFT_MISO, OUTPUT); Arduino_DataBus* bus = new Arduino_PCA9535SWSPI(TOUCH_SDA, TOUCH_SCL, 5 /* XL PWD */, 4 /* XL CS */, - TFT_SCLK /* XL SCK */, TFT_MOSI /* XL MOSI */, &Wire); + TFT_SCLK /* XL SCK */, TFT_MOSI /* XL MOSI */, &Wire); Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel( TFT_DE, TFT_VSYNC, TFT_HSYNC, TFT_PCLK, TFT_R0, TFT_R1, TFT_R2, TFT_R3, TFT_R4, TFT_G0, TFT_G1, TFT_G2, TFT_G3, TFT_G4, TFT_G5, TFT_B0, TFT_B1, TFT_B2, TFT_B3, TFT_B4, TFT_HSYNC_POLARITY, TFT_HSYNC_FRONT_PORCH, TFT_HSYNC_PULSE_WIDTH, TFT_HSYNC_BACK_PORCH, TFT_VSYNC_POLARITY, TFT_VSYNC_FRONT_PORCH, TFT_VSYNC_PULSE_WIDTH, TFT_VSYNC_BACK_PORCH); tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, - st7701_sensecap_indicator_init_operations, sizeof(st7701_sensecap_indicator_init_operations)); + st7701_sensecap_indicator_init_operations, + sizeof(st7701_sensecap_indicator_init_operations)); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(GC9503V_DRIVER) Arduino_DataBus* bus = new Arduino_SWSPI(TFT_DC, TFT_CS, TFT_SCLK, TFT_MOSI, TFT_MISO); @@ -115,8 +113,8 @@ void ArduinoGfx::init(int w, int h) st7701_type1_init_operations, sizeof(st7701_type1_init_operations)); #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 272) && defined(NV3041A_DRIVER) Arduino_DataBus* bus = new Arduino_ESP32QSPI(TFT_CS, TFT_SCK, TFT_D0, TFT_D1, TFT_D2, TFT_D3); - Arduino_GFX* g = new Arduino_NV3041A(bus, TFT_RST, TFT_ROTATION, TFT_IPS); - tft = g; + Arduino_GFX* g = new Arduino_NV3041A(bus, TFT_RST, TFT_ROTATION, TFT_IPS); + tft = g; #elif 1 /* Reset is not implemented in the panel */ if(TFT_RST != GFX_NOT_DEFINED) { @@ -142,7 +140,11 @@ void ArduinoGfx::init(int w, int h) /* TFT init */ LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); - tft->begin(SPI_FREQUENCY); +#if defined(SPI_FREQUENCY) + tft->begin(SPI_FREQUENCY); // Used for SPI displays +#else + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays +#endif LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); // tft.setSwapBytes(true); /* set endianness */ LOG_INFO(TAG_TFT, F(D_SERVICE_STARTED)); From de60c0af49fe9a955082cafd1da60195d66eb8ac Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 14 Dec 2024 22:21:39 +0100 Subject: [PATCH 115/142] Add missing SPI_FREQUENCY #836 --- user_setups/esp32s3/crowpanel-hmi.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_setups/esp32s3/crowpanel-hmi.ini b/user_setups/esp32s3/crowpanel-hmi.ini index 74ebc05c..0651e80b 100644 --- a/user_setups/esp32s3/crowpanel-hmi.ini +++ b/user_setups/esp32s3/crowpanel-hmi.ini @@ -74,7 +74,8 @@ build_flags = -D TFT_DE=41 -D TFT_VSYNC=40 -D TFT_HSYNC=39 - -D TFT_PCLK=0 + -D TFT_PCLK=0 + -D SPI_FREQUENCY=40000000 [env:elecrow-s3-8048c070_4MB] extends = elecrow-esp32-s3-tft, flash_4mb From 7e5762d2ef8b7052367a35a6bb510b851ad7d728 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 14 Dec 2024 22:47:49 +0100 Subject: [PATCH 116/142] Better solution for #830 and #836 --- src/drv/tft/tft_defines.h | 6 +++--- src/drv/tft/tft_driver_arduinogfx.cpp | 26 ++++++++++++++------------ user_setups/esp32s3/crowpanel-hmi.ini | 1 - 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/drv/tft/tft_defines.h b/src/drv/tft/tft_defines.h index 87b02294..66904dfd 100644 --- a/src/drv/tft/tft_defines.h +++ b/src/drv/tft/tft_defines.h @@ -49,9 +49,9 @@ #define TFT_RST -1 #endif -// #ifndef SPI_FREQUENCY -// #define SPI_FREQUENCY -1 // 40000000 -// #endif +#ifndef SPI_FREQUENCY +#define SPI_FREQUENCY 40000000 +#endif #ifndef TFT_D0 #define TFT_D0 -1 diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp index cbe8794d..7170464e 100644 --- a/src/drv/tft/tft_driver_arduinogfx.cpp +++ b/src/drv/tft/tft_driver_arduinogfx.cpp @@ -32,6 +32,7 @@ void ArduinoGfx::init(int w, int h) TFT_HEIGHT /* height */, 35 /* col offset 1 */, 0 /* row offset 1 */, 35 /* col offset 2 */, 0 /* row offset 2 */ ); + tft->begin(SPI_FREQUENCY); // Used for SPI displays #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_PANEL) Wire.begin(17, 18); @@ -49,6 +50,7 @@ void ArduinoGfx::init(int w, int h) tft = new Arduino_RGB_Display(TFT_WIDTH /* width */, TFT_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */, bus, -1 /* RST */, st7701_t_panel_init_operations, sizeof(st7701_t_panel_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(LILYGO_T_RGB) Wire.begin(8 /* SDA */, 48 /* SCL */, 800000L /* speed */); @@ -62,6 +64,7 @@ void ArduinoGfx::init(int w, int h) 1 /* vsync_pulse_width */, 30 /* vsync_back_porch */, 1 /* pclk_active_neg */); tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_type4_init_operations, sizeof(st7701_type4_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(SENSECAP_INDICATOR_D1) Wire.begin(TOUCH_SDA, TOUCH_SCL, I2C_TOUCH_FREQUENCY); @@ -78,6 +81,7 @@ void ArduinoGfx::init(int w, int h) tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_sensecap_indicator_init_operations, sizeof(st7701_sensecap_indicator_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(GC9503V_DRIVER) Arduino_DataBus* bus = new Arduino_SWSPI(TFT_DC, TFT_CS, TFT_SCLK, TFT_MOSI, TFT_MISO); @@ -88,6 +92,7 @@ void ArduinoGfx::init(int w, int h) TFT_VSYNC_BACK_PORCH); tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, gc9503v_type1_init_operations, sizeof(gc9503v_type1_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(ST7701_DRIVER) && defined(ST7701_4848S040) Arduino_DataBus* bus = new Arduino_SWSPI(TFT_DC, TFT_CS, TFT_SCLK, TFT_MOSI, TFT_MISO); @@ -99,6 +104,8 @@ void ArduinoGfx::init(int w, int h) tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_4848S040_init_operations, sizeof(st7701_4848S040_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays + #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(ST7701_DRIVER) /* More data bus class: https://github.com/moononournation/Arduino_GFX/wiki/Data-Bus-Class */ Arduino_DataBus* bus = new Arduino_SWSPI(TFT_DC, TFT_CS, TFT_SCLK, TFT_MOSI, TFT_MISO); @@ -111,10 +118,13 @@ void ArduinoGfx::init(int w, int h) /* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */ tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST, st7701_type1_init_operations, sizeof(st7701_type1_init_operations)); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays + #elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 272) && defined(NV3041A_DRIVER) Arduino_DataBus* bus = new Arduino_ESP32QSPI(TFT_CS, TFT_SCK, TFT_D0, TFT_D1, TFT_D2, TFT_D3); - Arduino_GFX* g = new Arduino_NV3041A(bus, TFT_RST, TFT_ROTATION, TFT_IPS); - tft = g; + tft = new Arduino_NV3041A(bus, TFT_RST, TFT_ROTATION, TFT_IPS); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays + #elif 1 /* Reset is not implemented in the panel */ if(TFT_RST != GFX_NOT_DEFINED) { @@ -133,19 +143,11 @@ void ArduinoGfx::init(int w, int h) TFT_HSYNC_PULSE_WIDTH, TFT_HSYNC_BACK_PORCH, TFT_VSYNC_POLARITY, TFT_VSYNC_FRONT_PORCH, TFT_VSYNC_PULSE_WIDTH, TFT_VSYNC_BACK_PORCH, TFT_PCLK_ACTIVE_NEG, TFT_PREFER_SPEED); - Arduino_RGB_Display_Mod* gfx = new Arduino_RGB_Display_Mod(TFT_WIDTH, TFT_HEIGHT, bus); - tft = gfx; + tft = new Arduino_RGB_Display_Mod(TFT_WIDTH, TFT_HEIGHT, bus); + tft->begin(GFX_NOT_DEFINED); // Used for RFB displays // fb = ((Arduino_RGBPanel_Mod*)tft)->getFramebuffer(); #endif - /* TFT init */ - LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); -#if defined(SPI_FREQUENCY) - tft->begin(SPI_FREQUENCY); // Used for SPI displays -#else - tft->begin(GFX_NOT_DEFINED); // Used for RFB displays -#endif - LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); // tft.setSwapBytes(true); /* set endianness */ LOG_INFO(TAG_TFT, F(D_SERVICE_STARTED)); } diff --git a/user_setups/esp32s3/crowpanel-hmi.ini b/user_setups/esp32s3/crowpanel-hmi.ini index 0651e80b..76923a7b 100644 --- a/user_setups/esp32s3/crowpanel-hmi.ini +++ b/user_setups/esp32s3/crowpanel-hmi.ini @@ -75,7 +75,6 @@ build_flags = -D TFT_VSYNC=40 -D TFT_HSYNC=39 -D TFT_PCLK=0 - -D SPI_FREQUENCY=40000000 [env:elecrow-s3-8048c070_4MB] extends = elecrow-esp32-s3-tft, flash_4mb From 1340ce19bbf478f3b13212d8ae7342b744145465 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 17 Dec 2024 21:51:41 +0100 Subject: [PATCH 117/142] Update ace.js to 1.37.0 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index e5bf05aa..02b6ad2a 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index 0644d3ea..f03b1a34 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.5")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.37.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 1e85b3cd46e163d4c9090006c51d9efd79838e0e Mon Sep 17 00:00:00 2001 From: psyko_chewbacca Date: Sun, 22 Dec 2024 00:42:09 -0500 Subject: [PATCH 118/142] Initial support for Guiton ESP32-2432S022C --- src/drv/tft/tft_driver_lovyangfx.cpp | 67 +++++++++++++++++++++++++++ user_setups/esp32/esp32-2432s022c.ini | 64 +++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 user_setups/esp32/esp32-2432s022c.ini diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index bc3854f9..371c7718 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -805,6 +805,73 @@ void LovyanGfx::init(int w, int h) cfg.pin_mosi = TOUCH_MOSI; cfg.pin_miso = TOUCH_MISO; cfg.pin_cs = TOUCH_CS; + _touch_instance->config(cfg); + _panel_instance->setTouch(_touch_instance); + } +#elif defined(ESP32_2432S022C) + //pinMode(PWR_EN, OUTPUT); + //digitalWrite(PWR_EN, HIGH); + + auto _panel_instance = new lgfx::Panel_ST7789(); + auto _bus_instance = new lgfx::Bus_Parallel8(); + auto _touch_instance = new lgfx::Touch_CST816S(); + { + auto cfg = _bus_instance->config(); + cfg.freq_write = 16000000; + cfg.pin_wr = TFT_WR; + cfg.pin_rd = TFT_RD; + cfg.pin_rs = TFT_DC; // D/C + cfg.pin_d0 = TFT_D0; + cfg.pin_d1 = TFT_D1; + cfg.pin_d2 = TFT_D2; + cfg.pin_d3 = TFT_D3; + cfg.pin_d4 = TFT_D4; + cfg.pin_d5 = TFT_D5; + cfg.pin_d6 = TFT_D6; + cfg.pin_d7 = TFT_D7; + _bus_instance->config(cfg); + _panel_instance->setBus(_bus_instance); + } + + { + auto cfg = _panel_instance->config(); + cfg.pin_cs = TFT_CS; + cfg.pin_rst = TFT_RST; + cfg.pin_busy = TFT_BUSY; + cfg.memory_width = TFT_WIDTH; + cfg.memory_height = TFT_HEIGHT; + cfg.panel_width = TFT_WIDTH; + cfg.panel_height = TFT_HEIGHT; + cfg.offset_x = 0; + cfg.offset_y = 0; + cfg.offset_rotation = TFT_ROTATION; + cfg.dummy_read_pixel = 8; + cfg.dummy_read_bits = 1; + cfg.readable = true; + cfg.invert = false; + cfg.rgb_order = false; + cfg.dlen_16bit = false; + cfg.bus_shared = false; + _panel_instance->config(cfg); + } + + { + auto cfg = _touch_instance->config(); + + cfg.x_min = 0; + cfg.x_max = TFT_WIDTH; + cfg.y_min = 0; + cfg.y_max = TFT_HEIGHT; + cfg.pin_int = TOUCH_IRQ; + cfg.bus_shared = true; + cfg.offset_rotation = 0; + + cfg.i2c_port = I2C_TOUCH_PORT; + cfg.i2c_addr = I2C_TOUCH_ADDRESS; + cfg.pin_sda = TOUCH_SDA; + cfg.pin_scl = TOUCH_SCL; + cfg.freq = I2C_TOUCH_FREQUENCY; + _touch_instance->config(cfg); _panel_instance->setTouch(_touch_instance); } diff --git a/user_setups/esp32/esp32-2432s022c.ini b/user_setups/esp32/esp32-2432s022c.ini new file mode 100644 index 00000000..f6bac492 --- /dev/null +++ b/user_setups/esp32/esp32-2432s022c.ini @@ -0,0 +1,64 @@ +[env:esp32-2432s022c] +extends = arduino_esp32_v2, flash_4mb +board = esp32dev +upload_speed = 921600 + +build_flags = + ${arduino_esp32_v2.build_flags} + ${esp32.no_ps_ram} + +;region -- TFT_eSPI build options ------------------------ + -D ESP32_2432S022C=1 + -D LGFX_USE_V1=1 +; -D USER_SETUP_LOADED=1 + -D ST7789_DRIVER=1 +; -D CGRAM_OFFSET=1 +; -DSUPPORT_TRANSACTIONS + -D TFT_INVERSION_OFF + -D TFT_PARALLEL_8_BIT + -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree + -D TFT_WIDTH=240 + -D TFT_HEIGHT=320 + -D TFT_CS=17 ; Chip select control pin=library pulls permanently low + -D TFT_DC=16 ; Data Command control pin + -D TFT_RST=-1 ; Reset pin, toggles on startup + -D TFT_WR=4 ; Write strobe control pin + -D TFT_RD=2 ; Read strobe control pin + -D TFT_D0=15 + -D TFT_D1=13 + -D TFT_D2=12 + -D TFT_D3=14 + -D TFT_D4=27 + -D TFT_D5=25 + -D TFT_D6=33 + -D TFT_D7=32 + -D TFT_BCKL=0 ; LED back-light + + ;CST816S driver + -D TOUCH_DRIVER=0x816 + -D HASP_USE_LGFX_TOUCH=1 + -D I2C_TOUCH_PORT=I2C_NUM_0 + -D TOUCH_SDA=21 + -D TOUCH_SCL=22 + -D TOUCH_IRQ=-1 + -D TOUCH_RST=-1 + -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_ADDRESS=0x15 + + + -D SD_MISO=19 + -D SD_MOSI=23 + -D SD_SCLK=18 + -D SD_CS=5 + + ; sound output is on IO26, through an SC8002B IC + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG +;endregion + +lib_deps = + ${arduino_esp32_v2.lib_deps} + ${lovyangfx.lib_deps} + ;${tft_espi.lib_deps} + From bddbc3cb395aa5b637c5f8e16311f0dd9c984e7d Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 23 Dec 2024 15:21:22 +0100 Subject: [PATCH 119/142] Add esp32-2432s022c_4MB --- .github/workflows/build.yaml | 2 +- user_setups/esp32/esp32-2432s022c.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cbb5c4e9..6dbd3fe6 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -52,7 +52,7 @@ jobs: - out: seeed-studios env: "sensecap-indicator-d1_8MB" - out: sunton - env: "esp32-2432s028r_4MB -e esp32-2432s028r-ili9342_4MB -e esp32-2432s028r_v2_4MB -e esp32-2432s032c_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB" + env: "esp32-2432s022c_4MB -e esp32-2432s028r_4MB -e esp32-2432s028r-ili9342_4MB -e esp32-2432s028r_v2_4MB -e esp32-2432s032c_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB" - out: waveshare env: "esp32-one_ili9486 -e esp32-one_st7796 -e ws_esp32_s3_touch_lcd_4p3" - out: wireless-tag diff --git a/user_setups/esp32/esp32-2432s022c.ini b/user_setups/esp32/esp32-2432s022c.ini index f6bac492..aaecc02e 100644 --- a/user_setups/esp32/esp32-2432s022c.ini +++ b/user_setups/esp32/esp32-2432s022c.ini @@ -1,4 +1,4 @@ -[env:esp32-2432s022c] +[env:esp32-2432s022c_4MB] extends = arduino_esp32_v2, flash_4mb board = esp32dev upload_speed = 921600 From 3eda5a4225e933d65ecd4044759b9b4b504bb72d Mon Sep 17 00:00:00 2001 From: fvanroie Date: Mon, 23 Dec 2024 17:13:27 +0100 Subject: [PATCH 120/142] Fix for #839 --- src/hasp/hasp.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp index 4e0f4eef..c0206764 100644 --- a/src/hasp/hasp.cpp +++ b/src/hasp/hasp.cpp @@ -111,7 +111,8 @@ lv_font_t* hasp_get_font(uint8_t fontid) */ HASP_ATTRIBUTE_FAST_MEM void hasp_update_sleep_state() { - if(hasp_first_touch_state) return; // don't update sleep when first touch is still active + // Don't fast exit, see issue #839 + // if(hasp_first_touch_state) return; // don't update sleep when first touch is still active uint32_t idle = lv_disp_get_inactive_time(lv_disp_get_default()) / 1000; idle += sleepTimeOffset; // To force a specific state From c3a3222e4a0987f11240f7477ad575ef9a5f6bd6 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 25 Dec 2024 17:37:24 +0100 Subject: [PATCH 121/142] stmpe610 fix ghost touches --- src/drv/touch/touch_driver_stmpe610.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/drv/touch/touch_driver_stmpe610.h b/src/drv/touch/touch_driver_stmpe610.h index 1b52653e..4e9386d8 100644 --- a/src/drv/touch/touch_driver_stmpe610.h +++ b/src/drv/touch/touch_driver_stmpe610.h @@ -29,8 +29,7 @@ bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) data->state = LV_INDEV_STATE_REL; // while touched, but the state is released => read next point - while(data->state == LV_INDEV_STATE_REL && stmpe610_touchpanel.touched()) { - + while(data->state == LV_INDEV_STATE_REL && !stmpe610_touchpanel.bufferEmpty()) { TS_Point point = stmpe610_touchpanel.getPoint(); Log.trace(TAG_DRVR, F("STMPE610: x=%i y=%i z=%i"), point.x, point.y, point.z); From f663d16cb694e2f18c078106f0af83634ca23361 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Tue, 7 Jan 2025 16:47:55 +0100 Subject: [PATCH 122/142] Update ace.js 1.37.3 --- data/edit.htm | 2 +- data/script.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/edit.htm b/data/edit.htm index 02b6ad2a..a9557ca1 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1 +1 @@ -openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/script.js b/data/script.js index f03b1a34..00808de1 100644 --- a/data/script.js +++ b/data/script.js @@ -1 +1 @@ -var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.37.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.37.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file From 31ca81e274ac27ef4604aff14e4a81f6b4b98617 Mon Sep 17 00:00:00 2001 From: Garag Date: Mon, 13 Jan 2025 21:00:50 +0100 Subject: [PATCH 123/142] touch size adapted to screen size --- user_setups/esp32s3/sunton-esp32-s3-tft.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_setups/esp32s3/sunton-esp32-s3-tft.ini b/user_setups/esp32s3/sunton-esp32-s3-tft.ini index 5c4e9139..fbdf401a 100644 --- a/user_setups/esp32s3/sunton-esp32-s3-tft.ini +++ b/user_setups/esp32s3/sunton-esp32-s3-tft.ini @@ -145,8 +145,8 @@ build_flags = -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency -D TFT_AUTO_FLUSH=1 ; Touch Settings - -D TOUCH_WIDTH=480 - -D TOUCH_HEIGHT=272 + -D TOUCH_WIDTH=800 + -D TOUCH_HEIGHT=480 -D TOUCH_DRIVER=0x911 -D TOUCH_SCL=20 -D TOUCH_SDA=19 From 7c7c65acc44b716fb1baa1400bceb81b25e07e8f Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Fri, 7 Jun 2024 18:31:44 +0200 Subject: [PATCH 124/142] Add sunton esp32-2432s024{r,c} --- src/drv/tft/tft_driver_lovyangfx.cpp | 26 +++++ user_setups/esp32s3/sunton-esp32-2432s024.ini | 101 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 user_setups/esp32s3/sunton-esp32-2432s024.ini diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp index 751dfaf9..2959a436 100644 --- a/src/drv/tft/tft_driver_lovyangfx.cpp +++ b/src/drv/tft/tft_driver_lovyangfx.cpp @@ -380,6 +380,32 @@ lgfx::ITouch* _init_touch(Preferences* preferences) } #endif +#if TOUCH_DRIVER == 0x0820 + + { // タッチスクリーン制御の設定を行います。(必要なければ削除) + auto touch = new lgfx::Touch_FT5x06(); + auto cfg = touch->config(); + + cfg.x_min = 0; // The minimum X value obtained from the touchscreen (raw value). + cfg.x_max = TFT_WIDTH - 1; // The maximum X value obtained from the touchscreen (raw value). + cfg.y_min = 0; // The minimum Y value obtained from the touchscreen (raw value). + cfg.y_max = TFT_HEIGHT - 1; // The maximum Y value obtained from the touchscreen (raw value). + cfg.bus_shared = true; // If using a common bus with the screen, set it to true. + cfg.offset_rotation = TOUCH_OFFSET_ROTATION; // Adjustment when the display orientation does not match the touch orientation. Set in values from 0 to 7. + + // I2C接続の場合 + cfg.i2c_port = I2C_TOUCH_PORT; // 使用するI2Cを選択 (0 or 1) + cfg.i2c_addr = I2C_TOUCH_ADDRESS; // I2Cデバイスアドレス番号 + cfg.pin_sda = TOUCH_SDA; // SDAが接続されているピン番号 + cfg.pin_scl = TOUCH_SCL; // SCLが接続されているピン番号 + cfg.pin_int = TOUCH_IRQ; // INTが接続されているピン番号 + cfg.freq = I2C_TOUCH_FREQUENCY; // I2Cクロックを設定 + + touch->config(cfg); + return touch; + } +#endif + #if TOUCH_DRIVER == 0x6336 { auto touch = new lgfx::Touch_FT5x06(); diff --git a/user_setups/esp32s3/sunton-esp32-2432s024.ini b/user_setups/esp32s3/sunton-esp32-2432s024.ini new file mode 100644 index 00000000..75e47038 --- /dev/null +++ b/user_setups/esp32s3/sunton-esp32-2432s024.ini @@ -0,0 +1,101 @@ +;***************************************************; +; Sunton ESP32-WROOM custom dev board with ; +; - ILI9341 TFT SPI 4-WIRE ; +; - XPT2046 or CST820 touch controller ; +;***************************************************; + +[sunton-esp32-2432s024] +extends = arduino_esp32_v2 +board = esp32dev + +build_flags = + ${arduino_esp32_v2.build_flags} + ${esp32.no_ps_ram} + +;region -- TFT_eSPI build options ------------------------ + ${esp32.hspi} ; Use HSPI hardware SPI bus + -D ILI9341_DRIVER=1 + -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree + -D TFT_WIDTH=240 + -D TFT_HEIGHT=320 + -D TFT_CS=15 ;// Chip select control pin + -D TFT_DC=2 ;// Data Command control pin + -D TFT_RST=-1 ;// Reset pin (could connect to RST pin) + -D TFT_BCKL=27 ;None, configurable via web UI (e.g. 2 for D4) + -D SUPPORT_TRANSACTIONS + -D SPI_FREQUENCY=65000000 + -D SPI_READ_FREQUENCY=20000000 +;endregion + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + + +[env:esp32-2432s024r_4MB] +extends = sunton-esp32-2432s024, flash_4mb +build_flags = + ${sunton-esp32-2432s024.build_flags} + -D USER_SETUP_LOADED=1 + -D TOUCH_CS=33 + -D TOUCH_DRIVER=0x2046 ; XPT2606 Resistive touch panel driver + -D HASP_USE_LGFX_TOUCH=1 + -D TOUCH_SDA=-1 + -D TOUCH_SCL=-1 + -D TOUCH_IRQ=-1 + -D I2C_TOUCH_PORT=0 + -D I2C_TOUCH_ADDRESS=0 + -D I2C_TOUCH_FREQUENCY=0 + -D SPI_TOUCH_FREQUENCY=2500000 + +lib_deps = + ${sunton-esp32-2432s024.lib_deps} + ${tft_espi.lib_deps} + ;${lovyangfx.lib_deps} + + +[env:esp32-2432s024c_4MB] +upload_port = /dev/ttyUSB0 +extends = sunton-esp32-2432s024, flash_4mb +board = esp32dev + +build_flags = + ${sunton-esp32-2432s024.build_flags} + ${esp32.no_ps_ram} + +;region -- TFT_eSPI build options ------------------------ + ${esp32.hspi} ; Use HSPI hardware SPI bus + ;-D USER_SETUP_LOADED=1 + -D LGFX_USE_V1=1 + -D ILI9341_DRIVER=1 + -D TOUCH_DRIVER=0x0820 ; CST820 Capacitive I2C touch panel driver + -D HASP_USE_LGFX_TOUCH=1 + -D TFT_ROTATION=2 ; 0=0, 1=90, 2=180 or 3=270 degree + -D TFT_WIDTH=240 + -D TFT_HEIGHT=320 + -D TFT_CS=15 ;// Chip select control pin + -D TFT_DC=2 ;// Data Command control pin + -D TFT_RST=-1 ;// Reset pin (could connect to RST pin) + -D TFT_BCKL=27 ;None, configurable via web UI (e.g. 2 for D4) + -D SUPPORT_TRANSACTIONS + -D TOUCH_SDA=33 + -D TOUCH_SCL=32 + -D TOUCH_IRQ=21 + -D TOUCH_OFFSET_ROTATION=2 ;touch rotation + ;-D TOUCH_IRQ=-1 + -D TOUCH_RST=25 + -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_PORT=1 + -D I2C_TOUCH_ADDRESS=0x15 ; or 0x14 + -D SPI_FREQUENCY=65000000 + -D SPI_TOUCH_FREQUENCY=2500000 + -D SPI_READ_FREQUENCY=20000000 +;endregion + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + +lib_deps = + ${sunton-esp32-2432s024.lib_deps} + ;${tft_espi.lib_deps} + ${lovyangfx.lib_deps} + ;${goodix.lib_deps} From 1ebd9e29fe7a14e463f80cf756734fc1db1b6362 Mon Sep 17 00:00:00 2001 From: Grzegorz Grasza Date: Thu, 13 Feb 2025 17:20:21 +0100 Subject: [PATCH 125/142] Working esp32-2432s024r_4MB support The original configuration displayed only part of the screen. The needed modification was to switch width and height and integrate more flags already used by the capacitive version of this board. --- user_setups/esp32s3/sunton-esp32-2432s024.ini | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/user_setups/esp32s3/sunton-esp32-2432s024.ini b/user_setups/esp32s3/sunton-esp32-2432s024.ini index 75e47038..8e3b7ac8 100644 --- a/user_setups/esp32s3/sunton-esp32-2432s024.ini +++ b/user_setups/esp32s3/sunton-esp32-2432s024.ini @@ -14,10 +14,11 @@ build_flags = ;region -- TFT_eSPI build options ------------------------ ${esp32.hspi} ; Use HSPI hardware SPI bus + -D LGFX_USE_V1=1 + -D HASP_USE_LGFX_TOUCH=1 -D ILI9341_DRIVER=1 - -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree - -D TFT_WIDTH=240 - -D TFT_HEIGHT=320 + -D TFT_WIDTH=320 + -D TFT_HEIGHT=240 -D TFT_CS=15 ;// Chip select control pin -D TFT_DC=2 ;// Data Command control pin -D TFT_RST=-1 ;// Reset pin (could connect to RST pin) @@ -25,33 +26,48 @@ build_flags = -D SUPPORT_TRANSACTIONS -D SPI_FREQUENCY=65000000 -D SPI_READ_FREQUENCY=20000000 + -D SPI_TOUCH_FREQUENCY=2500000 ;endregion ; -- Debugging options ----------------------------- ; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG +lib_deps = + ${arduino_esp32_v2.lib_deps} + ${lovyangfx.lib_deps} + [env:esp32-2432s024r_4MB] +upload_port = /dev/ttyUSB0 extends = sunton-esp32-2432s024, flash_4mb +board = esp32dev + build_flags = ${sunton-esp32-2432s024.build_flags} - -D USER_SETUP_LOADED=1 + ${esp32.no_ps_ram} + +;region -- TFT_eSPI build options ------------------------ + ${esp32.hspi} ; Use HSPI hardware SPI bus + ;-D USER_SETUP_LOADED=1 + -D TFT_RGB_ORDER=1 ; Colour order Red-Green-Blue + -D TFT_ROTATION=5 ; 0=0, 1=90, 2=180 or 3=270 degree -D TOUCH_CS=33 + -D TOUCH_SCLK=14 + -D TOUCH_MOSI=13 + -D TOUCH_MISO=12 -D TOUCH_DRIVER=0x2046 ; XPT2606 Resistive touch panel driver - -D HASP_USE_LGFX_TOUCH=1 -D TOUCH_SDA=-1 -D TOUCH_SCL=-1 -D TOUCH_IRQ=-1 -D I2C_TOUCH_PORT=0 -D I2C_TOUCH_ADDRESS=0 -D I2C_TOUCH_FREQUENCY=0 - -D SPI_TOUCH_FREQUENCY=2500000 + -D TOUCH_OFFSET_ROTATION=0 ;touch rotation +;endregion + +; -- Debugging options ----------------------------- +; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -lib_deps = - ${sunton-esp32-2432s024.lib_deps} - ${tft_espi.lib_deps} - ;${lovyangfx.lib_deps} - [env:esp32-2432s024c_4MB] upload_port = /dev/ttyUSB0 @@ -65,37 +81,18 @@ build_flags = ;region -- TFT_eSPI build options ------------------------ ${esp32.hspi} ; Use HSPI hardware SPI bus ;-D USER_SETUP_LOADED=1 - -D LGFX_USE_V1=1 - -D ILI9341_DRIVER=1 + -D TFT_ROTATION=4 ; 0=0, 1=90, 2=180 or 3=270 degree -D TOUCH_DRIVER=0x0820 ; CST820 Capacitive I2C touch panel driver - -D HASP_USE_LGFX_TOUCH=1 - -D TFT_ROTATION=2 ; 0=0, 1=90, 2=180 or 3=270 degree - -D TFT_WIDTH=240 - -D TFT_HEIGHT=320 - -D TFT_CS=15 ;// Chip select control pin - -D TFT_DC=2 ;// Data Command control pin - -D TFT_RST=-1 ;// Reset pin (could connect to RST pin) - -D TFT_BCKL=27 ;None, configurable via web UI (e.g. 2 for D4) - -D SUPPORT_TRANSACTIONS -D TOUCH_SDA=33 -D TOUCH_SCL=32 -D TOUCH_IRQ=21 - -D TOUCH_OFFSET_ROTATION=2 ;touch rotation ;-D TOUCH_IRQ=-1 -D TOUCH_RST=25 -D I2C_TOUCH_FREQUENCY=400000 -D I2C_TOUCH_PORT=1 -D I2C_TOUCH_ADDRESS=0x15 ; or 0x14 - -D SPI_FREQUENCY=65000000 - -D SPI_TOUCH_FREQUENCY=2500000 - -D SPI_READ_FREQUENCY=20000000 + -D TOUCH_OFFSET_ROTATION=2 ;touch rotation ;endregion ; -- Debugging options ----------------------------- ; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG - -lib_deps = - ${sunton-esp32-2432s024.lib_deps} - ;${tft_espi.lib_deps} - ${lovyangfx.lib_deps} - ;${goodix.lib_deps} From 72e7fdcbed1417e9f417cdb0e0313259cc1a6def Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:12:14 +0100 Subject: [PATCH 126/142] New translations en.json (Russian) --- data/ru_RU.json | 162 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 data/ru_RU.json diff --git a/data/ru_RU.json b/data/ru_RU.json new file mode 100644 index 00000000..0451a298 --- /dev/null +++ b/data/ru_RU.json @@ -0,0 +1,162 @@ +{ + "en": { + "language": "English", + "home": { + "title": "Main Menu", + "btn": "Main Menu", + "nav": "Home" + }, + "save": "Save Settings", + "user": "Username", + "pass": "Password", + "hasp": { + "title": "HASP Design", + "btn": "HASP Design", + "theme": "UI Theme", + "color1": "Primary color", + "color2": "Secondary color", + "pages": "Start Layout", + "font": "Default Font", + "startpage": "Startup Page", + "startdim": "Startup Dim" + }, + "screenshot": { + "title": "Screenshot", + "btn": "Screenshot", + "nav": "Screenshot", + "prev": "Prev Page", + "next": "Next Page", + "refresh": "Refresh" + }, + "info": { + "title": "Information", + "btn": "Information", + "nav": "Information" + }, + "config": { + "title": "Configuration", + "btn": "Configuration", + "nav": "Settings" + }, + "ota": { + "title": "Firmware Update", + "btn": "Firmware Update", + "nav": "Firmware", + "submit": "Update Firmware", + "file": "Firmware File", + "url": "Firmware URL", + "redirect": "Follow Redirects", + "never": "Never", + "strict": "Strict", + "always": "Always" + }, + "editor": { + "title": "File Editor", + "btn": "File Editor", + "nav": "File Editor" + }, + "reset": { + "title": "Factory Reset", + "btn": "Factory Reset", + "warning": "Warning", + "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.", + "fileloss": "ALL FILES WILL BE LOST!" + }, + "reboot": { + "title": "Rebooting...", + "btn": "Restart", + "nav": "Reboot", + "message": "The device is rebooting." + }, + "about": { + "credits": "Based on the previous work of the following open source developers:", + "copyright": "Copyright ", + "rights": "All rights reserved.", + "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "mit": "MIT License", + "bsd": "BSD License", + "freebsd": "FreeBSD License", + "apache2": "Apache2 License" + }, + "wifi": { + "title": "Wifi Settings", + "btn": "Wifi Settings", + "ssid": "SSID" + }, + "wg": { + "title": "WireGuard Settings", + "btn": "WireGuard Settings", + "vpnip": "VPN IP", + "privkey": "Private Key", + "host": "Remote IP", + "port": "Remote Port", + "pubkey": "Remote Public Key" + }, + "mqtt": { + "title": "MQTT Settings", + "btn": "MQTT Settings", + "name": "Hostname", + "group": "Groupname", + "host": "Broker", + "port": "Port", + "node_t": "Node Topic", + "group_t": "Group Topic", + "broadcast_t": "Broadcast Topic", + "hass_t": "HA LWT Topic" + }, + "http": { + "title": "HTTP Settings", + "btn": "HTTP Settings" + }, + "ftp": { + "title": "FTP Settings", + "btn": "FTP Settings", + "port": "FTP Port", + "pasv": "Passive Port" + }, + "gui": { + "title": "Display Settings", + "btn": "Display Settings", + "antiburn": "Antiburn", + "calibrate": "Calibrate" + }, + "gpio": "GPIO Settings", + "debug": { + "title": "Debug Settings", + "btn": "Debug Settings", + "baud": "Baudrate", + "tele": "Tele Period", + "ansi": "Use ANSI codes", + "host": "Syslog Server", + "port": "Syslog Port", + "ietf": "IETF (RFC 5424)", + "bsd": "BSD (RFC 3164)", + "log": "Facility" + }, + "time": { + "title": "Time Settings", + "btn": "Time Settings", + "region": "Region", + "zone": "Timezone", + "tz": "Timezone", + "ntp": "NTP Servers" + }, + "region": { + "etc": "Etcetera ", + "continents": "Continents ", + "af": "Africa ", + "as": "Asia ", + "au": "Australia ", + "aq": "Antarctica ", + "eu": "Europe ", + "na": "North America ", + "sa": "South America ", + "islands": "Islands ", + "at": "Atlantic Ocean ", + "in": "Indian Ocean ", + "pa": "Pacific Ocean " + } + } +} \ No newline at end of file From e5794ab6e181c84324674ad7e5ebd0feeafbcd90 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:12:15 +0100 Subject: [PATCH 127/142] New translations en_us.h (Russian) --- src/lang/ru_RU.h | 242 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 src/lang/ru_RU.h diff --git a/src/lang/ru_RU.h b/src/lang/ru_RU.h new file mode 100644 index 00000000..35a5bf66 --- /dev/null +++ b/src/lang/ru_RU.h @@ -0,0 +1,242 @@ +// This translation file is maintained on https://crowdin.com/project/openhasp/ +// Do not edit directly! + +#ifndef HASP_LANG_RU_RU_H +#define HASP_LANG_RU_RU_H + +#define D_ISO_LANG_CODE "ru-RU" + +#define D_USERNAME "Имя пользователя:" +#define D_PASSWORD "Пароль:" +#define D_SSID "Ssid:" +#define D_YES "Да" +#define D_NO "Нет" + +#define D_ERROR_OUT_OF_MEMORY "Не хватает памяти" +#define D_ERROR_UNKNOWN "Неизвестная ошибка" + +#define D_CONFIG_NOT_CHANGED "Настройки не изменены" +#define D_CONFIG_CHANGED "Настройки изменены" +#define D_CONFIG_LOADED "Настройки загружены" + +#define D_FILE_LOADING "Загружается %s" +#define D_FILE_LOADED "Загружено %s" +#define D_FILE_LOAD_FAILED "Ошибка загрузки %s" +#define D_FILE_SAVING "Сохранение %s" +#define D_FILE_SAVED "Сохранено %s" +#define D_FILE_SAVE_FAILED "Ошибка сохранения %s" +#define D_FILE_NOT_FOUND "Файл не найден" +#define D_FILE_SIZE_BYTES "байт" +#define D_FILE_SIZE_KILOBYTES "KiB" +#define D_FILE_SIZE_MEGABYTES "MiB" +#define D_FILE_SIZE_GIGABYTES "GiB" +#define D_FILE_SIZE_TERABYTES "TiB" +#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes +#define D_DECIMAL_POINT "." // decimal comma or point + +#define D_SERVICE_STARTING "Запуск..." +#define D_SERVICE_STARTED "Запущено" +#define D_SERVICE_START_FAILED "Ошибка запуска" +#define D_SERVICE_STOPPED "Остановлено" +#define D_SERVICE_DISABLED "Отключено" +#define D_SERVICE_CONNECTED "Подключен" +#define D_SERVICE_DISCONNECTED "Отключен" + +#define D_SETTING_ENABLED "Включено" +#define D_SETTING_DISABLED "Выключено" +#define D_SETTING_DEFAULT "По умолчанию" + +#define D_NETWORK_IP_ADDRESS_RECEIVED "Получен IP адрес %s" +#define D_NETWORK_ONLINE "онлайн" +#define D_NETWORK_OFFLINE "оффлайн" +#define D_NETWORK_CONNECTION_FAILED "Ошибка подключения" +#define D_NETWORK_CONNECTION_UNAUTHORIZED "Ошибка авторизации" + +#define D_MQTT_DEFAULT_NAME "plate_%s" +#define D_MQTT_CONNECTING "Подключение..." +#define D_MQTT_CONNECTED "Подключен к брокеру %s с clientID %s" +#define D_MQTT_NOT_CONNECTED "Не подключен ???" +#define D_MQTT_DISCONNECTING "Отключение..." +#define D_MQTT_DISCONNECTED "Отключен" +#define D_MQTT_RECONNECTING "Отключен от брокера, переподключение..." +#define D_MQTT_NOT_CONFIGURED "Брокер не настроен" +#define D_MQTT_STARTED "Запущен: %d байт" +#define D_MQTT_FAILED "Не удалось:" +#define D_MQTT_INVALID_TOPIC "Сообщение имеет недопустимую тему" +#define D_MQTT_SUBSCRIBED "Подписан на %s" +#define D_MQTT_NOT_SUBSCRIBED "Не удалось подписаться на %s" +#define D_MQTT_HA_AUTO_DISCOVERY "Зарегистрирован в HA auto-discovery" +#define D_MQTT_PAYLOAD_TOO_LONG "Пейлоад слишком длинный(%u байт)" + +#define D_TELNET_CLOSING_CONNECTION "Закрытие сессии от %s" +#define D_TELNET_CLIENT_LOGIN_FROM "Клиент авторизовался от %s" +#define D_TELNET_CLIENT_CONNECT_FROM "Клиент подключился от %s" +#define D_TELNET_CLIENT_NOT_CONNECTED "Клиент НЕ подключен" +#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Неверная попытка входа в систему %s" +#define D_TELNET_STARTED "Telnet консоль запущена" +#define D_TELNET_FAILED "Ошибка запуска telnet консоли" +#define D_TELNET_CLIENT_CONNECTED "Клиент подключен" +#define D_TELNET_CLIENT_REJECTED "Клиент отклонен" + +#define D_HASP_INVALID_PAGE "Неверная страница %u" +#define D_HASP_INVALID_LAYER "Невозможно очистить системный уровень" +#define D_HASP_CHANGE_PAGE "Изменение страницы на %u" +#define D_HASP_CLEAR_PAGE "Очистка страницы %u" + +#define D_OBJECT_DELETED "Объект удален" +#define D_OBJECT_UNKNOWN "Неизвестный объект" +#define D_OBJECT_MISMATCH "Объекты НЕ совпадают!" +#define D_OBJECT_LOST "Потерянный объект!" +#define D_OBJECT_CREATE_FAILED "Ошибка создания объета с id %u" +#define D_OBJECT_PAGE_UNKNOWN "Страница с ID %u не определена" +#define D_OBJECT_EVENT_UNKNOWN "Неизвестное событие %d" + +#define D_ATTRIBUTE_UNKNOWN "Неизвестное свойство %s" +// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone +#define D_ATTRIBUTE_OBSOLETE "%s это устарело" +#define D_ATTRIBUTE_INSTEAD ", используйте %s вместо него" +#define D_ATTRIBUTE_READ_ONLY "%s только для чтения" +#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Невозможно вызвать %s на странице" +#define D_ATTRIBUTE_ALIGN_INVALID "Недопустимое свойство выравнивания: %s" +#define D_ATTRIBUTE_COLOR_INVALID "Недопустимое свойство цвета: %s" +#define D_ATTRIBUTE_LONG_MODE_INVALID "Недопустимый режим длины: %s" + +#define D_OOBE_SSID_VALIDATED "SSID %s подтвержден" +#define D_OOBE_AUTO_CALIBRATE "Автокалибровка включена" +#define D_OOBE_CALIBRATED "Уже откалиброван" + +#define D_DISPATCH_COMMAND_NOT_FOUND "Команда '%s' не найдена" +#define D_DISPATCH_INVALID_PAGE "Неверная страница %s" +#define D_DISPATCH_REBOOT "Rebooting the MCU now!" + +#define D_JSON_FAILED "JSON parsing failed:" +#define D_JSONL_FAILED "JSONL parsing failed at line %u" +#define D_JSONL_SUCCEEDED "Jsonl fully parsed" + +#define D_OTA_CHECK_UPDATE "Trying update URL: %s" +#define D_OTA_CHECK_COMPLETE "Update check complete" +#define D_OTA_CHECK_FAILED "Update check failed: %s" +#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update" +#define D_OTA_UPDATE_COMPLETE "OTA Update complete" +#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot" +#define D_OTA_UPDATE_FAILED "OTA Update failed" +#define D_OTA_UPDATING_FIRMWARE "Updating firmware..." +#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..." + +#define D_HTTP_HASP_DESIGN "HASP Design" +#define D_HTTP_INFORMATION "Information" +#define D_HTTP_HTTP_SETTINGS "HTTP Settings" +#define D_HTTP_FTP_SETTINGS "FTP Settings" +#define D_HTTP_WIFI_SETTINGS "Wifi Settings" +#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" +#define D_HTTP_MQTT_SETTINGS "MQTT Settings" +#define D_HTTP_GPIO_SETTINGS "GPIO Settings" +#define D_HTTP_MDNS_SETTINGS "mDNS Settings" +#define D_HTTP_TELNET_SETTINGS "Telnet Settings" +#define D_HTTP_DEBUG_SETTINGS "Debug Settings" +#define D_HTTP_GUI_SETTINGS "Display Settings" +#define D_HTTP_SAVE_SETTINGS "Save Settings" +#define D_HTTP_UPLOAD_FILE "Upload File" +#define D_HTTP_ERASE_DEVICE "Reset All Settings" +#define D_HTTP_ADD_GPIO "Add New Pin" +#define D_HTTP_BACK "Back" +#define D_HTTP_REFRESH "Refresh" +#define D_HTTP_PREV_PAGE "Prev Page" +#define D_HTTP_NEXT_PAGE "Next Page" +#define D_HTTP_CALIBRATE "Calibrate" +#define D_HTTP_ANTIBURN "Run Anti Burn-in" +#define D_HTTP_SCREENSHOT "Screenshot" +#define D_HTTP_FILE_BROWSER "File Editor" +#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade" +#define D_HTTP_UPDATE_FIRMWARE "Update Firmware" +#define D_HTTP_FACTORY_RESET "Factory Reset" +#define D_HTTP_MAIN_MENU "Main Menu" +#define D_HTTP_REBOOT "Restart" +#define D_HTTP_CONFIGURATION "Configuration" +#define D_HTTP_CONFIG_CHANGED \ + "The configuration has changed, please click Restart to save changes to flash." +#define D_HTTP_SENDING_PAGE "Sent %S page to %s" +#define D_HTTP_FOOTER "by Francis Van Roie" + +#define D_INFO_VERSION "Version" +#define D_INFO_BUILD_DATETIME "Build DateTime" +#define D_INFO_ENVIRONMENT "Environment" +#define D_INFO_UPTIME "Uptime" +#define D_INFO_FREE_HEAP "Free Heap" +#define D_INFO_FREE_BLOCK "Free Block" +#define D_INFO_DEVICE_MEMORY "Device Memory" +#define D_INFO_LVGL_MEMORY "LVGL Memory" +#define D_INFO_TOTAL_MEMORY "Total" +#define D_INFO_FREE_MEMORY "Free" +#define D_INFO_FRAGMENTATION "Fragmentation" +#define D_INFO_PSRAM_FREE "PSRam Free" +#define D_INFO_PSRAM_SIZE "PSRam Size" +#define D_INFO_FLASH_SIZE "Flash Size" +#define D_INFO_SKETCH_USED "Program Size Used" +#define D_INFO_SKETCH_FREE "Program Size Free" +#define D_INFO_FS_SIZE "Filesystem Size" +#define D_INFO_FS_USED "Filesystem Used" +#define D_INFO_FS_FREE "Filesystem Free" +#define D_INFO_MODULE "Module" +#define D_INFO_MODEL "Model" +#define D_INFO_FREQUENCY "Frequency" +#define D_INFO_CORE_VERSION "Core Version" +#define D_INFO_RESET_REASON "Reset Reason" +#define D_INFO_STATUS "Status" +#define D_INFO_SERVER "Server" +#define D_INFO_USERNAME "Username" +#define D_INFO_CLIENTID "Client ID" +// #define D_INFO_CONNECTED "Connected" +// #define D_INFO_DISCONNECTED "Disconnected" +#define D_INFO_RECEIVED "Received" +#define D_INFO_PUBLISHED "Published" +#define D_INFO_FAILED "Failed" +#define D_INFO_ETHERNET "Ethernet" +#define D_INFO_WIFI "Wifi" +#define D_INFO_WIREGUARD "WireGuard" +#define D_INFO_LINK_SPEED "Link Speed" +#define D_INFO_FULL_DUPLEX "Full Duplex" +#define D_INFO_BSSID "BSSID" +#define D_INFO_SSID "SSID" +#define D_INFO_RSSI "Signal Strength" +#define D_INFO_IP_ADDRESS "IP Address" +#define D_INFO_MAC_ADDRESS "MAC Address" +#define D_INFO_GATEWAY "Gateway" +#define D_INFO_DNS_SERVER "DNS Server" +#define D_INFO_ENDPOINT_IP "Endpoint IP" +#define D_INFO_ENDPOINT_PORT "Endpoint Port" + +#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:" +#define D_OOBE_SCAN_TO_CONNECT "Scan to connect" + +#define D_WIFI_CONNECTING_TO "Connecting to %s" +#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..." +#define D_WIFI_RSSI_EXCELLENT "Excellent" +#define D_WIFI_RSSI_GOOD "Good" +#define D_WIFI_RSSI_FAIR "Fair" +#define D_WIFI_RSSI_WEAK "Weak" +#define D_WIFI_RSSI_BAD "Very bad" + +#define D_WG_INITIALIZED "Initialized" +#define D_WG_BAD_CONFIG "Missing or bad configuration" + +#define D_GPIO_SWITCH "Switch" +#define D_GPIO_BUTTON "Push Button" +#define D_GPIO_TOUCH "Capacitive Touch" +#define D_GPIO_LED "Led" +#define D_GPIO_LED_R "Mood Red" +#define D_GPIO_LED_G "Mood Green" +#define D_GPIO_LED_B "Mood Blue" +#define D_GPIO_POWER_RELAY "Power Relay" +#define D_GPIO_LIGHT_RELAY "Light Relay" +#define D_GPIO_PWM "PWM" +#define D_GPIO_DAC "DAC" +#define D_GPIO_SERIAL_DIMMER "Serial Dimmer" +#define D_GPIO_UNKNOWN "Unknown" +#define D_GPIO_PIN "Pin" +#define D_GPIO_GROUP "Group" +#define D_GPIO_GROUP_NONE "None" +#define D_GPIO_STATE_NORMAL "Normal" +#define D_GPIO_STATE_INVERTED "Inverted" + +#endif \ No newline at end of file From c25aa50cb290a60316bfd8e218966d88427111c0 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:46:36 +0100 Subject: [PATCH 128/142] New translations en.json (Russian) --- data/ru_RU.json | 202 ++++++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/data/ru_RU.json b/data/ru_RU.json index 0451a298..cff6ee5c 100644 --- a/data/ru_RU.json +++ b/data/ru_RU.json @@ -1,72 +1,72 @@ { "en": { - "language": "English", + "language": "Русский", "home": { - "title": "Main Menu", - "btn": "Main Menu", - "nav": "Home" + "title": "Главное меню", + "btn": "Главное меню", + "nav": "Домой" }, - "save": "Save Settings", - "user": "Username", - "pass": "Password", + "save": "Сохранить настройки", + "user": "Имя пользователя", + "pass": "Пароль", "hasp": { - "title": "HASP Design", - "btn": "HASP Design", - "theme": "UI Theme", - "color1": "Primary color", - "color2": "Secondary color", - "pages": "Start Layout", - "font": "Default Font", - "startpage": "Startup Page", - "startdim": "Startup Dim" + "title": "Оформление", + "btn": "Настройка оформления", + "theme": "Тема интерфейса", + "color1": "Основной цвет", + "color2": "Вторичный цвет", + "pages": "Начальный макет", + "font": "Шрифт по умолчанию", + "startpage": "Стартовая страница", + "startdim": "Ярокость при запуске" }, "screenshot": { - "title": "Screenshot", - "btn": "Screenshot", - "nav": "Screenshot", - "prev": "Prev Page", - "next": "Next Page", - "refresh": "Refresh" + "title": "Скриншот", + "btn": "Скриншот", + "nav": "Скиншот", + "prev": "Предыдущая страница", + "next": "Следующая страница", + "refresh": "Обновить" }, "info": { - "title": "Information", - "btn": "Information", - "nav": "Information" + "title": "Информация", + "btn": "Информация", + "nav": "Информация" }, "config": { - "title": "Configuration", - "btn": "Configuration", - "nav": "Settings" + "title": "Настройки", + "btn": "Настройки", + "nav": "Настройки" }, "ota": { - "title": "Firmware Update", - "btn": "Firmware Update", - "nav": "Firmware", - "submit": "Update Firmware", - "file": "Firmware File", - "url": "Firmware URL", - "redirect": "Follow Redirects", - "never": "Never", - "strict": "Strict", - "always": "Always" + "title": "Обновление прошивки", + "btn": "Обновление прошивки", + "nav": "Прошивка", + "submit": "Обновление прошивки", + "file": "Файл прошивки", + "url": "URL прошивки", + "redirect": "Разрешить редиректы", + "never": "Никогда", + "strict": "Строго", + "always": "Всегда" }, "editor": { - "title": "File Editor", - "btn": "File Editor", - "nav": "File Editor" + "title": "Редактор файлов", + "btn": "Редактор файлов", + "nav": "Редактор файлов" }, "reset": { - "title": "Factory Reset", - "btn": "Factory Reset", - "warning": "Warning", - "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.", - "fileloss": "ALL FILES WILL BE LOST!" + "title": "Сброс на заводские настройки", + "btn": "Сброс на заводские настройки", + "warning": "Предупреждение", + "message": "Этот процесс вернет все настройки к значениям по умолчанию. Внутренняя флэш-память будет очищена и устройство перезапустится. Возможно, вам придется подключиться к точке доступа Wi-Fi, отображаемой на панели, чтобы перенастроить устройство перед повторным доступом к нему.", + "fileloss": "ВСЕ ФАЙЛЫ БУДУТ ПОТЕРЯНЫ!" }, "reboot": { - "title": "Rebooting...", - "btn": "Restart", - "nav": "Reboot", - "message": "The device is rebooting." + "title": "Перезагрузка...", + "btn": "Перезагрузка", + "nav": "Перезагрузка", + "message": "Устройство перезагружается." }, "about": { "credits": "Based on the previous work of the following open source developers:", @@ -75,19 +75,19 @@ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "mit": "MIT License", - "bsd": "BSD License", - "freebsd": "FreeBSD License", - "apache2": "Apache2 License" + "mit": "Лицензия MIT", + "bsd": "Лицезия BSD", + "freebsd": "Лицензия FreeBSD", + "apache2": "Лицензия Apache2" }, "wifi": { - "title": "Wifi Settings", - "btn": "Wifi Settings", + "title": "Настройка WiFi", + "btn": "Настройка WiFi", "ssid": "SSID" }, "wg": { - "title": "WireGuard Settings", - "btn": "WireGuard Settings", + "title": "Настройки WireGuard", + "btn": "Настройки WireGuard", "vpnip": "VPN IP", "privkey": "Private Key", "host": "Remote IP", @@ -95,68 +95,68 @@ "pubkey": "Remote Public Key" }, "mqtt": { - "title": "MQTT Settings", - "btn": "MQTT Settings", - "name": "Hostname", - "group": "Groupname", - "host": "Broker", - "port": "Port", + "title": "Настройки MQTT", + "btn": "Настройки MQTT", + "name": "Имя хоста", + "group": "Имя группы", + "host": "Брокер", + "port": "Порт", "node_t": "Node Topic", "group_t": "Group Topic", "broadcast_t": "Broadcast Topic", "hass_t": "HA LWT Topic" }, "http": { - "title": "HTTP Settings", - "btn": "HTTP Settings" + "title": "Настройки HTTP", + "btn": "Настройки HTTP" }, "ftp": { - "title": "FTP Settings", - "btn": "FTP Settings", - "port": "FTP Port", - "pasv": "Passive Port" + "title": "Настройки FTP", + "btn": "Настройкаи FTP", + "port": "FTP порт", + "pasv": "Пароль" }, "gui": { - "title": "Display Settings", - "btn": "Display Settings", - "antiburn": "Antiburn", - "calibrate": "Calibrate" + "title": "Настройки экрана", + "btn": "Настройки экрана", + "antiburn": "Прдеотвращение выгорания", + "calibrate": "Калибровка" }, - "gpio": "GPIO Settings", + "gpio": "Настройки GPIO", "debug": { - "title": "Debug Settings", - "btn": "Debug Settings", + "title": "Настройки отладки", + "btn": "Настройки отладки", "baud": "Baudrate", - "tele": "Tele Period", - "ansi": "Use ANSI codes", - "host": "Syslog Server", - "port": "Syslog Port", + "tele": "Tele период", + "ansi": "Использовать кодировку ANSI", + "host": "Сервер Syslog", + "port": "Порт Syslog", "ietf": "IETF (RFC 5424)", "bsd": "BSD (RFC 3164)", - "log": "Facility" + "log": "Объект" }, "time": { - "title": "Time Settings", - "btn": "Time Settings", - "region": "Region", - "zone": "Timezone", - "tz": "Timezone", - "ntp": "NTP Servers" + "title": "Настройки времени", + "btn": "Настройки времени", + "region": "Регион", + "zone": "Часовой пояс", + "tz": "Часовой пояс", + "ntp": "Сервер NTP" }, "region": { - "etc": "Etcetera ", - "continents": "Continents ", - "af": "Africa ", - "as": "Asia ", - "au": "Australia ", - "aq": "Antarctica ", - "eu": "Europe ", - "na": "North America ", - "sa": "South America ", - "islands": "Islands ", - "at": "Atlantic Ocean ", - "in": "Indian Ocean ", - "pa": "Pacific Ocean " + "etc": "Прочие ", + "continents": "Континент ", + "af": "Африка ", + "as": "Азия ", + "au": "Австралия ", + "aq": "Антарктика ", + "eu": "Европа ", + "na": "Северная Америка ", + "sa": "Южна Америка ", + "islands": "Острова ", + "at": "Атлантический океан ", + "in": "Индийский океан ", + "pa": "Тихий океан " } } } \ No newline at end of file From 4584e907f972ca704dead7007d12c1699b926fb7 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:46:37 +0100 Subject: [PATCH 129/142] New translations en_us.h (Russian) --- src/lang/ru_RU.h | 114 +++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/lang/ru_RU.h b/src/lang/ru_RU.h index 35a5bf66..98cdc9a2 100644 --- a/src/lang/ru_RU.h +++ b/src/lang/ru_RU.h @@ -107,55 +107,55 @@ #define D_DISPATCH_COMMAND_NOT_FOUND "Команда '%s' не найдена" #define D_DISPATCH_INVALID_PAGE "Неверная страница %s" -#define D_DISPATCH_REBOOT "Rebooting the MCU now!" +#define D_DISPATCH_REBOOT "Перезагружаем устройство!" -#define D_JSON_FAILED "JSON parsing failed:" -#define D_JSONL_FAILED "JSONL parsing failed at line %u" -#define D_JSONL_SUCCEEDED "Jsonl fully parsed" +#define D_JSON_FAILED "Парсинг JSON не удался:" +#define D_JSONL_FAILED "JSONL ошибка парсинга на строке %u" +#define D_JSONL_SUCCEEDED "Jsonl полностью прочтен" -#define D_OTA_CHECK_UPDATE "Trying update URL: %s" -#define D_OTA_CHECK_COMPLETE "Update check complete" -#define D_OTA_CHECK_FAILED "Update check failed: %s" -#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update" -#define D_OTA_UPDATE_COMPLETE "OTA Update complete" -#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot" -#define D_OTA_UPDATE_FAILED "OTA Update failed" -#define D_OTA_UPDATING_FIRMWARE "Updating firmware..." -#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..." +#define D_OTA_CHECK_UPDATE "Проверяем URL с обновлением: %s" +#define D_OTA_CHECK_COMPLETE "Проверка обновлений завершена" +#define D_OTA_CHECK_FAILED "Ошибка проверки обновлений: %s" +#define D_OTA_UPDATE_FIRMWARE "OTA обновление прошивки" +#define D_OTA_UPDATE_COMPLETE "OTA обновление завершено" +#define D_OTA_UPDATE_APPLY "Установка прошивки и перезагрузка" +#define D_OTA_UPDATE_FAILED "Ошибка OTA обновления" +#define D_OTA_UPDATING_FIRMWARE "Обновление прошивка..." +#define D_OTA_UPDATING_FILESYSTEM "Обновление файловой системы..." -#define D_HTTP_HASP_DESIGN "HASP Design" -#define D_HTTP_INFORMATION "Information" -#define D_HTTP_HTTP_SETTINGS "HTTP Settings" -#define D_HTTP_FTP_SETTINGS "FTP Settings" -#define D_HTTP_WIFI_SETTINGS "Wifi Settings" -#define D_HTTP_WIREGUARD_SETTINGS "WireGuard Settings" -#define D_HTTP_MQTT_SETTINGS "MQTT Settings" -#define D_HTTP_GPIO_SETTINGS "GPIO Settings" -#define D_HTTP_MDNS_SETTINGS "mDNS Settings" -#define D_HTTP_TELNET_SETTINGS "Telnet Settings" -#define D_HTTP_DEBUG_SETTINGS "Debug Settings" -#define D_HTTP_GUI_SETTINGS "Display Settings" -#define D_HTTP_SAVE_SETTINGS "Save Settings" -#define D_HTTP_UPLOAD_FILE "Upload File" -#define D_HTTP_ERASE_DEVICE "Reset All Settings" -#define D_HTTP_ADD_GPIO "Add New Pin" -#define D_HTTP_BACK "Back" -#define D_HTTP_REFRESH "Refresh" -#define D_HTTP_PREV_PAGE "Prev Page" -#define D_HTTP_NEXT_PAGE "Next Page" -#define D_HTTP_CALIBRATE "Calibrate" -#define D_HTTP_ANTIBURN "Run Anti Burn-in" -#define D_HTTP_SCREENSHOT "Screenshot" -#define D_HTTP_FILE_BROWSER "File Editor" -#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade" -#define D_HTTP_UPDATE_FIRMWARE "Update Firmware" -#define D_HTTP_FACTORY_RESET "Factory Reset" -#define D_HTTP_MAIN_MENU "Main Menu" -#define D_HTTP_REBOOT "Restart" -#define D_HTTP_CONFIGURATION "Configuration" -#define D_HTTP_CONFIG_CHANGED \ - "The configuration has changed, please click Restart to save changes to flash." -#define D_HTTP_SENDING_PAGE "Sent %S page to %s" +#define D_HTTP_HASP_DESIGN "HASP оформление" +#define D_HTTP_INFORMATION "Информация" +#define D_HTTP_HTTP_SETTINGS "Настройки HTTP" +#define D_HTTP_FTP_SETTINGS "Настройки FTP" +#define D_HTTP_WIFI_SETTINGS "Настройки Wifi" +#define D_HTTP_WIREGUARD_SETTINGS "Настройки WireGuard" +#define D_HTTP_MQTT_SETTINGS "Настройки MQTT" +#define D_HTTP_GPIO_SETTINGS "Настройки GPIO" +#define D_HTTP_MDNS_SETTINGS "Настройки mDNS" +#define D_HTTP_TELNET_SETTINGS "Настройки Telnet" +#define D_HTTP_DEBUG_SETTINGS "Настройки отладки" +#define D_HTTP_GUI_SETTINGS "Настройки дисплея" +#define D_HTTP_SAVE_SETTINGS "Сохранить настройки" +#define D_HTTP_UPLOAD_FILE "Загрузить файл" +#define D_HTTP_ERASE_DEVICE "Сброс всех настроек" +#define D_HTTP_ADD_GPIO "Добавить новый пин" +#define D_HTTP_BACK "Назад" +#define D_HTTP_REFRESH "Обновить" +#define D_HTTP_PREV_PAGE "Предыдущая страница" +#define D_HTTP_NEXT_PAGE "Следующая страница" +#define D_HTTP_CALIBRATE "Калибровка" +#define D_HTTP_ANTIBURN "Запуск Anti Burn-in" +#define D_HTTP_SCREENSHOT "Скриншот" +#define D_HTTP_FILE_BROWSER "Файловый редактор" +#define D_HTTP_FIRMWARE_UPGRADE "Обновление прошивки" +#define D_HTTP_UPDATE_FIRMWARE "Обновление прошивки" +#define D_HTTP_FACTORY_RESET "Сброс на заводские настройки" +#define D_HTTP_MAIN_MENU "Главное меню" +#define D_HTTP_REBOOT "Перезапуск" +#define D_HTTP_CONFIGURATION "Конфигурацияя" +#define D_HTTP_CONFIG_CHANGED \ + "Конфигурация изменена, пожалуйста кликните на Перезагрузка для сохранения изменений в память устройства." +#define D_HTTP_SENDING_PAGE "Отправлена %S страница на %s" #define D_HTTP_FOOTER "by Francis Van Roie" #define D_INFO_VERSION "Version" @@ -206,19 +206,19 @@ #define D_INFO_ENDPOINT_IP "Endpoint IP" #define D_INFO_ENDPOINT_PORT "Endpoint Port" -#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:" -#define D_OOBE_SCAN_TO_CONNECT "Scan to connect" +#define D_OOBE_MSG "Тапните по акрану для настройки WiFi или подключитесь к этой Точке Доступа:" +#define D_OOBE_SCAN_TO_CONNECT "Сканируте для подключения" -#define D_WIFI_CONNECTING_TO "Connecting to %s" -#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..." -#define D_WIFI_RSSI_EXCELLENT "Excellent" -#define D_WIFI_RSSI_GOOD "Good" -#define D_WIFI_RSSI_FAIR "Fair" -#define D_WIFI_RSSI_WEAK "Weak" -#define D_WIFI_RSSI_BAD "Very bad" +#define D_WIFI_CONNECTING_TO "Подключение к %s" +#define D_WIFI_CONNECTED_TO "Подключено к %s, запрашиваем IP..." +#define D_WIFI_RSSI_EXCELLENT "Отлично" +#define D_WIFI_RSSI_GOOD "Хорошо" +#define D_WIFI_RSSI_FAIR "Нормально" +#define D_WIFI_RSSI_WEAK "Слабо" +#define D_WIFI_RSSI_BAD "Очень плохо" -#define D_WG_INITIALIZED "Initialized" -#define D_WG_BAD_CONFIG "Missing or bad configuration" +#define D_WG_INITIALIZED "Инициализирован" +#define D_WG_BAD_CONFIG "Отсутствует или неверная конфигурация" #define D_GPIO_SWITCH "Switch" #define D_GPIO_BUTTON "Push Button" From e3ae1e6abfec13f98749c9f9ec1adfaa9bde64af Mon Sep 17 00:00:00 2001 From: Peter Lord Date: Sun, 23 Feb 2025 22:19:09 +0000 Subject: [PATCH 130/142] Tweak settings for ESP32-8048S050 so that display works. See https://github.com/HASwitchPlate/openHASP/issues/868 and https://github.com/HASwitchPlate/openHASP/discussions/861 --- user_setups/esp32s3/sunton-esp32-s3-tft.ini | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/user_setups/esp32s3/sunton-esp32-s3-tft.ini b/user_setups/esp32s3/sunton-esp32-s3-tft.ini index fbdf401a..6ba77fb9 100644 --- a/user_setups/esp32s3/sunton-esp32-s3-tft.ini +++ b/user_setups/esp32s3/sunton-esp32-s3-tft.ini @@ -171,16 +171,18 @@ build_flags = -D TFT_WIDTH=800 -D TFT_HEIGHT=480 ; Panel Settings + ; see see https://github.com/wegi1/ESP32-8048S050-5INCH-LCD/blob/main/4-Driver_IC_Data_Sheet/JC8048B050N_I.pdf -D TFT_HSYNC_POLARITY=0 - -D TFT_HSYNC_FRONT_PORCH=48 ; Maximum HSYNC Front Porch + -D TFT_HSYNC_FRONT_PORCH=8 ; Maximum HSYNC Front Porch -D TFT_HSYNC_PULSE_WIDTH=4 ; Typical HSYNC Pulse Width -D TFT_HSYNC_BACK_PORCH=8 ; Typical HSYNC Back Porch -D TFT_VSYNC_POLARITY=0 - -D TFT_VSYNC_FRONT_PORCH=12 ; Maximum VSYNC Front Porch + -D TFT_VSYNC_FRONT_PORCH=8 ; Maximum VSYNC Front Porch -D TFT_VSYNC_PULSE_WIDTH=4 ; Typical VSYNC Pulse Width -D TFT_VSYNC_BACK_PORCH=8 ; Typical VSYNC Back Porch -D TFT_PCLK_ACTIVE_NEG=1 - -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency + ; 13900000 fails on some boards, high values cause wifi issues + -D TFT_PREFER_SPEED=14500000 ; 1/2 of Typical DCLK Frequency -D TFT_AUTO_FLUSH=1 ; Touch Settings -D TOUCH_WIDTH=800 From 38bd749f98f44fee56a3986595bb19d30752566c Mon Sep 17 00:00:00 2001 From: Szetya Date: Mon, 10 Mar 2025 18:25:20 +0100 Subject: [PATCH 131/142] Update platformio_override-template.ini T-Display S3 touch added --- platformio_override-template.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio_override-template.ini b/platformio_override-template.ini index 97f2fbf0..6739d0c2 100644 --- a/platformio_override-template.ini +++ b/platformio_override-template.ini @@ -82,6 +82,8 @@ extra_default_envs = ; yeacreate-nscreen32 ; wz2432r028 ; ws_esp32_s3_touch_lcd_4p3 + ; ttgo-t-display-s3_st7789_16MB + ; ttgo-t-display-s3_st7789_touch_16MB ;endregion ;region -- Define your local COM ports for each environment --- From cc50dbf59fbda1288cf66ae51472a9471be956c9 Mon Sep 17 00:00:00 2001 From: Szetya Date: Mon, 10 Mar 2025 18:25:52 +0100 Subject: [PATCH 132/142] Add files via upload --- .../esp32s3/ttgo-t-display-s3_touch.ini | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 user_setups/esp32s3/ttgo-t-display-s3_touch.ini diff --git a/user_setups/esp32s3/ttgo-t-display-s3_touch.ini b/user_setups/esp32s3/ttgo-t-display-s3_touch.ini new file mode 100644 index 00000000..73684e07 --- /dev/null +++ b/user_setups/esp32s3/ttgo-t-display-s3_touch.ini @@ -0,0 +1,77 @@ +;***************************************************; +; TTGO T-Display-S3 with ST7789 ; +; - TTGO T7 S3 v1.1 Mini esp32 s3 board ; +; - ST7789 TFT ; +; - CST816S touch controller ; +;***************************************************; + +[ttgo-t-display-s3_st7789] +extends = arduino_esp32s3_v2 +board = lilygo-t-display-s3 +board_build.arduino.memory_type = qio_opi + +build_flags = + ${env.build_flags} + ${esp32s3.build_flags} + ${esp32s3.ps_ram} + -D HASP_MODEL="TTGO T-Display S3" + ;-Wno-macro-redefined + -D ARDUINO_USB_MODE=0 ; If USB MODE 1, the device will only boot when a serial port is opened. + -D ARDUINO_USB_CDC_ON_BOOT + -D USE_USB_CDC_CONSOLE + +;region -- TFT_eSPI build options ------------------------ + -D USER_SETUP_LOADED=1 + -D ST7789_DRIVER=1 + -D CGRAM_OFFSET=1 ; Library will add offsets required + ; -D TFT_SDA_READ ; Read from display, it only provides an SDA pin + -D TFT_WIDTH=170 + -D TFT_HEIGHT=320 + ; -D TFT_ROTATION=2 ; see TFT_ROTATION values + ; -D TFT_INVERSION_OFF ; for normal colors + -D TFT_INVERSION_ON + -D TFT_RGB_ORDER=0 ; Colour order Blue-Green-Red + -D INVERT_COLORS=1 ; for inverted colors + -D DISABLE_ALL_LIBRARY_WARNINGS ; Disable TFTeSPI log warning + + ; -D INIT_SEQUENCE_3 ; Using this initialisation sequence improves the display image + -D TFT_PARALLEL_8_BIT + -D TFT_DC=7 + -D TFT_RST=5 + -D TFT_WR=8 + -D TFT_RD=9 + -D TFT_D0=39 + -D TFT_D1=40 + -D TFT_D2=41 + -D TFT_D3=42 + -D TFT_D4=45 + -D TFT_D5=46 + -D TFT_D6=47 + -D TFT_D7=48 + -D TFT_BCKL=38 + ; Touch Settings + -D TOUCH_DRIVER=0x816 + -D TOUCH_SDA=18 + -D TOUCH_SCL=17 + -D TOUCH_RST=21 + -D TOUCH_IRQ=16 + -D I2C_TOUCH_FREQUENCY=400000 + -D I2C_TOUCH_ADDRESS=0x15 + ; End Touch Settings +;endregion + +;region -- Library options ------------------------------- +lib_deps = + ${env.lib_deps} + ${esp32s3.lib_deps} + ${arduino_esp32s3_v2.lib_deps} + ${tft_espi.lib_deps} + +lib_ignore = + ${env.lib_ignore} + ${esp32s3.lib_ignore} + ${arduino_esp32s3_v2.lib_ignore} +;endregion + +[env:ttgo-t-display-s3_st7789_touch_16MB] +extends = ttgo-t-display-s3_st7789, flash_16mb \ No newline at end of file From 5cc1fda908b63ac71225f4b05af58b8aca013483 Mon Sep 17 00:00:00 2001 From: Szetya Date: Mon, 10 Mar 2025 18:29:51 +0100 Subject: [PATCH 133/142] Add files via upload CST816 touch driver add --- src/drv/touch/touch_driver.h | 223 +++++++++++++------------- src/drv/touch/touch_driver_cst816.cpp | 70 ++++++++ src/drv/touch/touch_driver_cst816.h | 27 ++++ 3 files changed, 210 insertions(+), 110 deletions(-) create mode 100644 src/drv/touch/touch_driver_cst816.cpp create mode 100644 src/drv/touch/touch_driver_cst816.h diff --git a/src/drv/touch/touch_driver.h b/src/drv/touch/touch_driver.h index f3e2ccfd..a7b07d6f 100644 --- a/src/drv/touch/touch_driver.h +++ b/src/drv/touch/touch_driver.h @@ -1,110 +1,113 @@ -/* MIT License - Copyright (c) 2019-2024 Francis Van Roie - For full license information read the LICENSE file in the project folder */ - -#ifndef HASP_BASE_TOUCH_DRIVER_H -#define HASP_BASE_TOUCH_DRIVER_H - -#ifdef ARDUINO -#include -#endif - -#include "hasplib.h" -#include "lvgl.h" - -namespace dev { - -class BaseTouch { - public: - void init(int w, int h) - {} - // void loop() - // {} - void show_info() - {} - void set_rotation(uint8_t rotation) - {} - void set_invert(bool invert_display) - {} - IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) - { - data->state = LV_INDEV_STATE_REL; - return false; - } - void calibrate(uint16_t* calData) - {} - void set_calibration(uint16_t* calData) - {} - bool is_driver_pin(uint8_t) - { - return false; - } - const char* get_touch_model() - { - return ""; - } -}; - -} // namespace dev - -#ifndef TOUCH_DRIVER -#define TOUCH_DRIVER -1 // No Touch -#endif - -#if TOUCH_DRIVER == 0x2046 && defined(USER_SETUP_LOADED) -#warning Building for TFT_eSPI XPT2046 -//#include "touch_driver_xpt2046.h" -#include "touch_driver_tftespi.h" -#elif TOUCH_DRIVER == 0x2046 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) -#warning Building for LovyanGFX XPT2046 -#include "touch_driver_lovyangfx.h" -#elif TOUCH_DRIVER == 0x0911 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) -#warning Building for LovyanGFX GT911 -#include "touch_driver_lovyangfx.h" -#elif TOUCH_DRIVER == 0x6336 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) -#warning Building for LovyanGFX FT6336 -#include "touch_driver_lovyangfx.h" -#elif defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) -#warning Building for LovyanGFX -#include "touch_driver_lovyangfx.h" -#elif TOUCH_DRIVER == 0x5206 -#warning Building for FT5206 -#include "touch_driver_ft5206.h" -#elif TOUCH_DRIVER == 0x6336 -#warning Building for FT6336 -#include "touch_driver_ft6336u.h" -#elif TOUCH_DRIVER == 0x0610 -#warning Building for STMPE610 -#include "touch_driver_stmpe610.h" -#elif TOUCH_DRIVER == 0x0911 -#warning Building for GT911 -#include "touch_driver_gt911.h" -#elif TOUCH_DRIVER == 0x0ADC -#warning Building for analog touch -#include "touch_driver_analog.h" -#elif TOUCH_DRIVER == 0x1680 -#warning Building for GSL1680 -#include "touch_driver_gslx680.h" -#elif TOUCH_DRIVER == 0x2007 -#warning Building for TSC2007 -#include "touch_driver_tsc2007.h" -#elif defined(LGFX_USE_V1) -#warning Building for LovyanGfx Touch -#include "touch_driver_lovyangfx.h" -#elif TOUCH_DRIVER == 0x3240 -#warning Building for CST3240 -#include "touch_driver_cst3240.h" -#else -#warning Building for Generic Touch -using dev::BaseTouch; -extern dev::BaseTouch haspTouch; -// IRAM_ATTR bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) -// { -// data->state = LV_INDEV_STATE_REL; -// return false; -// } -#endif - -#endif - -// #elif TOUCH_DRIVER == 0x2046B -// touched = XPT2046_getXY(&normal_x, &normal_y, true); +/* MIT License - Copyright (c) 2019-2024 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#ifndef HASP_BASE_TOUCH_DRIVER_H +#define HASP_BASE_TOUCH_DRIVER_H + +#ifdef ARDUINO +#include +#endif + +#include "hasplib.h" +#include "lvgl.h" + +namespace dev { + +class BaseTouch { + public: + void init(int w, int h) + {} + // void loop() + // {} + void show_info() + {} + void set_rotation(uint8_t rotation) + {} + void set_invert(bool invert_display) + {} + IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) + { + data->state = LV_INDEV_STATE_REL; + return false; + } + void calibrate(uint16_t* calData) + {} + void set_calibration(uint16_t* calData) + {} + bool is_driver_pin(uint8_t) + { + return false; + } + const char* get_touch_model() + { + return ""; + } +}; + +} // namespace dev + +#ifndef TOUCH_DRIVER +#define TOUCH_DRIVER -1 // No Touch +#endif + +#if TOUCH_DRIVER == 0x2046 && defined(USER_SETUP_LOADED) +#warning Building for TFT_eSPI XPT2046 +//#include "touch_driver_xpt2046.h" +#include "touch_driver_tftespi.h" +#elif TOUCH_DRIVER == 0x2046 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) +#warning Building for LovyanGFX XPT2046 +#include "touch_driver_lovyangfx.h" +#elif TOUCH_DRIVER == 0x0911 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) +#warning Building for LovyanGFX GT911 +#include "touch_driver_lovyangfx.h" +#elif TOUCH_DRIVER == 0x6336 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) +#warning Building for LovyanGFX FT6336 +#include "touch_driver_lovyangfx.h" +#elif defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) +#warning Building for LovyanGFX +#include "touch_driver_lovyangfx.h" +#elif TOUCH_DRIVER == 0x5206 +#warning Building for FT5206 +#include "touch_driver_ft5206.h" +#elif TOUCH_DRIVER == 0x6336 +#warning Building for FT6336 +#include "touch_driver_ft6336u.h" +#elif TOUCH_DRIVER == 0x0610 +#warning Building for STMPE610 +#include "touch_driver_stmpe610.h" +#elif TOUCH_DRIVER == 0x0911 +#warning Building for GT911 +#include "touch_driver_gt911.h" +#elif TOUCH_DRIVER == 0x0ADC +#warning Building for analog touch +#include "touch_driver_analog.h" +#elif TOUCH_DRIVER == 0x1680 +#warning Building for GSL1680 +#include "touch_driver_gslx680.h" +#elif TOUCH_DRIVER == 0x2007 +#warning Building for TSC2007 +#include "touch_driver_tsc2007.h" +#elif defined(LGFX_USE_V1) +#warning Building for LovyanGfx Touch +#include "touch_driver_lovyangfx.h" +#elif TOUCH_DRIVER == 0x3240 +#warning Building for CST3240 +#include "touch_driver_cst3240.h" +#elif TOUCH_DRIVER == 0x816 +#warning Building for CST816S +#include "touch_driver_cst816.h" +#else +#warning Building for Generic Touch +using dev::BaseTouch; +extern dev::BaseTouch haspTouch; +// IRAM_ATTR bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) +// { +// data->state = LV_INDEV_STATE_REL; +// return false; +// } +#endif + +#endif + +// #elif TOUCH_DRIVER == 0x2046B +// touched = XPT2046_getXY(&normal_x, &normal_y, true); diff --git a/src/drv/touch/touch_driver_cst816.cpp b/src/drv/touch/touch_driver_cst816.cpp new file mode 100644 index 00000000..1cba9435 --- /dev/null +++ b/src/drv/touch/touch_driver_cst816.cpp @@ -0,0 +1,70 @@ +/* MIT License - Copyright (c) 2019-2024 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#if defined(ARDUINO) && (TOUCH_DRIVER == 0x816) +#include +#include "ArduinoLog.h" +#include "hasp_conf.h" +#include "touch_driver_cst816.h" + +#include +#include "cst816t.h" + +#include "touch_driver.h" // base class +#include "touch_helper.h" // i2c scanner + +#include "../../hasp/hasp.h" // for hasp_sleep_state +extern uint8_t hasp_sleep_state; + +cst816t touchpad(Wire, TOUCH_RST, TOUCH_IRQ); + +namespace dev { + +IRAM_ATTR bool TouchCst816::read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) +{ + if(touchpad.available()) { + + if(hasp_sleep_state != HASP_SLEEP_OFF) hasp_update_sleep_state(); // update Idle + //LOG_INFO(TAG_DRVR, "CST816 touched x:%d, y:%d", touchpad.x, touchpad.y); + +#ifdef TOUCH_WIDTH + data->point.x = map(x, 0, TOUCH_WIDTH - 1, 0, TFT_WIDTH - 1); +#else + data->point.x = touchpad.x; +#endif + +#ifdef TOUCH_HEIGHT + data->point.y = map(y, 0, TOUCH_HEIGHT - 1, 0, TFT_HEIGHT - 1); +#else + data->point.y = touchpad.y; +#endif + + data->state = LV_INDEV_STATE_PR; + hasp_set_sleep_offset(0); // Reset the offset + + } else { + data->state = LV_INDEV_STATE_REL; + } + + /*Return `false` because we are not buffering and no more data to read*/ + return false; +} + +void TouchCst816::init(int w, int h) +{ + Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY); + if(touchpad.begin(mode_touch) == true) { + LOG_INFO(TAG_DRVR, "CST816 %s (170X320)", D_SERVICE_STARTED); + } else { + LOG_WARNING(TAG_DRVR, "CST816 %s", D_SERVICE_START_FAILED); + } + + Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY); + touch_scan(Wire); // The address could change during begin, so scan afterwards +} + +} // namespace dev + +dev::TouchCst816 haspTouch; + +#endif // ARDUINO diff --git a/src/drv/touch/touch_driver_cst816.h b/src/drv/touch/touch_driver_cst816.h new file mode 100644 index 00000000..8b632e06 --- /dev/null +++ b/src/drv/touch/touch_driver_cst816.h @@ -0,0 +1,27 @@ +/* MIT License - Copyright (c) 2019-2024 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#ifndef HASP_CST816_TOUCH_DRIVER_H +#define HASP_CST816_TOUCH_DRIVER_H + +#ifdef ARDUINO +#include "lvgl.h" +#include "touch_driver.h" + +namespace dev { + +class TouchCst816 : public BaseTouch { + public: + IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data); + void init(int w, int h); +}; + +} // namespace dev + +using dev::TouchCst816; +extern dev::TouchCst816 haspTouch; + +#endif // ARDUINO + +#endif // HASP_CST816_TOUCH_DRIVER_H + \ No newline at end of file From 2f7505debb5ed3556a4ef99e58e01953face98aa Mon Sep 17 00:00:00 2001 From: Szetya Date: Mon, 10 Mar 2025 18:31:02 +0100 Subject: [PATCH 134/142] Add files via upload CST816 library add --- lib/cst816t/LICENSE | 24 + lib/cst816t/README.md | 145 + .../examples/lvgl_button/lvgl_button.ino | 128 + .../examples/smartwatch/smartwatch.ino | 87 + lib/cst816t/examples/touchme/touchme.ino | 23 + lib/cst816t/extras/3d_model_p169h002.stp | 11027 ++++++++++++++++ .../extras/AN-CST816T寄存器说明-v1.pdf | Bin 0 -> 1396672 bytes .../extras/CAD_DRAWING_P169H002-CTP.dwg | Bin 0 -> 315840 bytes lib/cst816t/extras/DATASHEET_ST7789V.pdf | Bin 0 -> 3198902 bytes lib/cst816t/extras/DS-CST816T数据手册V2.2.pdf | Bin 0 -> 1445471 bytes lib/cst816t/extras/P169H002-CTP-small.jpg | Bin 0 -> 568661 bytes lib/cst816t/extras/P169H002-CTP.jpg | Bin 0 -> 3028924 bytes lib/cst816t/extras/P169H002-CTP.pdf | Bin 0 -> 243956 bytes lib/cst816t/extras/SCHEMATIC-P169H002-CTP.pdf | Bin 0 -> 12000 bytes .../extras/Schematic_drawing_2023-06-21.pdf | 2575 ++++ lib/cst816t/extras/cst78XX驱动调试V1.0.pdf | Bin 0 -> 1135250 bytes lib/cst816t/library.properties | 11 + lib/cst816t/src/cst816t.cpp | 203 + lib/cst816t/src/cst816t.h | 56 + 19 files changed, 14279 insertions(+) create mode 100644 lib/cst816t/LICENSE create mode 100644 lib/cst816t/README.md create mode 100644 lib/cst816t/examples/lvgl_button/lvgl_button.ino create mode 100644 lib/cst816t/examples/smartwatch/smartwatch.ino create mode 100644 lib/cst816t/examples/touchme/touchme.ino create mode 100644 lib/cst816t/extras/3d_model_p169h002.stp create mode 100644 lib/cst816t/extras/AN-CST816T寄存器说明-v1.pdf create mode 100644 lib/cst816t/extras/CAD_DRAWING_P169H002-CTP.dwg create mode 100644 lib/cst816t/extras/DATASHEET_ST7789V.pdf create mode 100644 lib/cst816t/extras/DS-CST816T数据手册V2.2.pdf create mode 100644 lib/cst816t/extras/P169H002-CTP-small.jpg create mode 100644 lib/cst816t/extras/P169H002-CTP.jpg create mode 100644 lib/cst816t/extras/P169H002-CTP.pdf create mode 100644 lib/cst816t/extras/SCHEMATIC-P169H002-CTP.pdf create mode 100644 lib/cst816t/extras/Schematic_drawing_2023-06-21.pdf create mode 100644 lib/cst816t/extras/cst78XX驱动调试V1.0.pdf create mode 100644 lib/cst816t/library.properties create mode 100644 lib/cst816t/src/cst816t.cpp create mode 100644 lib/cst816t/src/cst816t.h diff --git a/lib/cst816t/LICENSE b/lib/cst816t/LICENSE new file mode 100644 index 00000000..fdddb29a --- /dev/null +++ b/lib/cst816t/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/lib/cst816t/README.md b/lib/cst816t/README.md new file mode 100644 index 00000000..a5d039b5 --- /dev/null +++ b/lib/cst816t/README.md @@ -0,0 +1,145 @@ +# cst816t capacitive touch ic + +[![cst816t touch screen](extras/P169H002-CTP-small.jpg)](https://github.com/koendv/cst816t/raw/master/extras/P169H002-CTP.jpg) + + +This is an Arduino library for the cst816t capacitive touch ic. The cst816t capacitive touch ic is able to decode clicks, double clicks, swipes and long press in hardware. Tested on stm32duino. + +The cst816t runs on voltages from 1.8V to 3.3V. Do not connect the cst816t to 5V arduinos such as Arduino UNO. Connecting the cst816t to 5V will probably damage the device. + +Hardware requirements: + +- power supply 2.8V to 3.6V +- power supply ripple <= 50mv; +- logic level 1.8V to 3.3V +- i2c rate 10Khz to 400Khz + +## Use + +Code for the cst816t consists of a setup, done once, and a loop, done repeatedly. + +## Setup + +The cst816t touch sensor needs an I2C bus, a reset pin and a interrupt pin: +``` +#include +#include "cst816t.h" +TwoWire Wire2(TP_SDA, TP_SCL); +cst816t touchpad(Wire2, TP_RST, TP_IRQ); +``` +The ic can run in four modes: touch, change, fast, motion. + +### mode touch +``` +void setup() { + touchpad.begin(mode_touch); +} +``` +In mode _touch_, if a finger touches the display the ic sends an interrupt every 10ms. After receiving the interrupt, you can read updated touch coordinates and finger count. All processing is done on the mcu. + +### mode change +``` +void setup() { + touchpad.begin(mode_change); +} +``` +In mode _change_ the ic sends an interrupt when the finger changes position. Compared to mode touch, the number of interrupts is more moderate. + +### mode fast + +``` +void setup() { + touchpad.begin(mode_fast); +} +``` + +In mode _fast_ the ic sends an interrupt when the finger has completed one of the following movements: single click, swipe up, swipe down, swipe left, swipe right. + +Touch response is fast because there is no need to wait to distinguish between single click, double click and long press. + +### mode motion + +``` +void setup() { + touchpad.begin(mode_motion); +} +``` + +In mode _motion_ the ic sends an interrupt when the finger has completed the following movements: single click, **double click**, swipe up, swipe down, swipe left, swipe right, **long press**. All processing is done in the cst816 touch ic. The processing in the mcu is minimal. + +## Loop + +Test repeatedly if there is an update from the touch panel. If there is an update from the touch panel, read gesture, (x, y) coordinates, and number of fingers touching the display. + +``` +void loop() { + if (touchpad.available()) { + switch (touchpad.gesture_id) { + case GESTURE_NONE: + Serial.print("NONE"); + break; + case GESTURE_SWIPE_DOWN: + Serial.print("SWIPE DOWN"); + break; + case GESTURE_SWIPE_UP: + Serial.print("SWIPE UP"); + break; + case GESTURE_SWIPE_LEFT: + Serial.print("SWIPE LEFT"); + break; + case GESTURE_SWIPE_RIGHT: + Serial.print("SWIPE RIGHT"); + break; + case GESTURE_SINGLE_CLICK: + Serial.print("SINGLE CLICK"); + break; + case GESTURE_DOUBLE_CLICK: + Serial.print("DOUBLE CLICK"); + break; + case GESTURE_LONG_PRESS: + Serial.print("LONG PRESS"); + break; + default: + Serial.print("UNKNOWN "); + break; + } + Serial.print("at ("); + Serial.print(touchpad.x); + Serial.print(", "); + Serial.print(touchpad.y); + Serial.print(") fingers: "); + Serial.println(touchpad.finger_num); + } +} +``` + +## Examples + +The library comes with three example Arduino sketches: touchme, smartwatch, and lvgl. To compile the examples, use [stm32duino](https://github.com/stm32duino/Arduino_Core_STM32/wiki). + +### touchme + +A simple sketch that uses the CST816T touch sensor. When the display is touched, the (x, y) coordinates and the action - click or swipe - are printed on the serial port. + +### smartwatch + +A small Arduino sketch for the [P169H002-CTP](https://www.google.com/search?q=P169H002-CTP) smartwatch display. The P169H002-CTP is a 1.69 inch 240x280 lcd display with an ST7789 lcd driver and a CST816T touch sensor. The sketch prints a text - "click" or "swipe" - on the spot where the display is touched. + +### lvgl + +[LVGL](http://www.lvgl.io) (Light and Versatile Graphics Library) is a graphics library for embedded systems. An Arduino sketch is given which draws a button on a P169H002-CTP display. + +This lvgl example uses the Adafruit GFX library. For improved speed, you may wish to check if there is a library that is more optimized for the processor you use. + +## Links +Arduino libraries for ST7789 tft driver: + +- [Adafruit ST7789](https://github.com/adafruit/Adafruit-ST7735-Library/) +- [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI) +- [ST7789-STM32](https://github.com/Floyd-Fish/ST7789-STM32) +- [ST7789-STM32-uGUI](https://github.com/deividAlfa/ST7789-STM32-uGUI) + +[Schematic](extras/Schematic_drawing_2023-06-21.pdf +) for the P169H002-CTP display. VCC = 3.3V. The ambient light sensor is used to set display intensity. + +The P169H002-CTP display is available from [Aliexpress](https://www.aliexpress.com/item/1005005238299349.html). diff --git a/lib/cst816t/examples/lvgl_button/lvgl_button.ino b/lib/cst816t/examples/lvgl_button/lvgl_button.ino new file mode 100644 index 00000000..27cbb4c6 --- /dev/null +++ b/lib/cst816t/examples/lvgl_button/lvgl_button.ino @@ -0,0 +1,128 @@ +/* lvgl demo on P169H002-CTP display */ + +#include +#include // Core graphics library +#include // Hardware-specific library for ST7789 + +#include +#include "cst816t.h" // capacitive touch + +/* Note: in lv_conf.h: set lv_tick to Arduino millis() */ + +#include + +// display +#define TFT_X 240 +#define TFT_Y 280 + +#define TFT_CS PB1 +#define TFT_RST PA4 +#define TFT_DC PB0 +#define TFT_MOSI PB15 +#define TFT_SCLK PB13 +#define TFT_LED PA8 + +// touch +#define TP_SDA PB11 +#define TP_SCL PB10 +#define TP_RST PA15 +#define TP_IRQ PB3 + +TwoWire Wire2(TP_SDA, TP_SCL); +cst816t touchpad(Wire2, TP_RST, TP_IRQ); + +SPIClass SPI_1(PB15, PB14, PB13); +Adafruit_ST7789 tft = Adafruit_ST7789(&SPI_1, TFT_CS, TFT_DC, TFT_RST); + +static lv_disp_draw_buf_t disp_buf; +static lv_color_t buf_1[TFT_X * 10]; +static lv_color_t buf_2[TFT_X * 10]; +static lv_disp_drv_t disp_drv; +static lv_indev_drv_t indev_drv; + +/* lvgl display output */ +/* Using Adafruit display driver. Depending upon architecture, other drivers may be faster. */ +void disp_flush_cb(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) { + uint32_t w = 1 + area->x2 - area->x1; + uint32_t h = 1 + area->y2 - area->y1; + uint32_t len = w * h; + tft.startWrite(); + tft.setAddrWindow(area->x1, area->y1, w, h); + tft.writePixels(&color_p->full, len); + tft.endWrite(); + lv_disp_flush_ready(disp_drv); +} + +/* lvgl touchpad input */ +void touchpad_input_read(lv_indev_drv_t* drv, lv_indev_data_t* data) { + static uint32_t tp_x = 0; + static uint32_t tp_y = 0; + static uint32_t tp_fingers = 0; + if (touchpad.available()) { + tp_x = touchpad.x; + tp_y = touchpad.y; + tp_fingers = touchpad.finger_num; + } + data->point.x = tp_x; + data->point.y = tp_y; + if (tp_fingers != 0) data->state = LV_INDEV_STATE_PRESSED; + else data->state = LV_INDEV_STATE_RELEASED; +} + +/* lvgl button callback */ +void btn_event_cb(lv_event_t* e) { + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t* btn = lv_event_get_target(e); + if (code == LV_EVENT_CLICKED) { + static uint8_t cnt = 0; + cnt++; + /*Get the first child of the button which is the label and change its text*/ + lv_obj_t* label = lv_obj_get_child(btn, 0); + lv_label_set_text_fmt(label, "Button %d", cnt); + } +} + +void setup() { + Serial.begin(9600); + Serial.println("boot"); + + analogWriteResolution(8); + analogWrite(TFT_LED, 127); // display backlight at 50% + + tft.init(240, 280); // Init ST7789 280x240 + tft.fillScreen(ST77XX_BLACK); + tft.setTextColor(ST77XX_WHITE); + tft.setRotation(2); + + touchpad.begin(mode_change); + + /* display */ + lv_init(); + lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, TFT_X * 10); + lv_disp_drv_init(&disp_drv); + disp_drv.draw_buf = &disp_buf; + disp_drv.flush_cb = disp_flush_cb; + disp_drv.hor_res = TFT_X; + disp_drv.ver_res = TFT_Y; + lv_disp_t* disp; + disp = lv_disp_drv_register(&disp_drv); + + /* touchpad */ + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = touchpad_input_read; + lv_indev_t* my_indev = lv_indev_drv_register(&indev_drv); + + /* button */ + lv_obj_t* btn = lv_btn_create(lv_scr_act()); + lv_obj_center(btn); + lv_obj_set_size(btn, 120, 50); + lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL); + lv_obj_t* label = lv_label_create(btn); + lv_label_set_text(label, "Button"); + lv_obj_center(label); +} + +void loop() { + lv_timer_handler(); +} diff --git a/lib/cst816t/examples/smartwatch/smartwatch.ino b/lib/cst816t/examples/smartwatch/smartwatch.ino new file mode 100644 index 00000000..e866b58d --- /dev/null +++ b/lib/cst816t/examples/smartwatch/smartwatch.ino @@ -0,0 +1,87 @@ +/* + demo of P168H002-CTP display. + */ + +#include +#include // Core graphics library +#include // Hardware-specific library for ST7789 + +#include +#include "cst816t.h" // capacitive touch + +// display +#define TFT_X 240 +#define TFT_Y 280 + +#define TFT_CS PB1 +#define TFT_RST PA4 +#define TFT_DC PB0 +#define TFT_MOSI PB15 +#define TFT_SCLK PB13 +#define TFT_LED PA8 + +// touch +#define TP_SDA PB11 +#define TP_SCL PB10 +#define TP_RST PA15 +#define TP_IRQ PB3 + +TwoWire Wire2(TP_SDA, TP_SCL); +cst816t touchpad(Wire2, TP_RST, TP_IRQ); + +SPIClass SPI_1(PB15, PB14, PB13); +Adafruit_ST7789 tft = Adafruit_ST7789(&SPI_1, TFT_CS, TFT_DC, TFT_RST); + +void setup() { + Serial.begin(9600); + Serial.println("boot"); + + analogWriteResolution(8); + analogWrite(TFT_LED, 127); // display backlight at 50% + + tft.init(240, 280); // Init ST7789 280x240 + tft.fillScreen(ST77XX_BLACK); + tft.setTextColor(ST77XX_WHITE); + tft.setTextSize(0); + tft.setRotation(2); + + touchpad.begin(mode_motion); + tft.setCursor(TFT_X / 2, TFT_Y / 2); + tft.println(touchpad.version()); +} + +void loop() { + if (touchpad.available()) { + tft.setCursor(touchpad.x, touchpad.y); + tft.fillScreen(ST77XX_BLACK); + switch (touchpad.gesture_id) { + case GESTURE_NONE: + tft.print("NONE"); + break; + case GESTURE_SWIPE_DOWN: + tft.print("SWIPE DOWN"); + break; + case GESTURE_SWIPE_UP: + tft.print("SWIPE UP"); + break; + case GESTURE_SWIPE_LEFT: + tft.print("SWIPE LEFT"); + break; + case GESTURE_SWIPE_RIGHT: + tft.print("SWIPE RIGHT"); + break; + case GESTURE_SINGLE_CLICK: + tft.print("SINGLE CLICK"); + break; + case GESTURE_DOUBLE_CLICK: + tft.print("DOUBLE CLICK"); + break; + case GESTURE_LONG_PRESS: + tft.print("LONG PRESS"); + break; + default: + tft.print("?"); + break; + } + } +} diff --git a/lib/cst816t/examples/touchme/touchme.ino b/lib/cst816t/examples/touchme/touchme.ino new file mode 100644 index 00000000..7332ec8d --- /dev/null +++ b/lib/cst816t/examples/touchme/touchme.ino @@ -0,0 +1,23 @@ +/* demo for the CST816T capacitive touch ic */ + +#include +#include "cst816t.h" + +#define TP_SDA PB11 +#define TP_SCL PB10 +#define TP_RST PA15 +#define TP_IRQ PB3 + +TwoWire Wire2(TP_SDA, TP_SCL); +cst816t touchpad(Wire2, TP_RST, TP_IRQ); + +void setup() { + // decode everything: single click, double click, long press, swipe up, swipe down, swipe left, swipe right + touchpad.begin(mode_motion); + Serial.println(touchpad.version()); +} + +void loop() { + if (touchpad.available()) + Serial.println(touchpad.state()); +} diff --git a/lib/cst816t/extras/3d_model_p169h002.stp b/lib/cst816t/extras/3d_model_p169h002.stp new file mode 100644 index 00000000..df3c1e10 --- /dev/null +++ b/lib/cst816t/extras/3d_model_p169h002.stp @@ -0,0 +1,11027 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION((''),'2;1'); +FILE_NAME('P169H002','2022-03-28T15:05:42',('Administrator'),(''), +'CREO PARAMETRIC BY PTC INC, 2018500','CREO PARAMETRIC BY PTC INC, 2018500',''); +FILE_SCHEMA(('CONFIG_CONTROL_DESIGN','SHAPE_APPEARANCE_LAYERS_GROUPS')); +ENDSEC; +DATA; +#16=DIRECTION('',(-1.E0,0.E0,0.E0)); +#17=VECTOR('',#16,1.797E1); +#18=CARTESIAN_POINT('',(8.985E0,1.796E1,0.E0)); +#19=LINE('',#18,#17); +#20=DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#21=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#22=PRESENTATION_STYLE_ASSIGNMENT((#21)); +#23=STYLED_ITEM('',(#22),#19); +#24=DIRECTION('',(0.E0,-1.E0,0.E0)); +#25=VECTOR('',#24,2.263E1); +#26=CARTESIAN_POINT('',(-1.4385E1,1.256E1,0.E0)); +#27=LINE('',#26,#25); +#28=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#29=PRESENTATION_STYLE_ASSIGNMENT((#28)); +#30=STYLED_ITEM('',(#29),#27); +#31=DIRECTION('',(1.E0,0.E0,0.E0)); +#32=VECTOR('',#31,1.797E1); +#33=CARTESIAN_POINT('',(-8.985E0,-1.547E1,0.E0)); +#34=LINE('',#33,#32); +#35=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#36=PRESENTATION_STYLE_ASSIGNMENT((#35)); +#37=STYLED_ITEM('',(#36),#34); +#38=DIRECTION('',(0.E0,1.E0,0.E0)); +#39=VECTOR('',#38,2.263E1); +#40=CARTESIAN_POINT('',(1.4385E1,-1.007E1,0.E0)); +#41=LINE('',#40,#39); +#42=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#43=PRESENTATION_STYLE_ASSIGNMENT((#42)); +#44=STYLED_ITEM('',(#43),#41); +#45=CARTESIAN_POINT('',(9.835E0,1.351E1,0.E0)); +#46=DIRECTION('',(0.E0,0.E0,1.E0)); +#47=DIRECTION('',(1.E0,0.E0,0.E0)); +#48=AXIS2_PLACEMENT_3D('',#45,#46,#47); +#50=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#51=PRESENTATION_STYLE_ASSIGNMENT((#50)); +#52=STYLED_ITEM('',(#51),#49); +#53=DIRECTION('',(0.E0,1.E0,0.E0)); +#54=VECTOR('',#53,2.702E1); +#55=CARTESIAN_POINT('',(1.5035E1,-1.351E1,0.E0)); +#56=LINE('',#55,#54); +#57=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#58=PRESENTATION_STYLE_ASSIGNMENT((#57)); +#59=STYLED_ITEM('',(#58),#56); +#60=CARTESIAN_POINT('',(9.835E0,-1.351E1,0.E0)); +#61=DIRECTION('',(0.E0,0.E0,1.E0)); +#62=DIRECTION('',(0.E0,-1.E0,0.E0)); +#63=AXIS2_PLACEMENT_3D('',#60,#61,#62); +#65=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#66=PRESENTATION_STYLE_ASSIGNMENT((#65)); +#67=STYLED_ITEM('',(#66),#64); +#68=CARTESIAN_POINT('',(-9.835E0,-1.351E1,0.E0)); +#69=DIRECTION('',(0.E0,0.E0,1.E0)); +#70=DIRECTION('',(-1.E0,0.E0,0.E0)); +#71=AXIS2_PLACEMENT_3D('',#68,#69,#70); +#73=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#74=PRESENTATION_STYLE_ASSIGNMENT((#73)); +#75=STYLED_ITEM('',(#74),#72); +#76=DIRECTION('',(0.E0,-1.E0,0.E0)); +#77=VECTOR('',#76,2.702E1); +#78=CARTESIAN_POINT('',(-1.5035E1,1.351E1,0.E0)); +#79=LINE('',#78,#77); +#80=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#81=PRESENTATION_STYLE_ASSIGNMENT((#80)); +#82=STYLED_ITEM('',(#81),#79); +#83=CARTESIAN_POINT('',(-9.835E0,1.351E1,0.E0)); +#84=DIRECTION('',(0.E0,0.E0,1.E0)); +#85=DIRECTION('',(0.E0,1.E0,0.E0)); +#86=AXIS2_PLACEMENT_3D('',#83,#84,#85); +#88=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#89=PRESENTATION_STYLE_ASSIGNMENT((#88)); +#90=STYLED_ITEM('',(#89),#87); +#91=DIRECTION('',(-1.E0,0.E0,0.E0)); +#92=VECTOR('',#91,1.967E1); +#93=CARTESIAN_POINT('',(9.835E0,1.871E1,0.E0)); +#94=LINE('',#93,#92); +#95=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#96=PRESENTATION_STYLE_ASSIGNMENT((#95)); +#97=STYLED_ITEM('',(#96),#94); +#98=DIRECTION('',(0.E0,0.E0,-1.E0)); +#99=VECTOR('',#98,2.E-2); +#100=CARTESIAN_POINT('',(-8.985E0,1.796E1,0.E0)); +#101=LINE('',#100,#99); +#102=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#103=PRESENTATION_STYLE_ASSIGNMENT((#102)); +#104=STYLED_ITEM('',(#103),#101); +#105=DIRECTION('',(0.E0,0.E0,-1.E0)); +#106=VECTOR('',#105,2.E-2); +#107=CARTESIAN_POINT('',(8.985E0,1.796E1,0.E0)); +#108=LINE('',#107,#106); +#109=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#110=PRESENTATION_STYLE_ASSIGNMENT((#109)); +#111=STYLED_ITEM('',(#110),#108); +#112=CARTESIAN_POINT('',(-8.985E0,1.256E1,0.E0)); +#113=DIRECTION('',(0.E0,0.E0,-1.E0)); +#114=DIRECTION('',(-1.E0,0.E0,0.E0)); +#115=AXIS2_PLACEMENT_3D('',#112,#113,#114); +#117=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#118=PRESENTATION_STYLE_ASSIGNMENT((#117)); +#119=STYLED_ITEM('',(#118),#116); +#120=CARTESIAN_POINT('',(-8.985E0,-1.007E1,-2.E-2)); +#121=DIRECTION('',(0.E0,0.E0,1.E0)); +#122=DIRECTION('',(-1.E0,0.E0,0.E0)); +#123=AXIS2_PLACEMENT_3D('',#120,#121,#122); +#125=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#126=PRESENTATION_STYLE_ASSIGNMENT((#125)); +#127=STYLED_ITEM('',(#126),#124); +#128=DIRECTION('',(0.E0,-1.E0,0.E0)); +#129=VECTOR('',#128,2.263E1); +#130=CARTESIAN_POINT('',(-1.4385E1,1.256E1,-2.E-2)); +#131=LINE('',#130,#129); +#132=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#133=PRESENTATION_STYLE_ASSIGNMENT((#132)); +#134=STYLED_ITEM('',(#133),#131); +#135=CARTESIAN_POINT('',(-8.985E0,1.256E1,-2.E-2)); +#136=DIRECTION('',(0.E0,0.E0,1.E0)); +#137=DIRECTION('',(0.E0,1.E0,0.E0)); +#138=AXIS2_PLACEMENT_3D('',#135,#136,#137); +#140=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#141=PRESENTATION_STYLE_ASSIGNMENT((#140)); +#142=STYLED_ITEM('',(#141),#139); +#143=DIRECTION('',(-1.E0,0.E0,0.E0)); +#144=VECTOR('',#143,1.797E1); +#145=CARTESIAN_POINT('',(8.985E0,1.796E1,-2.E-2)); +#146=LINE('',#145,#144); +#147=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#148=PRESENTATION_STYLE_ASSIGNMENT((#147)); +#149=STYLED_ITEM('',(#148),#146); +#150=CARTESIAN_POINT('',(8.985E0,1.256E1,-2.E-2)); +#151=DIRECTION('',(0.E0,0.E0,1.E0)); +#152=DIRECTION('',(1.E0,0.E0,0.E0)); +#153=AXIS2_PLACEMENT_3D('',#150,#151,#152); +#155=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#156=PRESENTATION_STYLE_ASSIGNMENT((#155)); +#157=STYLED_ITEM('',(#156),#154); +#158=DIRECTION('',(0.E0,1.E0,0.E0)); +#159=VECTOR('',#158,2.263E1); +#160=CARTESIAN_POINT('',(1.4385E1,-1.007E1,-2.E-2)); +#161=LINE('',#160,#159); +#162=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#163=PRESENTATION_STYLE_ASSIGNMENT((#162)); +#164=STYLED_ITEM('',(#163),#161); +#165=CARTESIAN_POINT('',(8.985E0,-1.007E1,-2.E-2)); +#166=DIRECTION('',(0.E0,0.E0,1.E0)); +#167=DIRECTION('',(0.E0,-1.E0,0.E0)); +#168=AXIS2_PLACEMENT_3D('',#165,#166,#167); +#170=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#171=PRESENTATION_STYLE_ASSIGNMENT((#170)); +#172=STYLED_ITEM('',(#171),#169); +#173=DIRECTION('',(1.E0,0.E0,0.E0)); +#174=VECTOR('',#173,1.797E1); +#175=CARTESIAN_POINT('',(-8.985E0,-1.547E1,-2.E-2)); +#176=LINE('',#175,#174); +#177=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#178=PRESENTATION_STYLE_ASSIGNMENT((#177)); +#179=STYLED_ITEM('',(#178),#176); +#180=DIRECTION('',(0.E0,0.E0,-1.E0)); +#181=VECTOR('',#180,2.E-2); +#182=CARTESIAN_POINT('',(8.985E0,1.756E1,-2.E-2)); +#183=LINE('',#182,#181); +#184=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#185=PRESENTATION_STYLE_ASSIGNMENT((#184)); +#186=STYLED_ITEM('',(#185),#183); +#187=DIRECTION('',(0.E0,0.E0,-1.E0)); +#188=VECTOR('',#187,2.E-2); +#189=CARTESIAN_POINT('',(-8.985E0,1.756E1,-2.E-2)); +#190=LINE('',#189,#188); +#191=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#192=PRESENTATION_STYLE_ASSIGNMENT((#191)); +#193=STYLED_ITEM('',(#192),#190); +#194=DIRECTION('',(-1.E0,0.E0,0.E0)); +#195=VECTOR('',#194,1.797E1); +#196=CARTESIAN_POINT('',(8.985E0,1.756E1,-2.E-2)); +#197=LINE('',#196,#195); +#198=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#199=PRESENTATION_STYLE_ASSIGNMENT((#198)); +#200=STYLED_ITEM('',(#199),#197); +#201=CARTESIAN_POINT('',(8.985E0,1.256E1,-2.E-2)); +#202=DIRECTION('',(0.E0,0.E0,-1.E0)); +#203=DIRECTION('',(0.E0,1.E0,0.E0)); +#204=AXIS2_PLACEMENT_3D('',#201,#202,#203); +#206=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#207=PRESENTATION_STYLE_ASSIGNMENT((#206)); +#208=STYLED_ITEM('',(#207),#205); +#209=CARTESIAN_POINT('',(8.985E0,1.256E1,-4.E-2)); +#210=DIRECTION('',(0.E0,0.E0,1.E0)); +#211=DIRECTION('',(1.E0,0.E0,0.E0)); +#212=AXIS2_PLACEMENT_3D('',#209,#210,#211); +#214=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#215=PRESENTATION_STYLE_ASSIGNMENT((#214)); +#216=STYLED_ITEM('',(#215),#213); +#217=DIRECTION('',(0.E0,1.E0,0.E0)); +#218=VECTOR('',#217,2.263E1); +#219=CARTESIAN_POINT('',(1.3985E1,-1.007E1,-4.E-2)); +#220=LINE('',#219,#218); +#221=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#222=PRESENTATION_STYLE_ASSIGNMENT((#221)); +#223=STYLED_ITEM('',(#222),#220); +#224=CARTESIAN_POINT('',(8.985E0,-1.007E1,-4.E-2)); +#225=DIRECTION('',(0.E0,0.E0,1.E0)); +#226=DIRECTION('',(0.E0,-1.E0,0.E0)); +#227=AXIS2_PLACEMENT_3D('',#224,#225,#226); +#229=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#230=PRESENTATION_STYLE_ASSIGNMENT((#229)); +#231=STYLED_ITEM('',(#230),#228); +#232=DIRECTION('',(1.E0,0.E0,0.E0)); +#233=VECTOR('',#232,1.797E1); +#234=CARTESIAN_POINT('',(-8.985E0,-1.507E1,-4.E-2)); +#235=LINE('',#234,#233); +#236=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#237=PRESENTATION_STYLE_ASSIGNMENT((#236)); +#238=STYLED_ITEM('',(#237),#235); +#239=CARTESIAN_POINT('',(-8.985E0,-1.007E1,-4.E-2)); +#240=DIRECTION('',(0.E0,0.E0,1.E0)); +#241=DIRECTION('',(-1.E0,0.E0,0.E0)); +#242=AXIS2_PLACEMENT_3D('',#239,#240,#241); +#244=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#245=PRESENTATION_STYLE_ASSIGNMENT((#244)); +#246=STYLED_ITEM('',(#245),#243); +#247=DIRECTION('',(0.E0,-1.E0,0.E0)); +#248=VECTOR('',#247,2.263E1); +#249=CARTESIAN_POINT('',(-1.3985E1,1.256E1,-4.E-2)); +#250=LINE('',#249,#248); +#251=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#252=PRESENTATION_STYLE_ASSIGNMENT((#251)); +#253=STYLED_ITEM('',(#252),#250); +#254=CARTESIAN_POINT('',(-8.985E0,1.256E1,-4.E-2)); +#255=DIRECTION('',(0.E0,0.E0,1.E0)); +#256=DIRECTION('',(0.E0,1.E0,0.E0)); +#257=AXIS2_PLACEMENT_3D('',#254,#255,#256); +#259=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#260=PRESENTATION_STYLE_ASSIGNMENT((#259)); +#261=STYLED_ITEM('',(#260),#258); +#262=DIRECTION('',(-1.E0,0.E0,0.E0)); +#263=VECTOR('',#262,1.797E1); +#264=CARTESIAN_POINT('',(8.985E0,1.756E1,-4.E-2)); +#265=LINE('',#264,#263); +#266=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#267=PRESENTATION_STYLE_ASSIGNMENT((#266)); +#268=STYLED_ITEM('',(#267),#265); +#269=DIRECTION('',(0.E0,0.E0,-1.E0)); +#270=VECTOR('',#269,2.E-2); +#271=CARTESIAN_POINT('',(1.3985E1,1.256E1,-2.E-2)); +#272=LINE('',#271,#270); +#273=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#274=PRESENTATION_STYLE_ASSIGNMENT((#273)); +#275=STYLED_ITEM('',(#274),#272); +#276=DIRECTION('',(0.E0,1.E0,0.E0)); +#277=VECTOR('',#276,2.263E1); +#278=CARTESIAN_POINT('',(1.3985E1,-1.007E1,-2.E-2)); +#279=LINE('',#278,#277); +#280=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#281=PRESENTATION_STYLE_ASSIGNMENT((#280)); +#282=STYLED_ITEM('',(#281),#279); +#283=DIRECTION('',(0.E0,0.E0,-1.E0)); +#284=VECTOR('',#283,2.E-2); +#285=CARTESIAN_POINT('',(1.3985E1,-1.007E1,-2.E-2)); +#286=LINE('',#285,#284); +#287=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#288=PRESENTATION_STYLE_ASSIGNMENT((#287)); +#289=STYLED_ITEM('',(#288),#286); +#290=CARTESIAN_POINT('',(8.985E0,-1.007E1,-2.E-2)); +#291=DIRECTION('',(0.E0,0.E0,-1.E0)); +#292=DIRECTION('',(1.E0,0.E0,0.E0)); +#293=AXIS2_PLACEMENT_3D('',#290,#291,#292); +#295=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#296=PRESENTATION_STYLE_ASSIGNMENT((#295)); +#297=STYLED_ITEM('',(#296),#294); +#298=DIRECTION('',(0.E0,0.E0,-1.E0)); +#299=VECTOR('',#298,2.E-2); +#300=CARTESIAN_POINT('',(-8.985E0,-1.507E1,-2.E-2)); +#301=LINE('',#300,#299); +#302=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#303=PRESENTATION_STYLE_ASSIGNMENT((#302)); +#304=STYLED_ITEM('',(#303),#301); +#305=DIRECTION('',(0.E0,0.E0,-1.E0)); +#306=VECTOR('',#305,2.E-2); +#307=CARTESIAN_POINT('',(8.985E0,-1.507E1,-2.E-2)); +#308=LINE('',#307,#306); +#309=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#310=PRESENTATION_STYLE_ASSIGNMENT((#309)); +#311=STYLED_ITEM('',(#310),#308); +#312=DIRECTION('',(1.E0,0.E0,0.E0)); +#313=VECTOR('',#312,1.797E1); +#314=CARTESIAN_POINT('',(-8.985E0,-1.507E1,-2.E-2)); +#315=LINE('',#314,#313); +#316=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#317=PRESENTATION_STYLE_ASSIGNMENT((#316)); +#318=STYLED_ITEM('',(#317),#315); +#319=CARTESIAN_POINT('',(-8.985E0,-1.007E1,-2.E-2)); +#320=DIRECTION('',(0.E0,0.E0,-1.E0)); +#321=DIRECTION('',(0.E0,-1.E0,0.E0)); +#322=AXIS2_PLACEMENT_3D('',#319,#320,#321); +#324=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#325=PRESENTATION_STYLE_ASSIGNMENT((#324)); +#326=STYLED_ITEM('',(#325),#323); +#327=DIRECTION('',(0.E0,0.E0,-1.E0)); +#328=VECTOR('',#327,2.E-2); +#329=CARTESIAN_POINT('',(-1.3985E1,1.256E1,-2.E-2)); +#330=LINE('',#329,#328); +#331=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#332=PRESENTATION_STYLE_ASSIGNMENT((#331)); +#333=STYLED_ITEM('',(#332),#330); +#334=DIRECTION('',(0.E0,0.E0,-1.E0)); +#335=VECTOR('',#334,2.E-2); +#336=CARTESIAN_POINT('',(-1.3985E1,-1.007E1,-2.E-2)); +#337=LINE('',#336,#335); +#338=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#339=PRESENTATION_STYLE_ASSIGNMENT((#338)); +#340=STYLED_ITEM('',(#339),#337); +#341=DIRECTION('',(0.E0,-1.E0,0.E0)); +#342=VECTOR('',#341,2.263E1); +#343=CARTESIAN_POINT('',(-1.3985E1,1.256E1,-2.E-2)); +#344=LINE('',#343,#342); +#345=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#346=PRESENTATION_STYLE_ASSIGNMENT((#345)); +#347=STYLED_ITEM('',(#346),#344); +#348=CARTESIAN_POINT('',(-8.985E0,1.256E1,-2.E-2)); +#349=DIRECTION('',(0.E0,0.E0,-1.E0)); +#350=DIRECTION('',(-1.E0,0.E0,0.E0)); +#351=AXIS2_PLACEMENT_3D('',#348,#349,#350); +#353=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#354=PRESENTATION_STYLE_ASSIGNMENT((#353)); +#355=STYLED_ITEM('',(#354),#352); +#356=CARTESIAN_POINT('',(-8.985E0,-1.007E1,0.E0)); +#357=DIRECTION('',(0.E0,0.E0,-1.E0)); +#358=DIRECTION('',(0.E0,-1.E0,0.E0)); +#359=AXIS2_PLACEMENT_3D('',#356,#357,#358); +#361=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#362=PRESENTATION_STYLE_ASSIGNMENT((#361)); +#363=STYLED_ITEM('',(#362),#360); +#364=DIRECTION('',(0.E0,0.E0,-1.E0)); +#365=VECTOR('',#364,2.E-2); +#366=CARTESIAN_POINT('',(-8.985E0,-1.547E1,0.E0)); +#367=LINE('',#366,#365); +#368=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#369=PRESENTATION_STYLE_ASSIGNMENT((#368)); +#370=STYLED_ITEM('',(#369),#367); +#371=DIRECTION('',(0.E0,0.E0,-1.E0)); +#372=VECTOR('',#371,2.E-2); +#373=CARTESIAN_POINT('',(8.985E0,-1.547E1,0.E0)); +#374=LINE('',#373,#372); +#375=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#376=PRESENTATION_STYLE_ASSIGNMENT((#375)); +#377=STYLED_ITEM('',(#376),#374); +#378=CARTESIAN_POINT('',(8.985E0,-1.007E1,0.E0)); +#379=DIRECTION('',(0.E0,0.E0,-1.E0)); +#380=DIRECTION('',(1.E0,0.E0,0.E0)); +#381=AXIS2_PLACEMENT_3D('',#378,#379,#380); +#383=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#384=PRESENTATION_STYLE_ASSIGNMENT((#383)); +#385=STYLED_ITEM('',(#384),#382); +#386=DIRECTION('',(0.E0,0.E0,-1.E0)); +#387=VECTOR('',#386,2.E-2); +#388=CARTESIAN_POINT('',(1.4385E1,1.256E1,0.E0)); +#389=LINE('',#388,#387); +#390=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#391=PRESENTATION_STYLE_ASSIGNMENT((#390)); +#392=STYLED_ITEM('',(#391),#389); +#393=DIRECTION('',(0.E0,0.E0,-1.E0)); +#394=VECTOR('',#393,2.E-2); +#395=CARTESIAN_POINT('',(1.4385E1,-1.007E1,0.E0)); +#396=LINE('',#395,#394); +#397=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#398=PRESENTATION_STYLE_ASSIGNMENT((#397)); +#399=STYLED_ITEM('',(#398),#396); +#400=CARTESIAN_POINT('',(8.985E0,1.256E1,0.E0)); +#401=DIRECTION('',(0.E0,0.E0,-1.E0)); +#402=DIRECTION('',(0.E0,1.E0,0.E0)); +#403=AXIS2_PLACEMENT_3D('',#400,#401,#402); +#405=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#406=PRESENTATION_STYLE_ASSIGNMENT((#405)); +#407=STYLED_ITEM('',(#406),#404); +#408=DIRECTION('',(0.E0,0.E0,-1.E0)); +#409=VECTOR('',#408,2.E-2); +#410=CARTESIAN_POINT('',(-1.4385E1,-1.007E1,0.E0)); +#411=LINE('',#410,#409); +#412=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#413=PRESENTATION_STYLE_ASSIGNMENT((#412)); +#414=STYLED_ITEM('',(#413),#411); +#415=DIRECTION('',(0.E0,0.E0,-1.E0)); +#416=VECTOR('',#415,2.E-2); +#417=CARTESIAN_POINT('',(-1.4385E1,1.256E1,0.E0)); +#418=LINE('',#417,#416); +#419=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#420=PRESENTATION_STYLE_ASSIGNMENT((#419)); +#421=STYLED_ITEM('',(#420),#418); +#422=CARTESIAN_POINT('',(9.835E0,1.351E1,-1.56E0)); +#423=DIRECTION('',(0.E0,0.E0,-1.E0)); +#424=DIRECTION('',(0.E0,1.E0,0.E0)); +#425=AXIS2_PLACEMENT_3D('',#422,#423,#424); +#427=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#428=PRESENTATION_STYLE_ASSIGNMENT((#427)); +#429=STYLED_ITEM('',(#428),#426); +#430=DIRECTION('',(-1.E0,0.E0,0.E0)); +#431=VECTOR('',#430,1.967E1); +#432=CARTESIAN_POINT('',(9.835E0,1.871E1,-1.56E0)); +#433=LINE('',#432,#431); +#434=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#435=PRESENTATION_STYLE_ASSIGNMENT((#434)); +#436=STYLED_ITEM('',(#435),#433); +#437=CARTESIAN_POINT('',(-9.835E0,1.351E1,-1.56E0)); +#438=DIRECTION('',(0.E0,0.E0,-1.E0)); +#439=DIRECTION('',(-1.E0,0.E0,0.E0)); +#440=AXIS2_PLACEMENT_3D('',#437,#438,#439); +#442=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#443=PRESENTATION_STYLE_ASSIGNMENT((#442)); +#444=STYLED_ITEM('',(#443),#441); +#445=DIRECTION('',(0.E0,-1.E0,0.E0)); +#446=VECTOR('',#445,2.702E1); +#447=CARTESIAN_POINT('',(-1.5035E1,1.351E1,-1.56E0)); +#448=LINE('',#447,#446); +#449=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#450=PRESENTATION_STYLE_ASSIGNMENT((#449)); +#451=STYLED_ITEM('',(#450),#448); +#452=CARTESIAN_POINT('',(-9.835E0,-1.351E1,-1.56E0)); +#453=DIRECTION('',(0.E0,0.E0,-1.E0)); +#454=DIRECTION('',(0.E0,-1.E0,0.E0)); +#455=AXIS2_PLACEMENT_3D('',#452,#453,#454); +#457=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#458=PRESENTATION_STYLE_ASSIGNMENT((#457)); +#459=STYLED_ITEM('',(#458),#456); +#460=DIRECTION('',(1.E0,0.E0,0.E0)); +#461=VECTOR('',#460,1.967E1); +#462=CARTESIAN_POINT('',(-9.835E0,-1.871E1,-1.56E0)); +#463=LINE('',#462,#461); +#464=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#465=PRESENTATION_STYLE_ASSIGNMENT((#464)); +#466=STYLED_ITEM('',(#465),#463); +#467=CARTESIAN_POINT('',(9.835E0,-1.351E1,-1.56E0)); +#468=DIRECTION('',(0.E0,0.E0,-1.E0)); +#469=DIRECTION('',(1.E0,0.E0,0.E0)); +#470=AXIS2_PLACEMENT_3D('',#467,#468,#469); +#472=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#473=PRESENTATION_STYLE_ASSIGNMENT((#472)); +#474=STYLED_ITEM('',(#473),#471); +#475=DIRECTION('',(0.E0,1.E0,0.E0)); +#476=VECTOR('',#475,2.702E1); +#477=CARTESIAN_POINT('',(1.5035E1,-1.351E1,-1.56E0)); +#478=LINE('',#477,#476); +#479=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#480=PRESENTATION_STYLE_ASSIGNMENT((#479)); +#481=STYLED_ITEM('',(#480),#478); +#482=DIRECTION('',(0.E0,0.E0,-1.E0)); +#483=VECTOR('',#482,1.56E0); +#484=CARTESIAN_POINT('',(9.835E0,1.871E1,0.E0)); +#485=LINE('',#484,#483); +#486=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#487=PRESENTATION_STYLE_ASSIGNMENT((#486)); +#488=STYLED_ITEM('',(#487),#485); +#489=DIRECTION('',(0.E0,0.E0,-1.E0)); +#490=VECTOR('',#489,1.56E0); +#491=CARTESIAN_POINT('',(-9.835E0,1.871E1,0.E0)); +#492=LINE('',#491,#490); +#493=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#494=PRESENTATION_STYLE_ASSIGNMENT((#493)); +#495=STYLED_ITEM('',(#494),#492); +#496=DIRECTION('',(0.E0,0.E0,-1.E0)); +#497=VECTOR('',#496,1.56E0); +#498=CARTESIAN_POINT('',(-1.5035E1,-1.351E1,0.E0)); +#499=LINE('',#498,#497); +#500=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#501=PRESENTATION_STYLE_ASSIGNMENT((#500)); +#502=STYLED_ITEM('',(#501),#499); +#503=DIRECTION('',(0.E0,0.E0,-1.E0)); +#504=VECTOR('',#503,1.56E0); +#505=CARTESIAN_POINT('',(-1.5035E1,1.351E1,0.E0)); +#506=LINE('',#505,#504); +#507=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#508=PRESENTATION_STYLE_ASSIGNMENT((#507)); +#509=STYLED_ITEM('',(#508),#506); +#510=DIRECTION('',(0.E0,0.E0,-1.E0)); +#511=VECTOR('',#510,1.7E-1); +#512=CARTESIAN_POINT('',(3.732518888096E0,-1.871E1,-8.E-1)); +#513=LINE('',#512,#511); +#514=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#515=PRESENTATION_STYLE_ASSIGNMENT((#514)); +#516=STYLED_ITEM('',(#515),#513); +#517=DIRECTION('',(0.E0,0.E0,-1.E0)); +#518=VECTOR('',#517,1.7E-1); +#519=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-8.E-1)); +#520=LINE('',#519,#518); +#521=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#522=PRESENTATION_STYLE_ASSIGNMENT((#521)); +#523=STYLED_ITEM('',(#522),#520); +#524=DIRECTION('',(1.E0,0.E0,0.E0)); +#525=VECTOR('',#524,7.762518888096E0); +#526=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-9.7E-1)); +#527=LINE('',#526,#525); +#528=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#529=PRESENTATION_STYLE_ASSIGNMENT((#528)); +#530=STYLED_ITEM('',(#529),#527); +#531=DIRECTION('',(0.E0,0.E0,-1.E0)); +#532=VECTOR('',#531,1.56E0); +#533=CARTESIAN_POINT('',(9.835E0,-1.871E1,0.E0)); +#534=LINE('',#533,#532); +#535=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#536=PRESENTATION_STYLE_ASSIGNMENT((#535)); +#537=STYLED_ITEM('',(#536),#534); +#538=DIRECTION('',(0.E0,0.E0,-1.E0)); +#539=VECTOR('',#538,1.56E0); +#540=CARTESIAN_POINT('',(-9.835E0,-1.871E1,0.E0)); +#541=LINE('',#540,#539); +#542=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#543=PRESENTATION_STYLE_ASSIGNMENT((#542)); +#544=STYLED_ITEM('',(#543),#541); +#545=DIRECTION('',(1.E0,0.E0,0.E0)); +#546=VECTOR('',#545,1.967E1); +#547=CARTESIAN_POINT('',(-9.835E0,-1.871E1,0.E0)); +#548=LINE('',#547,#546); +#549=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#550=PRESENTATION_STYLE_ASSIGNMENT((#549)); +#551=STYLED_ITEM('',(#550),#548); +#552=DIRECTION('',(0.E0,0.E0,1.E0)); +#553=VECTOR('',#552,1.7E-1); +#554=CARTESIAN_POINT('',(3.732518888096E0,-2.051E1,-9.7E-1)); +#555=LINE('',#554,#553); +#556=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#557=PRESENTATION_STYLE_ASSIGNMENT((#556)); +#558=STYLED_ITEM('',(#557),#555); +#559=DIRECTION('',(0.E0,1.E0,0.E0)); +#560=VECTOR('',#559,1.8E0); +#561=CARTESIAN_POINT('',(3.732518888096E0,-2.051E1,-8.E-1)); +#562=LINE('',#561,#560); +#563=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#564=PRESENTATION_STYLE_ASSIGNMENT((#563)); +#565=STYLED_ITEM('',(#564),#562); +#566=CARTESIAN_POINT('',(4.232518888096E0,-2.051E1,-9.7E-1)); +#567=DIRECTION('',(0.E0,0.E0,1.E0)); +#568=DIRECTION('',(-1.E0,0.E0,0.E0)); +#569=AXIS2_PLACEMENT_3D('',#566,#567,#568); +#571=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#572=PRESENTATION_STYLE_ASSIGNMENT((#571)); +#573=STYLED_ITEM('',(#572),#570); +#574=CARTESIAN_POINT('',(4.232518888096E0,-2.051E1,-8.E-1)); +#575=DIRECTION('',(0.E0,0.E0,-1.E0)); +#576=DIRECTION('',(0.E0,-1.E0,0.E0)); +#577=AXIS2_PLACEMENT_3D('',#574,#575,#576); +#579=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#580=PRESENTATION_STYLE_ASSIGNMENT((#579)); +#581=STYLED_ITEM('',(#580),#578); +#582=DIRECTION('',(1.E0,0.E0,0.E0)); +#583=VECTOR('',#582,9.5E0); +#584=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-9.7E-1)); +#585=LINE('',#584,#583); +#586=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#587=PRESENTATION_STYLE_ASSIGNMENT((#586)); +#588=STYLED_ITEM('',(#587),#585); +#589=DIRECTION('',(0.E0,1.E0,0.E0)); +#590=VECTOR('',#589,6.67E0); +#591=CARTESIAN_POINT('',(4.76E0,-3.859E1,-9.7E-1)); +#592=LINE('',#591,#590); +#593=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#594=PRESENTATION_STYLE_ASSIGNMENT((#593)); +#595=STYLED_ITEM('',(#594),#592); +#596=DIRECTION('',(1.E0,0.E0,0.E0)); +#597=VECTOR('',#596,2.25E0); +#598=CARTESIAN_POINT('',(5.76E0,-3.092E1,-9.7E-1)); +#599=LINE('',#598,#597); +#600=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#601=PRESENTATION_STYLE_ASSIGNMENT((#600)); +#602=STYLED_ITEM('',(#601),#599); +#603=CARTESIAN_POINT('',(8.01E0,-2.992E1,-9.7E-1)); +#604=DIRECTION('',(0.E0,0.E0,-1.E0)); +#605=DIRECTION('',(1.E0,0.E0,0.E0)); +#606=AXIS2_PLACEMENT_3D('',#603,#604,#605); +#608=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#609=PRESENTATION_STYLE_ASSIGNMENT((#608)); +#610=STYLED_ITEM('',(#609),#607); +#611=DIRECTION('',(0.E0,1.E0,0.E0)); +#612=VECTOR('',#611,7.91E0); +#613=CARTESIAN_POINT('',(9.01E0,-2.992E1,-9.7E-1)); +#614=LINE('',#613,#612); +#615=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#616=PRESENTATION_STYLE_ASSIGNMENT((#615)); +#617=STYLED_ITEM('',(#616),#614); +#618=CARTESIAN_POINT('',(8.01E0,-2.201E1,-9.7E-1)); +#619=DIRECTION('',(0.E0,0.E0,-1.E0)); +#620=DIRECTION('',(0.E0,1.E0,0.E0)); +#621=AXIS2_PLACEMENT_3D('',#618,#619,#620); +#623=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#624=PRESENTATION_STYLE_ASSIGNMENT((#623)); +#625=STYLED_ITEM('',(#624),#622); +#626=DIRECTION('',(-1.E0,0.E0,0.E0)); +#627=VECTOR('',#626,3.777481111904E0); +#628=CARTESIAN_POINT('',(8.01E0,-2.101E1,-9.7E-1)); +#629=LINE('',#628,#627); +#630=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#631=PRESENTATION_STYLE_ASSIGNMENT((#630)); +#632=STYLED_ITEM('',(#631),#629); +#633=DIRECTION('',(0.E0,1.E0,0.E0)); +#634=VECTOR('',#633,1.8E0); +#635=CARTESIAN_POINT('',(3.732518888096E0,-2.051E1,-9.7E-1)); +#636=LINE('',#635,#634); +#637=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#638=PRESENTATION_STYLE_ASSIGNMENT((#637)); +#639=STYLED_ITEM('',(#638),#636); +#640=DIRECTION('',(0.E0,-1.E0,0.E0)); +#641=VECTOR('',#640,1.8E0); +#642=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-9.7E-1)); +#643=LINE('',#642,#641); +#644=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#645=PRESENTATION_STYLE_ASSIGNMENT((#644)); +#646=STYLED_ITEM('',(#645),#643); +#647=DIRECTION('',(-1.E0,0.E0,0.E0)); +#648=VECTOR('',#647,5.11E0); +#649=CARTESIAN_POINT('',(-4.53E0,-2.101E1,-9.7E-1)); +#650=LINE('',#649,#648); +#651=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#652=PRESENTATION_STYLE_ASSIGNMENT((#651)); +#653=STYLED_ITEM('',(#652),#650); +#654=CARTESIAN_POINT('',(-9.64E0,-2.201E1,-9.7E-1)); +#655=DIRECTION('',(0.E0,0.E0,-1.E0)); +#656=DIRECTION('',(-1.E0,0.E0,0.E0)); +#657=AXIS2_PLACEMENT_3D('',#654,#655,#656); +#659=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#660=PRESENTATION_STYLE_ASSIGNMENT((#659)); +#661=STYLED_ITEM('',(#660),#658); +#662=DIRECTION('',(0.E0,-1.E0,0.E0)); +#663=VECTOR('',#662,7.91E0); +#664=CARTESIAN_POINT('',(-1.064E1,-2.201E1,-9.7E-1)); +#665=LINE('',#664,#663); +#666=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#667=PRESENTATION_STYLE_ASSIGNMENT((#666)); +#668=STYLED_ITEM('',(#667),#665); +#669=CARTESIAN_POINT('',(-9.64E0,-2.992E1,-9.7E-1)); +#670=DIRECTION('',(0.E0,0.E0,-1.E0)); +#671=DIRECTION('',(0.E0,-1.E0,0.E0)); +#672=AXIS2_PLACEMENT_3D('',#669,#670,#671); +#674=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#675=PRESENTATION_STYLE_ASSIGNMENT((#674)); +#676=STYLED_ITEM('',(#675),#673); +#677=DIRECTION('',(1.E0,0.E0,0.E0)); +#678=VECTOR('',#677,3.9E0); +#679=CARTESIAN_POINT('',(-9.64E0,-3.092E1,-9.7E-1)); +#680=LINE('',#679,#678); +#681=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#682=PRESENTATION_STYLE_ASSIGNMENT((#681)); +#683=STYLED_ITEM('',(#682),#680); +#684=DIRECTION('',(0.E0,-1.E0,0.E0)); +#685=VECTOR('',#684,6.67E0); +#686=CARTESIAN_POINT('',(-4.74E0,-3.192E1,-9.7E-1)); +#687=LINE('',#686,#685); +#688=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#689=PRESENTATION_STYLE_ASSIGNMENT((#688)); +#690=STYLED_ITEM('',(#689),#687); +#691=DIRECTION('',(0.E0,0.E0,-1.E0)); +#692=VECTOR('',#691,1.3E-1); +#693=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-9.7E-1)); +#694=LINE('',#693,#692); +#695=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#696=PRESENTATION_STYLE_ASSIGNMENT((#695)); +#697=STYLED_ITEM('',(#696),#694); +#698=DIRECTION('',(0.E0,0.E0,-1.E0)); +#699=VECTOR('',#698,3.E-1); +#700=CARTESIAN_POINT('',(-4.74E0,-4.309E1,-8.E-1)); +#701=LINE('',#700,#699); +#702=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#703=PRESENTATION_STYLE_ASSIGNMENT((#702)); +#704=STYLED_ITEM('',(#703),#701); +#705=DIRECTION('',(0.E0,0.E0,1.E0)); +#706=VECTOR('',#705,1.7E-1); +#707=CARTESIAN_POINT('',(-4.74E0,-3.192E1,-9.7E-1)); +#708=LINE('',#707,#706); +#709=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#710=PRESENTATION_STYLE_ASSIGNMENT((#709)); +#711=STYLED_ITEM('',(#710),#708); +#712=DIRECTION('',(0.E0,-1.E0,0.E0)); +#713=VECTOR('',#712,1.117E1); +#714=CARTESIAN_POINT('',(-4.74E0,-3.192E1,-8.E-1)); +#715=LINE('',#714,#713); +#716=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#717=PRESENTATION_STYLE_ASSIGNMENT((#716)); +#718=STYLED_ITEM('',(#717),#715); +#719=DIRECTION('',(0.E0,0.E0,-1.E0)); +#720=VECTOR('',#719,3.E-1); +#721=CARTESIAN_POINT('',(-4.44E0,-4.339E1,-8.E-1)); +#722=LINE('',#721,#720); +#723=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#724=PRESENTATION_STYLE_ASSIGNMENT((#723)); +#725=STYLED_ITEM('',(#724),#722); +#726=DIRECTION('',(0.E0,0.E0,-1.E0)); +#727=VECTOR('',#726,3.E-1); +#728=CARTESIAN_POINT('',(4.46E0,-4.339E1,-8.E-1)); +#729=LINE('',#728,#727); +#730=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#731=PRESENTATION_STYLE_ASSIGNMENT((#730)); +#732=STYLED_ITEM('',(#731),#729); +#733=DIRECTION('',(1.E0,0.E0,0.E0)); +#734=VECTOR('',#733,8.9E0); +#735=CARTESIAN_POINT('',(-4.44E0,-4.339E1,-8.E-1)); +#736=LINE('',#735,#734); +#737=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#738=PRESENTATION_STYLE_ASSIGNMENT((#737)); +#739=STYLED_ITEM('',(#738),#736); +#740=DIRECTION('',(0.E0,0.E0,-1.E0)); +#741=VECTOR('',#740,1.3E-1); +#742=CARTESIAN_POINT('',(4.76E0,-3.859E1,-9.7E-1)); +#743=LINE('',#742,#741); +#744=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#745=PRESENTATION_STYLE_ASSIGNMENT((#744)); +#746=STYLED_ITEM('',(#745),#743); +#747=DIRECTION('',(0.E0,0.E0,1.E0)); +#748=VECTOR('',#747,3.E-1); +#749=CARTESIAN_POINT('',(4.76E0,-4.309E1,-1.1E0)); +#750=LINE('',#749,#748); +#751=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#752=PRESENTATION_STYLE_ASSIGNMENT((#751)); +#753=STYLED_ITEM('',(#752),#750); +#754=DIRECTION('',(0.E0,1.E0,0.E0)); +#755=VECTOR('',#754,1.117E1); +#756=CARTESIAN_POINT('',(4.76E0,-4.309E1,-8.E-1)); +#757=LINE('',#756,#755); +#758=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#759=PRESENTATION_STYLE_ASSIGNMENT((#758)); +#760=STYLED_ITEM('',(#759),#757); +#761=DIRECTION('',(0.E0,0.E0,1.E0)); +#762=VECTOR('',#761,1.7E-1); +#763=CARTESIAN_POINT('',(4.76E0,-3.192E1,-9.7E-1)); +#764=LINE('',#763,#762); +#765=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#766=PRESENTATION_STYLE_ASSIGNMENT((#765)); +#767=STYLED_ITEM('',(#766),#764); +#768=CARTESIAN_POINT('',(4.46E0,-4.309E1,-1.1E0)); +#769=DIRECTION('',(0.E0,0.E0,-1.E0)); +#770=DIRECTION('',(1.E0,2.368475785867E-14,0.E0)); +#771=AXIS2_PLACEMENT_3D('',#768,#769,#770); +#773=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#774=PRESENTATION_STYLE_ASSIGNMENT((#773)); +#775=STYLED_ITEM('',(#774),#772); +#776=DIRECTION('',(0.E0,-1.E0,0.E0)); +#777=VECTOR('',#776,4.5E0); +#778=CARTESIAN_POINT('',(4.76E0,-3.859E1,-1.1E0)); +#779=LINE('',#778,#777); +#780=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#781=PRESENTATION_STYLE_ASSIGNMENT((#780)); +#782=STYLED_ITEM('',(#781),#779); +#783=DIRECTION('',(1.E0,0.E0,0.E0)); +#784=VECTOR('',#783,9.5E0); +#785=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-1.1E0)); +#786=LINE('',#785,#784); +#787=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#788=PRESENTATION_STYLE_ASSIGNMENT((#787)); +#789=STYLED_ITEM('',(#788),#786); +#790=DIRECTION('',(0.E0,1.E0,0.E0)); +#791=VECTOR('',#790,4.5E0); +#792=CARTESIAN_POINT('',(-4.74E0,-4.309E1,-1.1E0)); +#793=LINE('',#792,#791); +#794=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#795=PRESENTATION_STYLE_ASSIGNMENT((#794)); +#796=STYLED_ITEM('',(#795),#793); +#797=CARTESIAN_POINT('',(-4.44E0,-4.309E1,-1.1E0)); +#798=DIRECTION('',(0.E0,0.E0,-1.E0)); +#799=DIRECTION('',(0.E0,-1.E0,0.E0)); +#800=AXIS2_PLACEMENT_3D('',#797,#798,#799); +#802=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#803=PRESENTATION_STYLE_ASSIGNMENT((#802)); +#804=STYLED_ITEM('',(#803),#801); +#805=DIRECTION('',(-1.E0,0.E0,0.E0)); +#806=VECTOR('',#805,8.9E0); +#807=CARTESIAN_POINT('',(4.46E0,-4.339E1,-1.1E0)); +#808=LINE('',#807,#806); +#809=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#810=PRESENTATION_STYLE_ASSIGNMENT((#809)); +#811=STYLED_ITEM('',(#810),#808); +#812=DIRECTION('',(0.E0,-1.E0,0.E0)); +#813=VECTOR('',#812,2.8E0); +#814=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.E-1)); +#815=LINE('',#814,#813); +#816=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#817=PRESENTATION_STYLE_ASSIGNMENT((#816)); +#818=STYLED_ITEM('',(#817),#815); +#819=DIRECTION('',(1.E0,0.E0,0.E0)); +#820=VECTOR('',#819,3.5E-1); +#821=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.E-1)); +#822=LINE('',#821,#820); +#823=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#824=PRESENTATION_STYLE_ASSIGNMENT((#823)); +#825=STYLED_ITEM('',(#824),#822); +#826=DIRECTION('',(0.E0,1.E0,0.E0)); +#827=VECTOR('',#826,2.8E0); +#828=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.E-1)); +#829=LINE('',#828,#827); +#830=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#831=PRESENTATION_STYLE_ASSIGNMENT((#830)); +#832=STYLED_ITEM('',(#831),#829); +#833=DIRECTION('',(-1.E0,0.E0,0.E0)); +#834=VECTOR('',#833,3.5E-1); +#835=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.E-1)); +#836=LINE('',#835,#834); +#837=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#838=PRESENTATION_STYLE_ASSIGNMENT((#837)); +#839=STYLED_ITEM('',(#838),#836); +#840=DIRECTION('',(0.E0,-1.E0,0.E0)); +#841=VECTOR('',#840,2.8E0); +#842=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.E-1)); +#843=LINE('',#842,#841); +#844=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#845=PRESENTATION_STYLE_ASSIGNMENT((#844)); +#846=STYLED_ITEM('',(#845),#843); +#847=DIRECTION('',(1.E0,0.E0,0.E0)); +#848=VECTOR('',#847,3.5E-1); +#849=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.E-1)); +#850=LINE('',#849,#848); +#851=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#852=PRESENTATION_STYLE_ASSIGNMENT((#851)); +#853=STYLED_ITEM('',(#852),#850); +#854=DIRECTION('',(0.E0,1.E0,0.E0)); +#855=VECTOR('',#854,2.8E0); +#856=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.E-1)); +#857=LINE('',#856,#855); +#858=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#859=PRESENTATION_STYLE_ASSIGNMENT((#858)); +#860=STYLED_ITEM('',(#859),#857); +#861=DIRECTION('',(-1.E0,0.E0,0.E0)); +#862=VECTOR('',#861,3.5E-1); +#863=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.E-1)); +#864=LINE('',#863,#862); +#865=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#866=PRESENTATION_STYLE_ASSIGNMENT((#865)); +#867=STYLED_ITEM('',(#866),#864); +#868=DIRECTION('',(0.E0,-1.E0,0.E0)); +#869=VECTOR('',#868,2.8E0); +#870=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.E-1)); +#871=LINE('',#870,#869); +#872=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#873=PRESENTATION_STYLE_ASSIGNMENT((#872)); +#874=STYLED_ITEM('',(#873),#871); +#875=DIRECTION('',(1.E0,0.E0,0.E0)); +#876=VECTOR('',#875,3.5E-1); +#877=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.E-1)); +#878=LINE('',#877,#876); +#879=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#880=PRESENTATION_STYLE_ASSIGNMENT((#879)); +#881=STYLED_ITEM('',(#880),#878); +#882=DIRECTION('',(0.E0,1.E0,0.E0)); +#883=VECTOR('',#882,2.8E0); +#884=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.E-1)); +#885=LINE('',#884,#883); +#886=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#887=PRESENTATION_STYLE_ASSIGNMENT((#886)); +#888=STYLED_ITEM('',(#887),#885); +#889=DIRECTION('',(-1.E0,0.E0,0.E0)); +#890=VECTOR('',#889,3.5E-1); +#891=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.E-1)); +#892=LINE('',#891,#890); +#893=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#894=PRESENTATION_STYLE_ASSIGNMENT((#893)); +#895=STYLED_ITEM('',(#894),#892); +#896=DIRECTION('',(0.E0,-1.E0,0.E0)); +#897=VECTOR('',#896,2.8E0); +#898=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.E-1)); +#899=LINE('',#898,#897); +#900=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#901=PRESENTATION_STYLE_ASSIGNMENT((#900)); +#902=STYLED_ITEM('',(#901),#899); +#903=DIRECTION('',(1.E0,0.E0,0.E0)); +#904=VECTOR('',#903,3.5E-1); +#905=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.E-1)); +#906=LINE('',#905,#904); +#907=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#908=PRESENTATION_STYLE_ASSIGNMENT((#907)); +#909=STYLED_ITEM('',(#908),#906); +#910=DIRECTION('',(0.E0,1.E0,0.E0)); +#911=VECTOR('',#910,2.8E0); +#912=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.E-1)); +#913=LINE('',#912,#911); +#914=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#915=PRESENTATION_STYLE_ASSIGNMENT((#914)); +#916=STYLED_ITEM('',(#915),#913); +#917=DIRECTION('',(-1.E0,0.E0,0.E0)); +#918=VECTOR('',#917,3.5E-1); +#919=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.E-1)); +#920=LINE('',#919,#918); +#921=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#922=PRESENTATION_STYLE_ASSIGNMENT((#921)); +#923=STYLED_ITEM('',(#922),#920); +#924=DIRECTION('',(0.E0,-1.E0,0.E0)); +#925=VECTOR('',#924,2.8E0); +#926=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.E-1)); +#927=LINE('',#926,#925); +#928=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#929=PRESENTATION_STYLE_ASSIGNMENT((#928)); +#930=STYLED_ITEM('',(#929),#927); +#931=DIRECTION('',(1.E0,0.E0,0.E0)); +#932=VECTOR('',#931,3.5E-1); +#933=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.E-1)); +#934=LINE('',#933,#932); +#935=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#936=PRESENTATION_STYLE_ASSIGNMENT((#935)); +#937=STYLED_ITEM('',(#936),#934); +#938=DIRECTION('',(0.E0,1.E0,0.E0)); +#939=VECTOR('',#938,2.8E0); +#940=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.E-1)); +#941=LINE('',#940,#939); +#942=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#943=PRESENTATION_STYLE_ASSIGNMENT((#942)); +#944=STYLED_ITEM('',(#943),#941); +#945=DIRECTION('',(-1.E0,0.E0,0.E0)); +#946=VECTOR('',#945,3.5E-1); +#947=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.E-1)); +#948=LINE('',#947,#946); +#949=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#950=PRESENTATION_STYLE_ASSIGNMENT((#949)); +#951=STYLED_ITEM('',(#950),#948); +#952=DIRECTION('',(0.E0,-1.E0,0.E0)); +#953=VECTOR('',#952,2.8E0); +#954=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.E-1)); +#955=LINE('',#954,#953); +#956=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#957=PRESENTATION_STYLE_ASSIGNMENT((#956)); +#958=STYLED_ITEM('',(#957),#955); +#959=DIRECTION('',(1.E0,0.E0,0.E0)); +#960=VECTOR('',#959,3.5E-1); +#961=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.E-1)); +#962=LINE('',#961,#960); +#963=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#964=PRESENTATION_STYLE_ASSIGNMENT((#963)); +#965=STYLED_ITEM('',(#964),#962); +#966=DIRECTION('',(0.E0,1.E0,0.E0)); +#967=VECTOR('',#966,2.8E0); +#968=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.E-1)); +#969=LINE('',#968,#967); +#970=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#971=PRESENTATION_STYLE_ASSIGNMENT((#970)); +#972=STYLED_ITEM('',(#971),#969); +#973=DIRECTION('',(-1.E0,0.E0,0.E0)); +#974=VECTOR('',#973,3.5E-1); +#975=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.E-1)); +#976=LINE('',#975,#974); +#977=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#978=PRESENTATION_STYLE_ASSIGNMENT((#977)); +#979=STYLED_ITEM('',(#978),#976); +#980=DIRECTION('',(0.E0,-1.E0,0.E0)); +#981=VECTOR('',#980,2.8E0); +#982=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.E-1)); +#983=LINE('',#982,#981); +#984=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#985=PRESENTATION_STYLE_ASSIGNMENT((#984)); +#986=STYLED_ITEM('',(#985),#983); +#987=DIRECTION('',(1.E0,0.E0,0.E0)); +#988=VECTOR('',#987,3.5E-1); +#989=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.E-1)); +#990=LINE('',#989,#988); +#991=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#992=PRESENTATION_STYLE_ASSIGNMENT((#991)); +#993=STYLED_ITEM('',(#992),#990); +#994=DIRECTION('',(0.E0,1.E0,0.E0)); +#995=VECTOR('',#994,2.8E0); +#996=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.E-1)); +#997=LINE('',#996,#995); +#998=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#999=PRESENTATION_STYLE_ASSIGNMENT((#998)); +#1000=STYLED_ITEM('',(#999),#997); +#1001=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1002=VECTOR('',#1001,3.5E-1); +#1003=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.E-1)); +#1004=LINE('',#1003,#1002); +#1005=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1006=PRESENTATION_STYLE_ASSIGNMENT((#1005)); +#1007=STYLED_ITEM('',(#1006),#1004); +#1008=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1009=VECTOR('',#1008,2.8E0); +#1010=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.E-1)); +#1011=LINE('',#1010,#1009); +#1012=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1013=PRESENTATION_STYLE_ASSIGNMENT((#1012)); +#1014=STYLED_ITEM('',(#1013),#1011); +#1015=DIRECTION('',(1.E0,0.E0,0.E0)); +#1016=VECTOR('',#1015,3.5E-1); +#1017=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.E-1)); +#1018=LINE('',#1017,#1016); +#1019=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1020=PRESENTATION_STYLE_ASSIGNMENT((#1019)); +#1021=STYLED_ITEM('',(#1020),#1018); +#1022=DIRECTION('',(0.E0,1.E0,0.E0)); +#1023=VECTOR('',#1022,2.8E0); +#1024=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.E-1)); +#1025=LINE('',#1024,#1023); +#1026=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1027=PRESENTATION_STYLE_ASSIGNMENT((#1026)); +#1028=STYLED_ITEM('',(#1027),#1025); +#1029=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1030=VECTOR('',#1029,3.5E-1); +#1031=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.E-1)); +#1032=LINE('',#1031,#1030); +#1033=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1034=PRESENTATION_STYLE_ASSIGNMENT((#1033)); +#1035=STYLED_ITEM('',(#1034),#1032); +#1036=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1037=VECTOR('',#1036,2.8E0); +#1038=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.E-1)); +#1039=LINE('',#1038,#1037); +#1040=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1041=PRESENTATION_STYLE_ASSIGNMENT((#1040)); +#1042=STYLED_ITEM('',(#1041),#1039); +#1043=DIRECTION('',(1.E0,0.E0,0.E0)); +#1044=VECTOR('',#1043,3.5E-1); +#1045=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.E-1)); +#1046=LINE('',#1045,#1044); +#1047=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1048=PRESENTATION_STYLE_ASSIGNMENT((#1047)); +#1049=STYLED_ITEM('',(#1048),#1046); +#1050=DIRECTION('',(0.E0,1.E0,0.E0)); +#1051=VECTOR('',#1050,2.8E0); +#1052=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.E-1)); +#1053=LINE('',#1052,#1051); +#1054=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1055=PRESENTATION_STYLE_ASSIGNMENT((#1054)); +#1056=STYLED_ITEM('',(#1055),#1053); +#1057=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1058=VECTOR('',#1057,3.5E-1); +#1059=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.E-1)); +#1060=LINE('',#1059,#1058); +#1061=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1062=PRESENTATION_STYLE_ASSIGNMENT((#1061)); +#1063=STYLED_ITEM('',(#1062),#1060); +#1064=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1065=VECTOR('',#1064,2.8E0); +#1066=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.E-1)); +#1067=LINE('',#1066,#1065); +#1068=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1069=PRESENTATION_STYLE_ASSIGNMENT((#1068)); +#1070=STYLED_ITEM('',(#1069),#1067); +#1071=DIRECTION('',(1.E0,0.E0,0.E0)); +#1072=VECTOR('',#1071,3.5E-1); +#1073=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.E-1)); +#1074=LINE('',#1073,#1072); +#1075=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1076=PRESENTATION_STYLE_ASSIGNMENT((#1075)); +#1077=STYLED_ITEM('',(#1076),#1074); +#1078=DIRECTION('',(0.E0,1.E0,0.E0)); +#1079=VECTOR('',#1078,2.8E0); +#1080=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.E-1)); +#1081=LINE('',#1080,#1079); +#1082=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1083=PRESENTATION_STYLE_ASSIGNMENT((#1082)); +#1084=STYLED_ITEM('',(#1083),#1081); +#1085=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1086=VECTOR('',#1085,3.5E-1); +#1087=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.E-1)); +#1088=LINE('',#1087,#1086); +#1089=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1090=PRESENTATION_STYLE_ASSIGNMENT((#1089)); +#1091=STYLED_ITEM('',(#1090),#1088); +#1092=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1093=VECTOR('',#1092,2.8E0); +#1094=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.E-1)); +#1095=LINE('',#1094,#1093); +#1096=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1097=PRESENTATION_STYLE_ASSIGNMENT((#1096)); +#1098=STYLED_ITEM('',(#1097),#1095); +#1099=DIRECTION('',(1.E0,0.E0,0.E0)); +#1100=VECTOR('',#1099,3.5E-1); +#1101=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.E-1)); +#1102=LINE('',#1101,#1100); +#1103=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1104=PRESENTATION_STYLE_ASSIGNMENT((#1103)); +#1105=STYLED_ITEM('',(#1104),#1102); +#1106=DIRECTION('',(0.E0,1.E0,0.E0)); +#1107=VECTOR('',#1106,2.8E0); +#1108=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.E-1)); +#1109=LINE('',#1108,#1107); +#1110=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1111=PRESENTATION_STYLE_ASSIGNMENT((#1110)); +#1112=STYLED_ITEM('',(#1111),#1109); +#1113=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1114=VECTOR('',#1113,3.5E-1); +#1115=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.E-1)); +#1116=LINE('',#1115,#1114); +#1117=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1118=PRESENTATION_STYLE_ASSIGNMENT((#1117)); +#1119=STYLED_ITEM('',(#1118),#1116); +#1120=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1121=VECTOR('',#1120,2.8E0); +#1122=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.E-1)); +#1123=LINE('',#1122,#1121); +#1124=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1125=PRESENTATION_STYLE_ASSIGNMENT((#1124)); +#1126=STYLED_ITEM('',(#1125),#1123); +#1127=DIRECTION('',(1.E0,0.E0,0.E0)); +#1128=VECTOR('',#1127,3.5E-1); +#1129=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.E-1)); +#1130=LINE('',#1129,#1128); +#1131=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1132=PRESENTATION_STYLE_ASSIGNMENT((#1131)); +#1133=STYLED_ITEM('',(#1132),#1130); +#1134=DIRECTION('',(0.E0,1.E0,0.E0)); +#1135=VECTOR('',#1134,2.8E0); +#1136=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.E-1)); +#1137=LINE('',#1136,#1135); +#1138=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1139=PRESENTATION_STYLE_ASSIGNMENT((#1138)); +#1140=STYLED_ITEM('',(#1139),#1137); +#1141=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1142=VECTOR('',#1141,3.5E-1); +#1143=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.E-1)); +#1144=LINE('',#1143,#1142); +#1145=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1146=PRESENTATION_STYLE_ASSIGNMENT((#1145)); +#1147=STYLED_ITEM('',(#1146),#1144); +#1148=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1149=VECTOR('',#1148,2.8E0); +#1150=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.E-1)); +#1151=LINE('',#1150,#1149); +#1152=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1153=PRESENTATION_STYLE_ASSIGNMENT((#1152)); +#1154=STYLED_ITEM('',(#1153),#1151); +#1155=DIRECTION('',(1.E0,0.E0,0.E0)); +#1156=VECTOR('',#1155,3.5E-1); +#1157=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.E-1)); +#1158=LINE('',#1157,#1156); +#1159=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1160=PRESENTATION_STYLE_ASSIGNMENT((#1159)); +#1161=STYLED_ITEM('',(#1160),#1158); +#1162=DIRECTION('',(0.E0,1.E0,0.E0)); +#1163=VECTOR('',#1162,2.8E0); +#1164=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.E-1)); +#1165=LINE('',#1164,#1163); +#1166=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1167=PRESENTATION_STYLE_ASSIGNMENT((#1166)); +#1168=STYLED_ITEM('',(#1167),#1165); +#1169=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1170=VECTOR('',#1169,3.5E-1); +#1171=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.E-1)); +#1172=LINE('',#1171,#1170); +#1173=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1174=PRESENTATION_STYLE_ASSIGNMENT((#1173)); +#1175=STYLED_ITEM('',(#1174),#1172); +#1176=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1177=VECTOR('',#1176,2.8E0); +#1178=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.E-1)); +#1179=LINE('',#1178,#1177); +#1180=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1181=PRESENTATION_STYLE_ASSIGNMENT((#1180)); +#1182=STYLED_ITEM('',(#1181),#1179); +#1183=DIRECTION('',(1.E0,0.E0,0.E0)); +#1184=VECTOR('',#1183,3.5E-1); +#1185=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.E-1)); +#1186=LINE('',#1185,#1184); +#1187=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1188=PRESENTATION_STYLE_ASSIGNMENT((#1187)); +#1189=STYLED_ITEM('',(#1188),#1186); +#1190=DIRECTION('',(0.E0,1.E0,0.E0)); +#1191=VECTOR('',#1190,2.8E0); +#1192=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.E-1)); +#1193=LINE('',#1192,#1191); +#1194=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1195=PRESENTATION_STYLE_ASSIGNMENT((#1194)); +#1196=STYLED_ITEM('',(#1195),#1193); +#1197=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1198=VECTOR('',#1197,3.5E-1); +#1199=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.E-1)); +#1200=LINE('',#1199,#1198); +#1201=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1202=PRESENTATION_STYLE_ASSIGNMENT((#1201)); +#1203=STYLED_ITEM('',(#1202),#1200); +#1204=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1205=VECTOR('',#1204,2.8E0); +#1206=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.E-1)); +#1207=LINE('',#1206,#1205); +#1208=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1209=PRESENTATION_STYLE_ASSIGNMENT((#1208)); +#1210=STYLED_ITEM('',(#1209),#1207); +#1211=DIRECTION('',(1.E0,0.E0,0.E0)); +#1212=VECTOR('',#1211,3.5E-1); +#1213=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.E-1)); +#1214=LINE('',#1213,#1212); +#1215=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1216=PRESENTATION_STYLE_ASSIGNMENT((#1215)); +#1217=STYLED_ITEM('',(#1216),#1214); +#1218=DIRECTION('',(0.E0,1.E0,0.E0)); +#1219=VECTOR('',#1218,2.8E0); +#1220=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.E-1)); +#1221=LINE('',#1220,#1219); +#1222=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1223=PRESENTATION_STYLE_ASSIGNMENT((#1222)); +#1224=STYLED_ITEM('',(#1223),#1221); +#1225=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1226=VECTOR('',#1225,3.5E-1); +#1227=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.E-1)); +#1228=LINE('',#1227,#1226); +#1229=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1230=PRESENTATION_STYLE_ASSIGNMENT((#1229)); +#1231=STYLED_ITEM('',(#1230),#1228); +#1232=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1233=VECTOR('',#1232,2.8E0); +#1234=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.E-1)); +#1235=LINE('',#1234,#1233); +#1236=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1237=PRESENTATION_STYLE_ASSIGNMENT((#1236)); +#1238=STYLED_ITEM('',(#1237),#1235); +#1239=DIRECTION('',(1.E0,0.E0,0.E0)); +#1240=VECTOR('',#1239,3.5E-1); +#1241=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.E-1)); +#1242=LINE('',#1241,#1240); +#1243=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1244=PRESENTATION_STYLE_ASSIGNMENT((#1243)); +#1245=STYLED_ITEM('',(#1244),#1242); +#1246=DIRECTION('',(0.E0,1.E0,0.E0)); +#1247=VECTOR('',#1246,2.8E0); +#1248=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.E-1)); +#1249=LINE('',#1248,#1247); +#1250=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1251=PRESENTATION_STYLE_ASSIGNMENT((#1250)); +#1252=STYLED_ITEM('',(#1251),#1249); +#1253=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1254=VECTOR('',#1253,3.5E-1); +#1255=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.E-1)); +#1256=LINE('',#1255,#1254); +#1257=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1258=PRESENTATION_STYLE_ASSIGNMENT((#1257)); +#1259=STYLED_ITEM('',(#1258),#1256); +#1260=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1261=VECTOR('',#1260,2.8E0); +#1262=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.E-1)); +#1263=LINE('',#1262,#1261); +#1264=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1265=PRESENTATION_STYLE_ASSIGNMENT((#1264)); +#1266=STYLED_ITEM('',(#1265),#1263); +#1267=DIRECTION('',(1.E0,0.E0,0.E0)); +#1268=VECTOR('',#1267,3.5E-1); +#1269=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.E-1)); +#1270=LINE('',#1269,#1268); +#1271=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1272=PRESENTATION_STYLE_ASSIGNMENT((#1271)); +#1273=STYLED_ITEM('',(#1272),#1270); +#1274=DIRECTION('',(0.E0,1.E0,0.E0)); +#1275=VECTOR('',#1274,2.8E0); +#1276=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.E-1)); +#1277=LINE('',#1276,#1275); +#1278=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1279=PRESENTATION_STYLE_ASSIGNMENT((#1278)); +#1280=STYLED_ITEM('',(#1279),#1277); +#1281=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1282=VECTOR('',#1281,3.5E-1); +#1283=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.E-1)); +#1284=LINE('',#1283,#1282); +#1285=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1286=PRESENTATION_STYLE_ASSIGNMENT((#1285)); +#1287=STYLED_ITEM('',(#1286),#1284); +#1288=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1289=VECTOR('',#1288,2.8E0); +#1290=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.E-1)); +#1291=LINE('',#1290,#1289); +#1292=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1293=PRESENTATION_STYLE_ASSIGNMENT((#1292)); +#1294=STYLED_ITEM('',(#1293),#1291); +#1295=DIRECTION('',(1.E0,0.E0,0.E0)); +#1296=VECTOR('',#1295,3.5E-1); +#1297=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.E-1)); +#1298=LINE('',#1297,#1296); +#1299=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1300=PRESENTATION_STYLE_ASSIGNMENT((#1299)); +#1301=STYLED_ITEM('',(#1300),#1298); +#1302=DIRECTION('',(0.E0,1.E0,0.E0)); +#1303=VECTOR('',#1302,2.8E0); +#1304=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.E-1)); +#1305=LINE('',#1304,#1303); +#1306=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1307=PRESENTATION_STYLE_ASSIGNMENT((#1306)); +#1308=STYLED_ITEM('',(#1307),#1305); +#1309=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1310=VECTOR('',#1309,3.5E-1); +#1311=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.E-1)); +#1312=LINE('',#1311,#1310); +#1313=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1314=PRESENTATION_STYLE_ASSIGNMENT((#1313)); +#1315=STYLED_ITEM('',(#1314),#1312); +#1316=CARTESIAN_POINT('',(-4.44E0,-4.309E1,-8.E-1)); +#1317=DIRECTION('',(0.E0,0.E0,1.E0)); +#1318=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1319=AXIS2_PLACEMENT_3D('',#1316,#1317,#1318); +#1321=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1322=PRESENTATION_STYLE_ASSIGNMENT((#1321)); +#1323=STYLED_ITEM('',(#1322),#1320); +#1324=CARTESIAN_POINT('',(-9.64E0,-2.992E1,-8.E-1)); +#1325=DIRECTION('',(0.E0,0.E0,1.E0)); +#1326=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1327=AXIS2_PLACEMENT_3D('',#1324,#1325,#1326); +#1329=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1330=PRESENTATION_STYLE_ASSIGNMENT((#1329)); +#1331=STYLED_ITEM('',(#1330),#1328); +#1332=CARTESIAN_POINT('',(-9.64E0,-2.201E1,-8.E-1)); +#1333=DIRECTION('',(0.E0,0.E0,1.E0)); +#1334=DIRECTION('',(0.E0,1.E0,0.E0)); +#1335=AXIS2_PLACEMENT_3D('',#1332,#1333,#1334); +#1337=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1338=PRESENTATION_STYLE_ASSIGNMENT((#1337)); +#1339=STYLED_ITEM('',(#1338),#1336); +#1340=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1341=VECTOR('',#1340,7.762518888096E0); +#1342=CARTESIAN_POINT('',(3.732518888096E0,-1.871E1,-8.E-1)); +#1343=LINE('',#1342,#1341); +#1344=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1345=PRESENTATION_STYLE_ASSIGNMENT((#1344)); +#1346=STYLED_ITEM('',(#1345),#1343); +#1347=CARTESIAN_POINT('',(8.01E0,-2.201E1,-8.E-1)); +#1348=DIRECTION('',(0.E0,0.E0,1.E0)); +#1349=DIRECTION('',(1.E0,0.E0,0.E0)); +#1350=AXIS2_PLACEMENT_3D('',#1347,#1348,#1349); +#1352=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1353=PRESENTATION_STYLE_ASSIGNMENT((#1352)); +#1354=STYLED_ITEM('',(#1353),#1351); +#1355=CARTESIAN_POINT('',(8.01E0,-2.992E1,-8.E-1)); +#1356=DIRECTION('',(0.E0,0.E0,1.E0)); +#1357=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1358=AXIS2_PLACEMENT_3D('',#1355,#1356,#1357); +#1360=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1361=PRESENTATION_STYLE_ASSIGNMENT((#1360)); +#1362=STYLED_ITEM('',(#1361),#1359); +#1363=CARTESIAN_POINT('',(4.46E0,-4.309E1,-8.E-1)); +#1364=DIRECTION('',(0.E0,0.E0,1.E0)); +#1365=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1366=AXIS2_PLACEMENT_3D('',#1363,#1364,#1365); +#1368=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1369=PRESENTATION_STYLE_ASSIGNMENT((#1368)); +#1370=STYLED_ITEM('',(#1369),#1367); +#1371=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1372=VECTOR('',#1371,2.E-2); +#1373=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.E-1)); +#1374=LINE('',#1373,#1372); +#1375=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1376=PRESENTATION_STYLE_ASSIGNMENT((#1375)); +#1377=STYLED_ITEM('',(#1376),#1374); +#1378=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1379=VECTOR('',#1378,2.E-2); +#1380=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.E-1)); +#1381=LINE('',#1380,#1379); +#1382=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1383=PRESENTATION_STYLE_ASSIGNMENT((#1382)); +#1384=STYLED_ITEM('',(#1383),#1381); +#1385=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1386=VECTOR('',#1385,2.E-2); +#1387=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.E-1)); +#1388=LINE('',#1387,#1386); +#1389=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1390=PRESENTATION_STYLE_ASSIGNMENT((#1389)); +#1391=STYLED_ITEM('',(#1390),#1388); +#1392=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1393=VECTOR('',#1392,2.E-2); +#1394=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.E-1)); +#1395=LINE('',#1394,#1393); +#1396=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1397=PRESENTATION_STYLE_ASSIGNMENT((#1396)); +#1398=STYLED_ITEM('',(#1397),#1395); +#1399=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1400=VECTOR('',#1399,2.8E0); +#1401=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.2E-1)); +#1402=LINE('',#1401,#1400); +#1403=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1404=PRESENTATION_STYLE_ASSIGNMENT((#1403)); +#1405=STYLED_ITEM('',(#1404),#1402); +#1406=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1407=VECTOR('',#1406,3.5E-1); +#1408=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.2E-1)); +#1409=LINE('',#1408,#1407); +#1410=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1411=PRESENTATION_STYLE_ASSIGNMENT((#1410)); +#1412=STYLED_ITEM('',(#1411),#1409); +#1413=DIRECTION('',(0.E0,1.E0,0.E0)); +#1414=VECTOR('',#1413,2.8E0); +#1415=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.2E-1)); +#1416=LINE('',#1415,#1414); +#1417=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1418=PRESENTATION_STYLE_ASSIGNMENT((#1417)); +#1419=STYLED_ITEM('',(#1418),#1416); +#1420=DIRECTION('',(1.E0,0.E0,0.E0)); +#1421=VECTOR('',#1420,3.5E-1); +#1422=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.2E-1)); +#1423=LINE('',#1422,#1421); +#1424=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1425=PRESENTATION_STYLE_ASSIGNMENT((#1424)); +#1426=STYLED_ITEM('',(#1425),#1423); +#1427=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1428=VECTOR('',#1427,2.E-2); +#1429=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.E-1)); +#1430=LINE('',#1429,#1428); +#1431=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1432=PRESENTATION_STYLE_ASSIGNMENT((#1431)); +#1433=STYLED_ITEM('',(#1432),#1430); +#1434=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1435=VECTOR('',#1434,2.E-2); +#1436=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.E-1)); +#1437=LINE('',#1436,#1435); +#1438=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1439=PRESENTATION_STYLE_ASSIGNMENT((#1438)); +#1440=STYLED_ITEM('',(#1439),#1437); +#1441=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1442=VECTOR('',#1441,2.E-2); +#1443=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.E-1)); +#1444=LINE('',#1443,#1442); +#1445=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1446=PRESENTATION_STYLE_ASSIGNMENT((#1445)); +#1447=STYLED_ITEM('',(#1446),#1444); +#1448=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1449=VECTOR('',#1448,2.E-2); +#1450=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.E-1)); +#1451=LINE('',#1450,#1449); +#1452=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1453=PRESENTATION_STYLE_ASSIGNMENT((#1452)); +#1454=STYLED_ITEM('',(#1453),#1451); +#1455=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1456=VECTOR('',#1455,2.8E0); +#1457=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.2E-1)); +#1458=LINE('',#1457,#1456); +#1459=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1460=PRESENTATION_STYLE_ASSIGNMENT((#1459)); +#1461=STYLED_ITEM('',(#1460),#1458); +#1462=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1463=VECTOR('',#1462,3.5E-1); +#1464=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.2E-1)); +#1465=LINE('',#1464,#1463); +#1466=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1467=PRESENTATION_STYLE_ASSIGNMENT((#1466)); +#1468=STYLED_ITEM('',(#1467),#1465); +#1469=DIRECTION('',(0.E0,1.E0,0.E0)); +#1470=VECTOR('',#1469,2.8E0); +#1471=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.2E-1)); +#1472=LINE('',#1471,#1470); +#1473=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1474=PRESENTATION_STYLE_ASSIGNMENT((#1473)); +#1475=STYLED_ITEM('',(#1474),#1472); +#1476=DIRECTION('',(1.E0,0.E0,0.E0)); +#1477=VECTOR('',#1476,3.5E-1); +#1478=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.2E-1)); +#1479=LINE('',#1478,#1477); +#1480=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1481=PRESENTATION_STYLE_ASSIGNMENT((#1480)); +#1482=STYLED_ITEM('',(#1481),#1479); +#1483=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1484=VECTOR('',#1483,2.E-2); +#1485=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.E-1)); +#1486=LINE('',#1485,#1484); +#1487=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1488=PRESENTATION_STYLE_ASSIGNMENT((#1487)); +#1489=STYLED_ITEM('',(#1488),#1486); +#1490=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1491=VECTOR('',#1490,2.E-2); +#1492=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.E-1)); +#1493=LINE('',#1492,#1491); +#1494=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1495=PRESENTATION_STYLE_ASSIGNMENT((#1494)); +#1496=STYLED_ITEM('',(#1495),#1493); +#1497=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1498=VECTOR('',#1497,2.E-2); +#1499=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.E-1)); +#1500=LINE('',#1499,#1498); +#1501=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1502=PRESENTATION_STYLE_ASSIGNMENT((#1501)); +#1503=STYLED_ITEM('',(#1502),#1500); +#1504=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1505=VECTOR('',#1504,2.E-2); +#1506=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.E-1)); +#1507=LINE('',#1506,#1505); +#1508=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1509=PRESENTATION_STYLE_ASSIGNMENT((#1508)); +#1510=STYLED_ITEM('',(#1509),#1507); +#1511=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1512=VECTOR('',#1511,2.8E0); +#1513=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.2E-1)); +#1514=LINE('',#1513,#1512); +#1515=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1516=PRESENTATION_STYLE_ASSIGNMENT((#1515)); +#1517=STYLED_ITEM('',(#1516),#1514); +#1518=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1519=VECTOR('',#1518,3.5E-1); +#1520=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.2E-1)); +#1521=LINE('',#1520,#1519); +#1522=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1523=PRESENTATION_STYLE_ASSIGNMENT((#1522)); +#1524=STYLED_ITEM('',(#1523),#1521); +#1525=DIRECTION('',(0.E0,1.E0,0.E0)); +#1526=VECTOR('',#1525,2.8E0); +#1527=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.2E-1)); +#1528=LINE('',#1527,#1526); +#1529=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1530=PRESENTATION_STYLE_ASSIGNMENT((#1529)); +#1531=STYLED_ITEM('',(#1530),#1528); +#1532=DIRECTION('',(1.E0,0.E0,0.E0)); +#1533=VECTOR('',#1532,3.5E-1); +#1534=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.2E-1)); +#1535=LINE('',#1534,#1533); +#1536=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1537=PRESENTATION_STYLE_ASSIGNMENT((#1536)); +#1538=STYLED_ITEM('',(#1537),#1535); +#1539=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1540=VECTOR('',#1539,2.E-2); +#1541=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.E-1)); +#1542=LINE('',#1541,#1540); +#1543=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1544=PRESENTATION_STYLE_ASSIGNMENT((#1543)); +#1545=STYLED_ITEM('',(#1544),#1542); +#1546=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1547=VECTOR('',#1546,2.E-2); +#1548=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.E-1)); +#1549=LINE('',#1548,#1547); +#1550=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1551=PRESENTATION_STYLE_ASSIGNMENT((#1550)); +#1552=STYLED_ITEM('',(#1551),#1549); +#1553=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1554=VECTOR('',#1553,2.E-2); +#1555=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.E-1)); +#1556=LINE('',#1555,#1554); +#1557=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1558=PRESENTATION_STYLE_ASSIGNMENT((#1557)); +#1559=STYLED_ITEM('',(#1558),#1556); +#1560=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1561=VECTOR('',#1560,2.E-2); +#1562=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.E-1)); +#1563=LINE('',#1562,#1561); +#1564=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1565=PRESENTATION_STYLE_ASSIGNMENT((#1564)); +#1566=STYLED_ITEM('',(#1565),#1563); +#1567=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1568=VECTOR('',#1567,2.8E0); +#1569=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.2E-1)); +#1570=LINE('',#1569,#1568); +#1571=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1572=PRESENTATION_STYLE_ASSIGNMENT((#1571)); +#1573=STYLED_ITEM('',(#1572),#1570); +#1574=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1575=VECTOR('',#1574,3.5E-1); +#1576=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.2E-1)); +#1577=LINE('',#1576,#1575); +#1578=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1579=PRESENTATION_STYLE_ASSIGNMENT((#1578)); +#1580=STYLED_ITEM('',(#1579),#1577); +#1581=DIRECTION('',(0.E0,1.E0,0.E0)); +#1582=VECTOR('',#1581,2.8E0); +#1583=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.2E-1)); +#1584=LINE('',#1583,#1582); +#1585=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1586=PRESENTATION_STYLE_ASSIGNMENT((#1585)); +#1587=STYLED_ITEM('',(#1586),#1584); +#1588=DIRECTION('',(1.E0,0.E0,0.E0)); +#1589=VECTOR('',#1588,3.5E-1); +#1590=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.2E-1)); +#1591=LINE('',#1590,#1589); +#1592=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1593=PRESENTATION_STYLE_ASSIGNMENT((#1592)); +#1594=STYLED_ITEM('',(#1593),#1591); +#1595=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1596=VECTOR('',#1595,2.E-2); +#1597=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.E-1)); +#1598=LINE('',#1597,#1596); +#1599=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1600=PRESENTATION_STYLE_ASSIGNMENT((#1599)); +#1601=STYLED_ITEM('',(#1600),#1598); +#1602=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1603=VECTOR('',#1602,2.E-2); +#1604=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.E-1)); +#1605=LINE('',#1604,#1603); +#1606=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1607=PRESENTATION_STYLE_ASSIGNMENT((#1606)); +#1608=STYLED_ITEM('',(#1607),#1605); +#1609=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1610=VECTOR('',#1609,2.E-2); +#1611=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.E-1)); +#1612=LINE('',#1611,#1610); +#1613=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1614=PRESENTATION_STYLE_ASSIGNMENT((#1613)); +#1615=STYLED_ITEM('',(#1614),#1612); +#1616=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1617=VECTOR('',#1616,2.E-2); +#1618=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.E-1)); +#1619=LINE('',#1618,#1617); +#1620=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1621=PRESENTATION_STYLE_ASSIGNMENT((#1620)); +#1622=STYLED_ITEM('',(#1621),#1619); +#1623=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1624=VECTOR('',#1623,2.8E0); +#1625=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.2E-1)); +#1626=LINE('',#1625,#1624); +#1627=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1628=PRESENTATION_STYLE_ASSIGNMENT((#1627)); +#1629=STYLED_ITEM('',(#1628),#1626); +#1630=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1631=VECTOR('',#1630,3.5E-1); +#1632=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.2E-1)); +#1633=LINE('',#1632,#1631); +#1634=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1635=PRESENTATION_STYLE_ASSIGNMENT((#1634)); +#1636=STYLED_ITEM('',(#1635),#1633); +#1637=DIRECTION('',(0.E0,1.E0,0.E0)); +#1638=VECTOR('',#1637,2.8E0); +#1639=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.2E-1)); +#1640=LINE('',#1639,#1638); +#1641=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1642=PRESENTATION_STYLE_ASSIGNMENT((#1641)); +#1643=STYLED_ITEM('',(#1642),#1640); +#1644=DIRECTION('',(1.E0,0.E0,0.E0)); +#1645=VECTOR('',#1644,3.5E-1); +#1646=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.2E-1)); +#1647=LINE('',#1646,#1645); +#1648=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1649=PRESENTATION_STYLE_ASSIGNMENT((#1648)); +#1650=STYLED_ITEM('',(#1649),#1647); +#1651=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1652=VECTOR('',#1651,2.E-2); +#1653=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.E-1)); +#1654=LINE('',#1653,#1652); +#1655=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1656=PRESENTATION_STYLE_ASSIGNMENT((#1655)); +#1657=STYLED_ITEM('',(#1656),#1654); +#1658=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1659=VECTOR('',#1658,2.E-2); +#1660=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.E-1)); +#1661=LINE('',#1660,#1659); +#1662=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1663=PRESENTATION_STYLE_ASSIGNMENT((#1662)); +#1664=STYLED_ITEM('',(#1663),#1661); +#1665=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1666=VECTOR('',#1665,2.E-2); +#1667=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.E-1)); +#1668=LINE('',#1667,#1666); +#1669=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1670=PRESENTATION_STYLE_ASSIGNMENT((#1669)); +#1671=STYLED_ITEM('',(#1670),#1668); +#1672=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1673=VECTOR('',#1672,2.E-2); +#1674=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.E-1)); +#1675=LINE('',#1674,#1673); +#1676=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1677=PRESENTATION_STYLE_ASSIGNMENT((#1676)); +#1678=STYLED_ITEM('',(#1677),#1675); +#1679=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1680=VECTOR('',#1679,2.8E0); +#1681=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.2E-1)); +#1682=LINE('',#1681,#1680); +#1683=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1684=PRESENTATION_STYLE_ASSIGNMENT((#1683)); +#1685=STYLED_ITEM('',(#1684),#1682); +#1686=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1687=VECTOR('',#1686,3.5E-1); +#1688=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.2E-1)); +#1689=LINE('',#1688,#1687); +#1690=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1691=PRESENTATION_STYLE_ASSIGNMENT((#1690)); +#1692=STYLED_ITEM('',(#1691),#1689); +#1693=DIRECTION('',(0.E0,1.E0,0.E0)); +#1694=VECTOR('',#1693,2.8E0); +#1695=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.2E-1)); +#1696=LINE('',#1695,#1694); +#1697=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1698=PRESENTATION_STYLE_ASSIGNMENT((#1697)); +#1699=STYLED_ITEM('',(#1698),#1696); +#1700=DIRECTION('',(1.E0,0.E0,0.E0)); +#1701=VECTOR('',#1700,3.5E-1); +#1702=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.2E-1)); +#1703=LINE('',#1702,#1701); +#1704=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1705=PRESENTATION_STYLE_ASSIGNMENT((#1704)); +#1706=STYLED_ITEM('',(#1705),#1703); +#1707=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1708=VECTOR('',#1707,2.E-2); +#1709=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.E-1)); +#1710=LINE('',#1709,#1708); +#1711=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1712=PRESENTATION_STYLE_ASSIGNMENT((#1711)); +#1713=STYLED_ITEM('',(#1712),#1710); +#1714=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1715=VECTOR('',#1714,2.E-2); +#1716=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.E-1)); +#1717=LINE('',#1716,#1715); +#1718=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1719=PRESENTATION_STYLE_ASSIGNMENT((#1718)); +#1720=STYLED_ITEM('',(#1719),#1717); +#1721=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1722=VECTOR('',#1721,2.E-2); +#1723=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.E-1)); +#1724=LINE('',#1723,#1722); +#1725=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1726=PRESENTATION_STYLE_ASSIGNMENT((#1725)); +#1727=STYLED_ITEM('',(#1726),#1724); +#1728=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1729=VECTOR('',#1728,2.E-2); +#1730=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.E-1)); +#1731=LINE('',#1730,#1729); +#1732=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1733=PRESENTATION_STYLE_ASSIGNMENT((#1732)); +#1734=STYLED_ITEM('',(#1733),#1731); +#1735=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1736=VECTOR('',#1735,2.8E0); +#1737=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.2E-1)); +#1738=LINE('',#1737,#1736); +#1739=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1740=PRESENTATION_STYLE_ASSIGNMENT((#1739)); +#1741=STYLED_ITEM('',(#1740),#1738); +#1742=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1743=VECTOR('',#1742,3.5E-1); +#1744=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.2E-1)); +#1745=LINE('',#1744,#1743); +#1746=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1747=PRESENTATION_STYLE_ASSIGNMENT((#1746)); +#1748=STYLED_ITEM('',(#1747),#1745); +#1749=DIRECTION('',(0.E0,1.E0,0.E0)); +#1750=VECTOR('',#1749,2.8E0); +#1751=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.2E-1)); +#1752=LINE('',#1751,#1750); +#1753=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1754=PRESENTATION_STYLE_ASSIGNMENT((#1753)); +#1755=STYLED_ITEM('',(#1754),#1752); +#1756=DIRECTION('',(1.E0,0.E0,0.E0)); +#1757=VECTOR('',#1756,3.5E-1); +#1758=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.2E-1)); +#1759=LINE('',#1758,#1757); +#1760=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1761=PRESENTATION_STYLE_ASSIGNMENT((#1760)); +#1762=STYLED_ITEM('',(#1761),#1759); +#1763=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1764=VECTOR('',#1763,2.E-2); +#1765=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.E-1)); +#1766=LINE('',#1765,#1764); +#1767=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1768=PRESENTATION_STYLE_ASSIGNMENT((#1767)); +#1769=STYLED_ITEM('',(#1768),#1766); +#1770=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1771=VECTOR('',#1770,2.E-2); +#1772=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.E-1)); +#1773=LINE('',#1772,#1771); +#1774=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1775=PRESENTATION_STYLE_ASSIGNMENT((#1774)); +#1776=STYLED_ITEM('',(#1775),#1773); +#1777=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1778=VECTOR('',#1777,2.E-2); +#1779=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.E-1)); +#1780=LINE('',#1779,#1778); +#1781=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1782=PRESENTATION_STYLE_ASSIGNMENT((#1781)); +#1783=STYLED_ITEM('',(#1782),#1780); +#1784=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1785=VECTOR('',#1784,2.E-2); +#1786=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.E-1)); +#1787=LINE('',#1786,#1785); +#1788=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1789=PRESENTATION_STYLE_ASSIGNMENT((#1788)); +#1790=STYLED_ITEM('',(#1789),#1787); +#1791=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1792=VECTOR('',#1791,2.8E0); +#1793=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.2E-1)); +#1794=LINE('',#1793,#1792); +#1795=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1796=PRESENTATION_STYLE_ASSIGNMENT((#1795)); +#1797=STYLED_ITEM('',(#1796),#1794); +#1798=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1799=VECTOR('',#1798,3.5E-1); +#1800=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.2E-1)); +#1801=LINE('',#1800,#1799); +#1802=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1803=PRESENTATION_STYLE_ASSIGNMENT((#1802)); +#1804=STYLED_ITEM('',(#1803),#1801); +#1805=DIRECTION('',(0.E0,1.E0,0.E0)); +#1806=VECTOR('',#1805,2.8E0); +#1807=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.2E-1)); +#1808=LINE('',#1807,#1806); +#1809=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1810=PRESENTATION_STYLE_ASSIGNMENT((#1809)); +#1811=STYLED_ITEM('',(#1810),#1808); +#1812=DIRECTION('',(1.E0,0.E0,0.E0)); +#1813=VECTOR('',#1812,3.5E-1); +#1814=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.2E-1)); +#1815=LINE('',#1814,#1813); +#1816=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1817=PRESENTATION_STYLE_ASSIGNMENT((#1816)); +#1818=STYLED_ITEM('',(#1817),#1815); +#1819=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1820=VECTOR('',#1819,2.E-2); +#1821=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.E-1)); +#1822=LINE('',#1821,#1820); +#1823=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1824=PRESENTATION_STYLE_ASSIGNMENT((#1823)); +#1825=STYLED_ITEM('',(#1824),#1822); +#1826=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1827=VECTOR('',#1826,2.E-2); +#1828=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.E-1)); +#1829=LINE('',#1828,#1827); +#1830=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1831=PRESENTATION_STYLE_ASSIGNMENT((#1830)); +#1832=STYLED_ITEM('',(#1831),#1829); +#1833=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1834=VECTOR('',#1833,2.E-2); +#1835=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.E-1)); +#1836=LINE('',#1835,#1834); +#1837=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1838=PRESENTATION_STYLE_ASSIGNMENT((#1837)); +#1839=STYLED_ITEM('',(#1838),#1836); +#1840=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1841=VECTOR('',#1840,2.E-2); +#1842=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.E-1)); +#1843=LINE('',#1842,#1841); +#1844=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1845=PRESENTATION_STYLE_ASSIGNMENT((#1844)); +#1846=STYLED_ITEM('',(#1845),#1843); +#1847=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1848=VECTOR('',#1847,2.8E0); +#1849=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.2E-1)); +#1850=LINE('',#1849,#1848); +#1851=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1852=PRESENTATION_STYLE_ASSIGNMENT((#1851)); +#1853=STYLED_ITEM('',(#1852),#1850); +#1854=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1855=VECTOR('',#1854,3.5E-1); +#1856=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.2E-1)); +#1857=LINE('',#1856,#1855); +#1858=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1859=PRESENTATION_STYLE_ASSIGNMENT((#1858)); +#1860=STYLED_ITEM('',(#1859),#1857); +#1861=DIRECTION('',(0.E0,1.E0,0.E0)); +#1862=VECTOR('',#1861,2.8E0); +#1863=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.2E-1)); +#1864=LINE('',#1863,#1862); +#1865=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1866=PRESENTATION_STYLE_ASSIGNMENT((#1865)); +#1867=STYLED_ITEM('',(#1866),#1864); +#1868=DIRECTION('',(1.E0,0.E0,0.E0)); +#1869=VECTOR('',#1868,3.5E-1); +#1870=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.2E-1)); +#1871=LINE('',#1870,#1869); +#1872=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1873=PRESENTATION_STYLE_ASSIGNMENT((#1872)); +#1874=STYLED_ITEM('',(#1873),#1871); +#1875=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1876=VECTOR('',#1875,2.E-2); +#1877=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.E-1)); +#1878=LINE('',#1877,#1876); +#1879=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1880=PRESENTATION_STYLE_ASSIGNMENT((#1879)); +#1881=STYLED_ITEM('',(#1880),#1878); +#1882=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1883=VECTOR('',#1882,2.E-2); +#1884=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.E-1)); +#1885=LINE('',#1884,#1883); +#1886=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1887=PRESENTATION_STYLE_ASSIGNMENT((#1886)); +#1888=STYLED_ITEM('',(#1887),#1885); +#1889=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1890=VECTOR('',#1889,2.E-2); +#1891=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.E-1)); +#1892=LINE('',#1891,#1890); +#1893=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1894=PRESENTATION_STYLE_ASSIGNMENT((#1893)); +#1895=STYLED_ITEM('',(#1894),#1892); +#1896=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1897=VECTOR('',#1896,2.E-2); +#1898=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.E-1)); +#1899=LINE('',#1898,#1897); +#1900=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1901=PRESENTATION_STYLE_ASSIGNMENT((#1900)); +#1902=STYLED_ITEM('',(#1901),#1899); +#1903=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1904=VECTOR('',#1903,2.8E0); +#1905=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.2E-1)); +#1906=LINE('',#1905,#1904); +#1907=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1908=PRESENTATION_STYLE_ASSIGNMENT((#1907)); +#1909=STYLED_ITEM('',(#1908),#1906); +#1910=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1911=VECTOR('',#1910,3.5E-1); +#1912=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.2E-1)); +#1913=LINE('',#1912,#1911); +#1914=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1915=PRESENTATION_STYLE_ASSIGNMENT((#1914)); +#1916=STYLED_ITEM('',(#1915),#1913); +#1917=DIRECTION('',(0.E0,1.E0,0.E0)); +#1918=VECTOR('',#1917,2.8E0); +#1919=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.2E-1)); +#1920=LINE('',#1919,#1918); +#1921=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1922=PRESENTATION_STYLE_ASSIGNMENT((#1921)); +#1923=STYLED_ITEM('',(#1922),#1920); +#1924=DIRECTION('',(1.E0,0.E0,0.E0)); +#1925=VECTOR('',#1924,3.5E-1); +#1926=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.2E-1)); +#1927=LINE('',#1926,#1925); +#1928=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1929=PRESENTATION_STYLE_ASSIGNMENT((#1928)); +#1930=STYLED_ITEM('',(#1929),#1927); +#1931=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1932=VECTOR('',#1931,2.E-2); +#1933=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.E-1)); +#1934=LINE('',#1933,#1932); +#1935=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1936=PRESENTATION_STYLE_ASSIGNMENT((#1935)); +#1937=STYLED_ITEM('',(#1936),#1934); +#1938=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1939=VECTOR('',#1938,2.E-2); +#1940=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.E-1)); +#1941=LINE('',#1940,#1939); +#1942=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1943=PRESENTATION_STYLE_ASSIGNMENT((#1942)); +#1944=STYLED_ITEM('',(#1943),#1941); +#1945=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1946=VECTOR('',#1945,2.E-2); +#1947=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.E-1)); +#1948=LINE('',#1947,#1946); +#1949=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1950=PRESENTATION_STYLE_ASSIGNMENT((#1949)); +#1951=STYLED_ITEM('',(#1950),#1948); +#1952=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1953=VECTOR('',#1952,2.E-2); +#1954=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.E-1)); +#1955=LINE('',#1954,#1953); +#1956=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1957=PRESENTATION_STYLE_ASSIGNMENT((#1956)); +#1958=STYLED_ITEM('',(#1957),#1955); +#1959=DIRECTION('',(0.E0,-1.E0,0.E0)); +#1960=VECTOR('',#1959,2.8E0); +#1961=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.2E-1)); +#1962=LINE('',#1961,#1960); +#1963=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1964=PRESENTATION_STYLE_ASSIGNMENT((#1963)); +#1965=STYLED_ITEM('',(#1964),#1962); +#1966=DIRECTION('',(-1.E0,0.E0,0.E0)); +#1967=VECTOR('',#1966,3.5E-1); +#1968=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.2E-1)); +#1969=LINE('',#1968,#1967); +#1970=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1971=PRESENTATION_STYLE_ASSIGNMENT((#1970)); +#1972=STYLED_ITEM('',(#1971),#1969); +#1973=DIRECTION('',(0.E0,1.E0,0.E0)); +#1974=VECTOR('',#1973,2.8E0); +#1975=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.2E-1)); +#1976=LINE('',#1975,#1974); +#1977=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1978=PRESENTATION_STYLE_ASSIGNMENT((#1977)); +#1979=STYLED_ITEM('',(#1978),#1976); +#1980=DIRECTION('',(1.E0,0.E0,0.E0)); +#1981=VECTOR('',#1980,3.5E-1); +#1982=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.2E-1)); +#1983=LINE('',#1982,#1981); +#1984=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1985=PRESENTATION_STYLE_ASSIGNMENT((#1984)); +#1986=STYLED_ITEM('',(#1985),#1983); +#1987=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1988=VECTOR('',#1987,2.E-2); +#1989=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.E-1)); +#1990=LINE('',#1989,#1988); +#1991=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1992=PRESENTATION_STYLE_ASSIGNMENT((#1991)); +#1993=STYLED_ITEM('',(#1992),#1990); +#1994=DIRECTION('',(0.E0,0.E0,-1.E0)); +#1995=VECTOR('',#1994,2.E-2); +#1996=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.E-1)); +#1997=LINE('',#1996,#1995); +#1998=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#1999=PRESENTATION_STYLE_ASSIGNMENT((#1998)); +#2000=STYLED_ITEM('',(#1999),#1997); +#2001=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2002=VECTOR('',#2001,2.E-2); +#2003=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.E-1)); +#2004=LINE('',#2003,#2002); +#2005=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2006=PRESENTATION_STYLE_ASSIGNMENT((#2005)); +#2007=STYLED_ITEM('',(#2006),#2004); +#2008=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2009=VECTOR('',#2008,2.E-2); +#2010=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.E-1)); +#2011=LINE('',#2010,#2009); +#2012=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2013=PRESENTATION_STYLE_ASSIGNMENT((#2012)); +#2014=STYLED_ITEM('',(#2013),#2011); +#2015=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2016=VECTOR('',#2015,2.8E0); +#2017=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.2E-1)); +#2018=LINE('',#2017,#2016); +#2019=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2020=PRESENTATION_STYLE_ASSIGNMENT((#2019)); +#2021=STYLED_ITEM('',(#2020),#2018); +#2022=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2023=VECTOR('',#2022,3.5E-1); +#2024=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.2E-1)); +#2025=LINE('',#2024,#2023); +#2026=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2027=PRESENTATION_STYLE_ASSIGNMENT((#2026)); +#2028=STYLED_ITEM('',(#2027),#2025); +#2029=DIRECTION('',(0.E0,1.E0,0.E0)); +#2030=VECTOR('',#2029,2.8E0); +#2031=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.2E-1)); +#2032=LINE('',#2031,#2030); +#2033=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2034=PRESENTATION_STYLE_ASSIGNMENT((#2033)); +#2035=STYLED_ITEM('',(#2034),#2032); +#2036=DIRECTION('',(1.E0,0.E0,0.E0)); +#2037=VECTOR('',#2036,3.5E-1); +#2038=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.2E-1)); +#2039=LINE('',#2038,#2037); +#2040=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2041=PRESENTATION_STYLE_ASSIGNMENT((#2040)); +#2042=STYLED_ITEM('',(#2041),#2039); +#2043=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2044=VECTOR('',#2043,2.E-2); +#2045=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.E-1)); +#2046=LINE('',#2045,#2044); +#2047=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2048=PRESENTATION_STYLE_ASSIGNMENT((#2047)); +#2049=STYLED_ITEM('',(#2048),#2046); +#2050=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2051=VECTOR('',#2050,2.E-2); +#2052=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.E-1)); +#2053=LINE('',#2052,#2051); +#2054=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2055=PRESENTATION_STYLE_ASSIGNMENT((#2054)); +#2056=STYLED_ITEM('',(#2055),#2053); +#2057=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2058=VECTOR('',#2057,2.E-2); +#2059=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.E-1)); +#2060=LINE('',#2059,#2058); +#2061=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2062=PRESENTATION_STYLE_ASSIGNMENT((#2061)); +#2063=STYLED_ITEM('',(#2062),#2060); +#2064=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2065=VECTOR('',#2064,2.E-2); +#2066=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.E-1)); +#2067=LINE('',#2066,#2065); +#2068=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2069=PRESENTATION_STYLE_ASSIGNMENT((#2068)); +#2070=STYLED_ITEM('',(#2069),#2067); +#2071=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2072=VECTOR('',#2071,2.8E0); +#2073=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.2E-1)); +#2074=LINE('',#2073,#2072); +#2075=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2076=PRESENTATION_STYLE_ASSIGNMENT((#2075)); +#2077=STYLED_ITEM('',(#2076),#2074); +#2078=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2079=VECTOR('',#2078,3.5E-1); +#2080=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.2E-1)); +#2081=LINE('',#2080,#2079); +#2082=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2083=PRESENTATION_STYLE_ASSIGNMENT((#2082)); +#2084=STYLED_ITEM('',(#2083),#2081); +#2085=DIRECTION('',(0.E0,1.E0,0.E0)); +#2086=VECTOR('',#2085,2.8E0); +#2087=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.2E-1)); +#2088=LINE('',#2087,#2086); +#2089=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2090=PRESENTATION_STYLE_ASSIGNMENT((#2089)); +#2091=STYLED_ITEM('',(#2090),#2088); +#2092=DIRECTION('',(1.E0,0.E0,0.E0)); +#2093=VECTOR('',#2092,3.5E-1); +#2094=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.2E-1)); +#2095=LINE('',#2094,#2093); +#2096=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2097=PRESENTATION_STYLE_ASSIGNMENT((#2096)); +#2098=STYLED_ITEM('',(#2097),#2095); +#2099=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2100=VECTOR('',#2099,2.E-2); +#2101=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.E-1)); +#2102=LINE('',#2101,#2100); +#2103=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2104=PRESENTATION_STYLE_ASSIGNMENT((#2103)); +#2105=STYLED_ITEM('',(#2104),#2102); +#2106=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2107=VECTOR('',#2106,2.E-2); +#2108=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.E-1)); +#2109=LINE('',#2108,#2107); +#2110=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2111=PRESENTATION_STYLE_ASSIGNMENT((#2110)); +#2112=STYLED_ITEM('',(#2111),#2109); +#2113=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2114=VECTOR('',#2113,2.E-2); +#2115=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.E-1)); +#2116=LINE('',#2115,#2114); +#2117=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2118=PRESENTATION_STYLE_ASSIGNMENT((#2117)); +#2119=STYLED_ITEM('',(#2118),#2116); +#2120=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2121=VECTOR('',#2120,2.E-2); +#2122=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.E-1)); +#2123=LINE('',#2122,#2121); +#2124=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2125=PRESENTATION_STYLE_ASSIGNMENT((#2124)); +#2126=STYLED_ITEM('',(#2125),#2123); +#2127=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2128=VECTOR('',#2127,2.8E0); +#2129=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.2E-1)); +#2130=LINE('',#2129,#2128); +#2131=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2132=PRESENTATION_STYLE_ASSIGNMENT((#2131)); +#2133=STYLED_ITEM('',(#2132),#2130); +#2134=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2135=VECTOR('',#2134,3.5E-1); +#2136=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.2E-1)); +#2137=LINE('',#2136,#2135); +#2138=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2139=PRESENTATION_STYLE_ASSIGNMENT((#2138)); +#2140=STYLED_ITEM('',(#2139),#2137); +#2141=DIRECTION('',(0.E0,1.E0,0.E0)); +#2142=VECTOR('',#2141,2.8E0); +#2143=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.2E-1)); +#2144=LINE('',#2143,#2142); +#2145=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2146=PRESENTATION_STYLE_ASSIGNMENT((#2145)); +#2147=STYLED_ITEM('',(#2146),#2144); +#2148=DIRECTION('',(1.E0,0.E0,0.E0)); +#2149=VECTOR('',#2148,3.5E-1); +#2150=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.2E-1)); +#2151=LINE('',#2150,#2149); +#2152=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2153=PRESENTATION_STYLE_ASSIGNMENT((#2152)); +#2154=STYLED_ITEM('',(#2153),#2151); +#2155=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2156=VECTOR('',#2155,2.E-2); +#2157=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.E-1)); +#2158=LINE('',#2157,#2156); +#2159=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2160=PRESENTATION_STYLE_ASSIGNMENT((#2159)); +#2161=STYLED_ITEM('',(#2160),#2158); +#2162=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2163=VECTOR('',#2162,2.E-2); +#2164=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.E-1)); +#2165=LINE('',#2164,#2163); +#2166=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2167=PRESENTATION_STYLE_ASSIGNMENT((#2166)); +#2168=STYLED_ITEM('',(#2167),#2165); +#2169=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2170=VECTOR('',#2169,2.E-2); +#2171=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.E-1)); +#2172=LINE('',#2171,#2170); +#2173=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2174=PRESENTATION_STYLE_ASSIGNMENT((#2173)); +#2175=STYLED_ITEM('',(#2174),#2172); +#2176=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2177=VECTOR('',#2176,2.E-2); +#2178=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.E-1)); +#2179=LINE('',#2178,#2177); +#2180=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2181=PRESENTATION_STYLE_ASSIGNMENT((#2180)); +#2182=STYLED_ITEM('',(#2181),#2179); +#2183=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2184=VECTOR('',#2183,2.8E0); +#2185=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.2E-1)); +#2186=LINE('',#2185,#2184); +#2187=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2188=PRESENTATION_STYLE_ASSIGNMENT((#2187)); +#2189=STYLED_ITEM('',(#2188),#2186); +#2190=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2191=VECTOR('',#2190,3.5E-1); +#2192=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.2E-1)); +#2193=LINE('',#2192,#2191); +#2194=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2195=PRESENTATION_STYLE_ASSIGNMENT((#2194)); +#2196=STYLED_ITEM('',(#2195),#2193); +#2197=DIRECTION('',(0.E0,1.E0,0.E0)); +#2198=VECTOR('',#2197,2.8E0); +#2199=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.2E-1)); +#2200=LINE('',#2199,#2198); +#2201=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2202=PRESENTATION_STYLE_ASSIGNMENT((#2201)); +#2203=STYLED_ITEM('',(#2202),#2200); +#2204=DIRECTION('',(1.E0,0.E0,0.E0)); +#2205=VECTOR('',#2204,3.5E-1); +#2206=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.2E-1)); +#2207=LINE('',#2206,#2205); +#2208=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2209=PRESENTATION_STYLE_ASSIGNMENT((#2208)); +#2210=STYLED_ITEM('',(#2209),#2207); +#2211=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2212=VECTOR('',#2211,2.E-2); +#2213=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.E-1)); +#2214=LINE('',#2213,#2212); +#2215=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2216=PRESENTATION_STYLE_ASSIGNMENT((#2215)); +#2217=STYLED_ITEM('',(#2216),#2214); +#2218=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2219=VECTOR('',#2218,2.E-2); +#2220=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.E-1)); +#2221=LINE('',#2220,#2219); +#2222=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2223=PRESENTATION_STYLE_ASSIGNMENT((#2222)); +#2224=STYLED_ITEM('',(#2223),#2221); +#2225=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2226=VECTOR('',#2225,2.E-2); +#2227=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.E-1)); +#2228=LINE('',#2227,#2226); +#2229=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2230=PRESENTATION_STYLE_ASSIGNMENT((#2229)); +#2231=STYLED_ITEM('',(#2230),#2228); +#2232=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2233=VECTOR('',#2232,2.E-2); +#2234=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.E-1)); +#2235=LINE('',#2234,#2233); +#2236=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2237=PRESENTATION_STYLE_ASSIGNMENT((#2236)); +#2238=STYLED_ITEM('',(#2237),#2235); +#2239=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2240=VECTOR('',#2239,2.8E0); +#2241=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.2E-1)); +#2242=LINE('',#2241,#2240); +#2243=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2244=PRESENTATION_STYLE_ASSIGNMENT((#2243)); +#2245=STYLED_ITEM('',(#2244),#2242); +#2246=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2247=VECTOR('',#2246,3.5E-1); +#2248=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.2E-1)); +#2249=LINE('',#2248,#2247); +#2250=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2251=PRESENTATION_STYLE_ASSIGNMENT((#2250)); +#2252=STYLED_ITEM('',(#2251),#2249); +#2253=DIRECTION('',(0.E0,1.E0,0.E0)); +#2254=VECTOR('',#2253,2.8E0); +#2255=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.2E-1)); +#2256=LINE('',#2255,#2254); +#2257=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2258=PRESENTATION_STYLE_ASSIGNMENT((#2257)); +#2259=STYLED_ITEM('',(#2258),#2256); +#2260=DIRECTION('',(1.E0,0.E0,0.E0)); +#2261=VECTOR('',#2260,3.5E-1); +#2262=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.2E-1)); +#2263=LINE('',#2262,#2261); +#2264=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2265=PRESENTATION_STYLE_ASSIGNMENT((#2264)); +#2266=STYLED_ITEM('',(#2265),#2263); +#2267=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2268=VECTOR('',#2267,2.E-2); +#2269=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.E-1)); +#2270=LINE('',#2269,#2268); +#2271=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2272=PRESENTATION_STYLE_ASSIGNMENT((#2271)); +#2273=STYLED_ITEM('',(#2272),#2270); +#2274=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2275=VECTOR('',#2274,2.E-2); +#2276=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.E-1)); +#2277=LINE('',#2276,#2275); +#2278=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2279=PRESENTATION_STYLE_ASSIGNMENT((#2278)); +#2280=STYLED_ITEM('',(#2279),#2277); +#2281=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2282=VECTOR('',#2281,2.E-2); +#2283=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.E-1)); +#2284=LINE('',#2283,#2282); +#2285=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2286=PRESENTATION_STYLE_ASSIGNMENT((#2285)); +#2287=STYLED_ITEM('',(#2286),#2284); +#2288=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2289=VECTOR('',#2288,2.E-2); +#2290=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.E-1)); +#2291=LINE('',#2290,#2289); +#2292=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2293=PRESENTATION_STYLE_ASSIGNMENT((#2292)); +#2294=STYLED_ITEM('',(#2293),#2291); +#2295=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2296=VECTOR('',#2295,2.8E0); +#2297=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.2E-1)); +#2298=LINE('',#2297,#2296); +#2299=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2300=PRESENTATION_STYLE_ASSIGNMENT((#2299)); +#2301=STYLED_ITEM('',(#2300),#2298); +#2302=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2303=VECTOR('',#2302,3.5E-1); +#2304=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.2E-1)); +#2305=LINE('',#2304,#2303); +#2306=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2307=PRESENTATION_STYLE_ASSIGNMENT((#2306)); +#2308=STYLED_ITEM('',(#2307),#2305); +#2309=DIRECTION('',(0.E0,1.E0,0.E0)); +#2310=VECTOR('',#2309,2.8E0); +#2311=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.2E-1)); +#2312=LINE('',#2311,#2310); +#2313=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2314=PRESENTATION_STYLE_ASSIGNMENT((#2313)); +#2315=STYLED_ITEM('',(#2314),#2312); +#2316=DIRECTION('',(1.E0,0.E0,0.E0)); +#2317=VECTOR('',#2316,3.5E-1); +#2318=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.2E-1)); +#2319=LINE('',#2318,#2317); +#2320=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2321=PRESENTATION_STYLE_ASSIGNMENT((#2320)); +#2322=STYLED_ITEM('',(#2321),#2319); +#2323=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2324=VECTOR('',#2323,2.E-2); +#2325=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.E-1)); +#2326=LINE('',#2325,#2324); +#2327=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2328=PRESENTATION_STYLE_ASSIGNMENT((#2327)); +#2329=STYLED_ITEM('',(#2328),#2326); +#2330=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2331=VECTOR('',#2330,2.E-2); +#2332=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.E-1)); +#2333=LINE('',#2332,#2331); +#2334=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2335=PRESENTATION_STYLE_ASSIGNMENT((#2334)); +#2336=STYLED_ITEM('',(#2335),#2333); +#2337=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2338=VECTOR('',#2337,2.E-2); +#2339=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.E-1)); +#2340=LINE('',#2339,#2338); +#2341=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2342=PRESENTATION_STYLE_ASSIGNMENT((#2341)); +#2343=STYLED_ITEM('',(#2342),#2340); +#2344=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2345=VECTOR('',#2344,2.E-2); +#2346=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.E-1)); +#2347=LINE('',#2346,#2345); +#2348=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2349=PRESENTATION_STYLE_ASSIGNMENT((#2348)); +#2350=STYLED_ITEM('',(#2349),#2347); +#2351=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2352=VECTOR('',#2351,2.8E0); +#2353=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.2E-1)); +#2354=LINE('',#2353,#2352); +#2355=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2356=PRESENTATION_STYLE_ASSIGNMENT((#2355)); +#2357=STYLED_ITEM('',(#2356),#2354); +#2358=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2359=VECTOR('',#2358,3.5E-1); +#2360=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.2E-1)); +#2361=LINE('',#2360,#2359); +#2362=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2363=PRESENTATION_STYLE_ASSIGNMENT((#2362)); +#2364=STYLED_ITEM('',(#2363),#2361); +#2365=DIRECTION('',(0.E0,1.E0,0.E0)); +#2366=VECTOR('',#2365,2.8E0); +#2367=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.2E-1)); +#2368=LINE('',#2367,#2366); +#2369=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2370=PRESENTATION_STYLE_ASSIGNMENT((#2369)); +#2371=STYLED_ITEM('',(#2370),#2368); +#2372=DIRECTION('',(1.E0,0.E0,0.E0)); +#2373=VECTOR('',#2372,3.5E-1); +#2374=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.2E-1)); +#2375=LINE('',#2374,#2373); +#2376=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2377=PRESENTATION_STYLE_ASSIGNMENT((#2376)); +#2378=STYLED_ITEM('',(#2377),#2375); +#2379=CARTESIAN_POINT('',(-5.74E0,-3.192E1,-9.7E-1)); +#2380=DIRECTION('',(0.E0,0.E0,1.E0)); +#2381=DIRECTION('',(1.E0,0.E0,0.E0)); +#2382=AXIS2_PLACEMENT_3D('',#2379,#2380,#2381); +#2384=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2385=PRESENTATION_STYLE_ASSIGNMENT((#2384)); +#2386=STYLED_ITEM('',(#2385),#2383); +#2387=CARTESIAN_POINT('',(-5.74E0,-3.192E1,-8.E-1)); +#2388=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2389=DIRECTION('',(0.E0,1.E0,0.E0)); +#2390=AXIS2_PLACEMENT_3D('',#2387,#2388,#2389); +#2392=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2393=PRESENTATION_STYLE_ASSIGNMENT((#2392)); +#2394=STYLED_ITEM('',(#2393),#2391); +#2395=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2396=VECTOR('',#2395,1.7E-1); +#2397=CARTESIAN_POINT('',(-9.64E0,-3.092E1,-8.E-1)); +#2398=LINE('',#2397,#2396); +#2399=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2400=PRESENTATION_STYLE_ASSIGNMENT((#2399)); +#2401=STYLED_ITEM('',(#2400),#2398); +#2402=DIRECTION('',(1.E0,0.E0,0.E0)); +#2403=VECTOR('',#2402,3.9E0); +#2404=CARTESIAN_POINT('',(-9.64E0,-3.092E1,-8.E-1)); +#2405=LINE('',#2404,#2403); +#2406=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2407=PRESENTATION_STYLE_ASSIGNMENT((#2406)); +#2408=STYLED_ITEM('',(#2407),#2405); +#2409=DIRECTION('',(0.E0,0.E0,1.E0)); +#2410=VECTOR('',#2409,1.7E-1); +#2411=CARTESIAN_POINT('',(-5.74E0,-3.092E1,-9.7E-1)); +#2412=LINE('',#2411,#2410); +#2413=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2414=PRESENTATION_STYLE_ASSIGNMENT((#2413)); +#2415=STYLED_ITEM('',(#2414),#2412); +#2416=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2417=VECTOR('',#2416,1.7E-1); +#2418=CARTESIAN_POINT('',(-1.064E1,-2.201E1,-8.E-1)); +#2419=LINE('',#2418,#2417); +#2420=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2421=PRESENTATION_STYLE_ASSIGNMENT((#2420)); +#2422=STYLED_ITEM('',(#2421),#2419); +#2423=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2424=VECTOR('',#2423,7.91E0); +#2425=CARTESIAN_POINT('',(-1.064E1,-2.201E1,-8.E-1)); +#2426=LINE('',#2425,#2424); +#2427=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2428=PRESENTATION_STYLE_ASSIGNMENT((#2427)); +#2429=STYLED_ITEM('',(#2428),#2426); +#2430=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2431=VECTOR('',#2430,1.7E-1); +#2432=CARTESIAN_POINT('',(-1.064E1,-2.992E1,-8.E-1)); +#2433=LINE('',#2432,#2431); +#2434=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2435=PRESENTATION_STYLE_ASSIGNMENT((#2434)); +#2436=STYLED_ITEM('',(#2435),#2433); +#2437=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2438=VECTOR('',#2437,1.7E-1); +#2439=CARTESIAN_POINT('',(-9.64E0,-2.101E1,-8.E-1)); +#2440=LINE('',#2439,#2438); +#2441=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2442=PRESENTATION_STYLE_ASSIGNMENT((#2441)); +#2443=STYLED_ITEM('',(#2442),#2440); +#2444=DIRECTION('',(0.E0,0.E0,1.E0)); +#2445=VECTOR('',#2444,1.7E-1); +#2446=CARTESIAN_POINT('',(-4.53E0,-2.101E1,-9.7E-1)); +#2447=LINE('',#2446,#2445); +#2448=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2449=PRESENTATION_STYLE_ASSIGNMENT((#2448)); +#2450=STYLED_ITEM('',(#2449),#2447); +#2451=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2452=VECTOR('',#2451,5.11E0); +#2453=CARTESIAN_POINT('',(-4.53E0,-2.101E1,-8.E-1)); +#2454=LINE('',#2453,#2452); +#2455=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2456=PRESENTATION_STYLE_ASSIGNMENT((#2455)); +#2457=STYLED_ITEM('',(#2456),#2454); +#2458=CARTESIAN_POINT('',(-4.53E0,-2.051E1,-9.7E-1)); +#2459=DIRECTION('',(0.E0,0.E0,1.E0)); +#2460=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2461=AXIS2_PLACEMENT_3D('',#2458,#2459,#2460); +#2463=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2464=PRESENTATION_STYLE_ASSIGNMENT((#2463)); +#2465=STYLED_ITEM('',(#2464),#2462); +#2466=CARTESIAN_POINT('',(-4.53E0,-2.051E1,-8.E-1)); +#2467=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2468=DIRECTION('',(1.E0,0.E0,0.E0)); +#2469=AXIS2_PLACEMENT_3D('',#2466,#2467,#2468); +#2471=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2472=PRESENTATION_STYLE_ASSIGNMENT((#2471)); +#2473=STYLED_ITEM('',(#2472),#2470); +#2474=DIRECTION('',(0.E0,0.E0,1.E0)); +#2475=VECTOR('',#2474,1.7E-1); +#2476=CARTESIAN_POINT('',(-4.03E0,-2.051E1,-9.7E-1)); +#2477=LINE('',#2476,#2475); +#2478=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2479=PRESENTATION_STYLE_ASSIGNMENT((#2478)); +#2480=STYLED_ITEM('',(#2479),#2477); +#2481=DIRECTION('',(0.E0,-1.E0,0.E0)); +#2482=VECTOR('',#2481,1.8E0); +#2483=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-8.E-1)); +#2484=LINE('',#2483,#2482); +#2485=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2486=PRESENTATION_STYLE_ASSIGNMENT((#2485)); +#2487=STYLED_ITEM('',(#2486),#2484); +#2488=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2489=VECTOR('',#2488,1.7E-1); +#2490=CARTESIAN_POINT('',(8.01E0,-2.101E1,-8.E-1)); +#2491=LINE('',#2490,#2489); +#2492=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2493=PRESENTATION_STYLE_ASSIGNMENT((#2492)); +#2494=STYLED_ITEM('',(#2493),#2491); +#2495=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2496=VECTOR('',#2495,3.777481111904E0); +#2497=CARTESIAN_POINT('',(8.01E0,-2.101E1,-8.E-1)); +#2498=LINE('',#2497,#2496); +#2499=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2500=PRESENTATION_STYLE_ASSIGNMENT((#2499)); +#2501=STYLED_ITEM('',(#2500),#2498); +#2502=DIRECTION('',(0.E0,0.E0,1.E0)); +#2503=VECTOR('',#2502,1.7E-1); +#2504=CARTESIAN_POINT('',(4.232518888096E0,-2.101E1,-9.7E-1)); +#2505=LINE('',#2504,#2503); +#2506=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2507=PRESENTATION_STYLE_ASSIGNMENT((#2506)); +#2508=STYLED_ITEM('',(#2507),#2505); +#2509=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2510=VECTOR('',#2509,1.7E-1); +#2511=CARTESIAN_POINT('',(9.01E0,-2.992E1,-8.E-1)); +#2512=LINE('',#2511,#2510); +#2513=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2514=PRESENTATION_STYLE_ASSIGNMENT((#2513)); +#2515=STYLED_ITEM('',(#2514),#2512); +#2516=DIRECTION('',(0.E0,1.E0,0.E0)); +#2517=VECTOR('',#2516,7.91E0); +#2518=CARTESIAN_POINT('',(9.01E0,-2.992E1,-8.E-1)); +#2519=LINE('',#2518,#2517); +#2520=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2521=PRESENTATION_STYLE_ASSIGNMENT((#2520)); +#2522=STYLED_ITEM('',(#2521),#2519); +#2523=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2524=VECTOR('',#2523,1.7E-1); +#2525=CARTESIAN_POINT('',(9.01E0,-2.201E1,-8.E-1)); +#2526=LINE('',#2525,#2524); +#2527=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2528=PRESENTATION_STYLE_ASSIGNMENT((#2527)); +#2529=STYLED_ITEM('',(#2528),#2526); +#2530=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2531=VECTOR('',#2530,1.7E-1); +#2532=CARTESIAN_POINT('',(8.01E0,-3.092E1,-8.E-1)); +#2533=LINE('',#2532,#2531); +#2534=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2535=PRESENTATION_STYLE_ASSIGNMENT((#2534)); +#2536=STYLED_ITEM('',(#2535),#2533); +#2537=DIRECTION('',(0.E0,0.E0,1.E0)); +#2538=VECTOR('',#2537,1.7E-1); +#2539=CARTESIAN_POINT('',(5.76E0,-3.092E1,-9.7E-1)); +#2540=LINE('',#2539,#2538); +#2541=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2542=PRESENTATION_STYLE_ASSIGNMENT((#2541)); +#2543=STYLED_ITEM('',(#2542),#2540); +#2544=DIRECTION('',(1.E0,0.E0,0.E0)); +#2545=VECTOR('',#2544,2.25E0); +#2546=CARTESIAN_POINT('',(5.76E0,-3.092E1,-8.E-1)); +#2547=LINE('',#2546,#2545); +#2548=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2549=PRESENTATION_STYLE_ASSIGNMENT((#2548)); +#2550=STYLED_ITEM('',(#2549),#2547); +#2551=CARTESIAN_POINT('',(5.76E0,-3.192E1,-9.7E-1)); +#2552=DIRECTION('',(0.E0,0.E0,1.E0)); +#2553=DIRECTION('',(0.E0,1.E0,0.E0)); +#2554=AXIS2_PLACEMENT_3D('',#2551,#2552,#2553); +#2556=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2557=PRESENTATION_STYLE_ASSIGNMENT((#2556)); +#2558=STYLED_ITEM('',(#2557),#2555); +#2559=CARTESIAN_POINT('',(5.76E0,-3.192E1,-8.E-1)); +#2560=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2561=DIRECTION('',(-1.E0,0.E0,0.E0)); +#2562=AXIS2_PLACEMENT_3D('',#2559,#2560,#2561); +#2564=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2565=PRESENTATION_STYLE_ASSIGNMENT((#2564)); +#2566=STYLED_ITEM('',(#2565),#2563); +#2567=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2568=VECTOR('',#2567,1.56E0); +#2569=CARTESIAN_POINT('',(1.5035E1,1.351E1,0.E0)); +#2570=LINE('',#2569,#2568); +#2571=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2572=PRESENTATION_STYLE_ASSIGNMENT((#2571)); +#2573=STYLED_ITEM('',(#2572),#2570); +#2574=DIRECTION('',(0.E0,0.E0,-1.E0)); +#2575=VECTOR('',#2574,1.56E0); +#2576=CARTESIAN_POINT('',(1.5035E1,-1.351E1,0.E0)); +#2577=LINE('',#2576,#2575); +#2578=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#6); +#2579=PRESENTATION_STYLE_ASSIGNMENT((#2578)); +#2580=STYLED_ITEM('',(#2579),#2577); +#2581=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-9.7E-1)); +#2582=CARTESIAN_POINT('',(3.732518888096E0,-1.871E1,-9.7E-1)); +#2583=VERTEX_POINT('',#2581); +#2584=VERTEX_POINT('',#2582); +#2585=CARTESIAN_POINT('',(-4.03E0,-1.871E1,-8.E-1)); +#2586=VERTEX_POINT('',#2585); +#2587=CARTESIAN_POINT('',(3.732518888096E0,-1.871E1,-8.E-1)); +#2588=VERTEX_POINT('',#2587); +#2589=CARTESIAN_POINT('',(-4.53E0,-2.101E1,-9.7E-1)); +#2590=CARTESIAN_POINT('',(-4.53E0,-2.101E1,-8.E-1)); +#2591=VERTEX_POINT('',#2589); +#2592=VERTEX_POINT('',#2590); +#2593=CARTESIAN_POINT('',(-4.03E0,-2.051E1,-9.7E-1)); +#2594=CARTESIAN_POINT('',(-4.03E0,-2.051E1,-8.E-1)); +#2595=VERTEX_POINT('',#2593); +#2596=VERTEX_POINT('',#2594); +#2597=CARTESIAN_POINT('',(3.732518888096E0,-2.051E1,-9.7E-1)); +#2598=CARTESIAN_POINT('',(3.732518888096E0,-2.051E1,-8.E-1)); +#2599=VERTEX_POINT('',#2597); +#2600=VERTEX_POINT('',#2598); +#2601=CARTESIAN_POINT('',(4.232518888096E0,-2.101E1,-9.7E-1)); +#2602=CARTESIAN_POINT('',(4.232518888096E0,-2.101E1,-8.E-1)); +#2603=VERTEX_POINT('',#2601); +#2604=VERTEX_POINT('',#2602); +#2605=CARTESIAN_POINT('',(-1.064E1,-2.201E1,-9.7E-1)); +#2606=CARTESIAN_POINT('',(-9.64E0,-2.101E1,-9.7E-1)); +#2607=VERTEX_POINT('',#2605); +#2608=VERTEX_POINT('',#2606); +#2609=CARTESIAN_POINT('',(-9.64E0,-2.101E1,-8.E-1)); +#2610=VERTEX_POINT('',#2609); +#2611=CARTESIAN_POINT('',(-1.064E1,-2.201E1,-8.E-1)); +#2612=VERTEX_POINT('',#2611); +#2613=CARTESIAN_POINT('',(-9.64E0,-3.092E1,-9.7E-1)); +#2614=CARTESIAN_POINT('',(-1.064E1,-2.992E1,-9.7E-1)); +#2615=VERTEX_POINT('',#2613); +#2616=VERTEX_POINT('',#2614); +#2617=CARTESIAN_POINT('',(-1.064E1,-2.992E1,-8.E-1)); +#2618=VERTEX_POINT('',#2617); +#2619=CARTESIAN_POINT('',(-9.64E0,-3.092E1,-8.E-1)); +#2620=VERTEX_POINT('',#2619); +#2621=CARTESIAN_POINT('',(9.01E0,-2.992E1,-9.7E-1)); +#2622=CARTESIAN_POINT('',(8.01E0,-3.092E1,-9.7E-1)); +#2623=VERTEX_POINT('',#2621); +#2624=VERTEX_POINT('',#2622); +#2625=CARTESIAN_POINT('',(8.01E0,-3.092E1,-8.E-1)); +#2626=VERTEX_POINT('',#2625); +#2627=CARTESIAN_POINT('',(9.01E0,-2.992E1,-8.E-1)); +#2628=VERTEX_POINT('',#2627); +#2629=CARTESIAN_POINT('',(8.01E0,-2.101E1,-9.7E-1)); +#2630=CARTESIAN_POINT('',(9.01E0,-2.201E1,-9.7E-1)); +#2631=VERTEX_POINT('',#2629); +#2632=VERTEX_POINT('',#2630); +#2633=CARTESIAN_POINT('',(9.01E0,-2.201E1,-8.E-1)); +#2634=VERTEX_POINT('',#2633); +#2635=CARTESIAN_POINT('',(8.01E0,-2.101E1,-8.E-1)); +#2636=VERTEX_POINT('',#2635); +#2637=CARTESIAN_POINT('',(-4.74E0,-3.192E1,-9.7E-1)); +#2638=CARTESIAN_POINT('',(-4.74E0,-3.192E1,-8.E-1)); +#2639=VERTEX_POINT('',#2637); +#2640=VERTEX_POINT('',#2638); +#2641=CARTESIAN_POINT('',(-5.74E0,-3.092E1,-9.7E-1)); +#2642=CARTESIAN_POINT('',(-5.74E0,-3.092E1,-8.E-1)); +#2643=VERTEX_POINT('',#2641); +#2644=VERTEX_POINT('',#2642); +#2645=CARTESIAN_POINT('',(5.76E0,-3.092E1,-9.7E-1)); +#2646=CARTESIAN_POINT('',(5.76E0,-3.092E1,-8.E-1)); +#2647=VERTEX_POINT('',#2645); +#2648=VERTEX_POINT('',#2646); +#2649=CARTESIAN_POINT('',(4.76E0,-3.192E1,-9.7E-1)); +#2650=CARTESIAN_POINT('',(4.76E0,-3.192E1,-8.E-1)); +#2651=VERTEX_POINT('',#2649); +#2652=VERTEX_POINT('',#2650); +#2653=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.2E-1)); +#2654=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.2E-1)); +#2655=VERTEX_POINT('',#2653); +#2656=VERTEX_POINT('',#2654); +#2657=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.2E-1)); +#2658=VERTEX_POINT('',#2657); +#2659=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.2E-1)); +#2660=VERTEX_POINT('',#2659); +#2661=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.E-1)); +#2662=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.E-1)); +#2663=VERTEX_POINT('',#2661); +#2664=VERTEX_POINT('',#2662); +#2665=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.E-1)); +#2666=VERTEX_POINT('',#2665); +#2667=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.E-1)); +#2668=VERTEX_POINT('',#2667); +#2669=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.2E-1)); +#2670=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.2E-1)); +#2671=VERTEX_POINT('',#2669); +#2672=VERTEX_POINT('',#2670); +#2673=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.2E-1)); +#2674=VERTEX_POINT('',#2673); +#2675=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.2E-1)); +#2676=VERTEX_POINT('',#2675); +#2677=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.E-1)); +#2678=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.E-1)); +#2679=VERTEX_POINT('',#2677); +#2680=VERTEX_POINT('',#2678); +#2681=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.E-1)); +#2682=VERTEX_POINT('',#2681); +#2683=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.E-1)); +#2684=VERTEX_POINT('',#2683); +#2685=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.2E-1)); +#2686=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.2E-1)); +#2687=VERTEX_POINT('',#2685); +#2688=VERTEX_POINT('',#2686); +#2689=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.2E-1)); +#2690=VERTEX_POINT('',#2689); +#2691=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.2E-1)); +#2692=VERTEX_POINT('',#2691); +#2693=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.E-1)); +#2694=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.E-1)); +#2695=VERTEX_POINT('',#2693); +#2696=VERTEX_POINT('',#2694); +#2697=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.E-1)); +#2698=VERTEX_POINT('',#2697); +#2699=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.E-1)); +#2700=VERTEX_POINT('',#2699); +#2701=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.2E-1)); +#2702=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.2E-1)); +#2703=VERTEX_POINT('',#2701); +#2704=VERTEX_POINT('',#2702); +#2705=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.2E-1)); +#2706=VERTEX_POINT('',#2705); +#2707=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.2E-1)); +#2708=VERTEX_POINT('',#2707); +#2709=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.E-1)); +#2710=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.E-1)); +#2711=VERTEX_POINT('',#2709); +#2712=VERTEX_POINT('',#2710); +#2713=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.E-1)); +#2714=VERTEX_POINT('',#2713); +#2715=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.E-1)); +#2716=VERTEX_POINT('',#2715); +#2717=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.2E-1)); +#2718=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.2E-1)); +#2719=VERTEX_POINT('',#2717); +#2720=VERTEX_POINT('',#2718); +#2721=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.2E-1)); +#2722=VERTEX_POINT('',#2721); +#2723=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.2E-1)); +#2724=VERTEX_POINT('',#2723); +#2725=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.E-1)); +#2726=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.E-1)); +#2727=VERTEX_POINT('',#2725); +#2728=VERTEX_POINT('',#2726); +#2729=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.E-1)); +#2730=VERTEX_POINT('',#2729); +#2731=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.E-1)); +#2732=VERTEX_POINT('',#2731); +#2733=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.2E-1)); +#2734=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.2E-1)); +#2735=VERTEX_POINT('',#2733); +#2736=VERTEX_POINT('',#2734); +#2737=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.2E-1)); +#2738=VERTEX_POINT('',#2737); +#2739=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.2E-1)); +#2740=VERTEX_POINT('',#2739); +#2741=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.E-1)); +#2742=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.E-1)); +#2743=VERTEX_POINT('',#2741); +#2744=VERTEX_POINT('',#2742); +#2745=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.E-1)); +#2746=VERTEX_POINT('',#2745); +#2747=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.E-1)); +#2748=VERTEX_POINT('',#2747); +#2749=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.2E-1)); +#2750=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.2E-1)); +#2751=VERTEX_POINT('',#2749); +#2752=VERTEX_POINT('',#2750); +#2753=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.2E-1)); +#2754=VERTEX_POINT('',#2753); +#2755=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.2E-1)); +#2756=VERTEX_POINT('',#2755); +#2757=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.E-1)); +#2758=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.E-1)); +#2759=VERTEX_POINT('',#2757); +#2760=VERTEX_POINT('',#2758); +#2761=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.E-1)); +#2762=VERTEX_POINT('',#2761); +#2763=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.E-1)); +#2764=VERTEX_POINT('',#2763); +#2765=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.2E-1)); +#2766=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.2E-1)); +#2767=VERTEX_POINT('',#2765); +#2768=VERTEX_POINT('',#2766); +#2769=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.2E-1)); +#2770=VERTEX_POINT('',#2769); +#2771=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.2E-1)); +#2772=VERTEX_POINT('',#2771); +#2773=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.E-1)); +#2774=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.E-1)); +#2775=VERTEX_POINT('',#2773); +#2776=VERTEX_POINT('',#2774); +#2777=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.E-1)); +#2778=VERTEX_POINT('',#2777); +#2779=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.E-1)); +#2780=VERTEX_POINT('',#2779); +#2781=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.2E-1)); +#2782=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.2E-1)); +#2783=VERTEX_POINT('',#2781); +#2784=VERTEX_POINT('',#2782); +#2785=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.2E-1)); +#2786=VERTEX_POINT('',#2785); +#2787=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.2E-1)); +#2788=VERTEX_POINT('',#2787); +#2789=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.E-1)); +#2790=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.E-1)); +#2791=VERTEX_POINT('',#2789); +#2792=VERTEX_POINT('',#2790); +#2793=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.E-1)); +#2794=VERTEX_POINT('',#2793); +#2795=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.E-1)); +#2796=VERTEX_POINT('',#2795); +#2797=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.2E-1)); +#2798=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.2E-1)); +#2799=VERTEX_POINT('',#2797); +#2800=VERTEX_POINT('',#2798); +#2801=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.2E-1)); +#2802=VERTEX_POINT('',#2801); +#2803=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.2E-1)); +#2804=VERTEX_POINT('',#2803); +#2805=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.E-1)); +#2806=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.E-1)); +#2807=VERTEX_POINT('',#2805); +#2808=VERTEX_POINT('',#2806); +#2809=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.E-1)); +#2810=VERTEX_POINT('',#2809); +#2811=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.E-1)); +#2812=VERTEX_POINT('',#2811); +#2813=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.2E-1)); +#2814=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.2E-1)); +#2815=VERTEX_POINT('',#2813); +#2816=VERTEX_POINT('',#2814); +#2817=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.2E-1)); +#2818=VERTEX_POINT('',#2817); +#2819=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.2E-1)); +#2820=VERTEX_POINT('',#2819); +#2821=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.E-1)); +#2822=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.E-1)); +#2823=VERTEX_POINT('',#2821); +#2824=VERTEX_POINT('',#2822); +#2825=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.E-1)); +#2826=VERTEX_POINT('',#2825); +#2827=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.E-1)); +#2828=VERTEX_POINT('',#2827); +#2829=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.2E-1)); +#2830=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.2E-1)); +#2831=VERTEX_POINT('',#2829); +#2832=VERTEX_POINT('',#2830); +#2833=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.2E-1)); +#2834=VERTEX_POINT('',#2833); +#2835=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.2E-1)); +#2836=VERTEX_POINT('',#2835); +#2837=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.E-1)); +#2838=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.E-1)); +#2839=VERTEX_POINT('',#2837); +#2840=VERTEX_POINT('',#2838); +#2841=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.E-1)); +#2842=VERTEX_POINT('',#2841); +#2843=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.E-1)); +#2844=VERTEX_POINT('',#2843); +#2845=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.2E-1)); +#2846=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.2E-1)); +#2847=VERTEX_POINT('',#2845); +#2848=VERTEX_POINT('',#2846); +#2849=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.2E-1)); +#2850=VERTEX_POINT('',#2849); +#2851=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.2E-1)); +#2852=VERTEX_POINT('',#2851); +#2853=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.E-1)); +#2854=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.E-1)); +#2855=VERTEX_POINT('',#2853); +#2856=VERTEX_POINT('',#2854); +#2857=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.E-1)); +#2858=VERTEX_POINT('',#2857); +#2859=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.E-1)); +#2860=VERTEX_POINT('',#2859); +#2861=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.2E-1)); +#2862=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.2E-1)); +#2863=VERTEX_POINT('',#2861); +#2864=VERTEX_POINT('',#2862); +#2865=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.2E-1)); +#2866=VERTEX_POINT('',#2865); +#2867=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.2E-1)); +#2868=VERTEX_POINT('',#2867); +#2869=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.E-1)); +#2870=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.E-1)); +#2871=VERTEX_POINT('',#2869); +#2872=VERTEX_POINT('',#2870); +#2873=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.E-1)); +#2874=VERTEX_POINT('',#2873); +#2875=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.E-1)); +#2876=VERTEX_POINT('',#2875); +#2877=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.2E-1)); +#2878=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.2E-1)); +#2879=VERTEX_POINT('',#2877); +#2880=VERTEX_POINT('',#2878); +#2881=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.2E-1)); +#2882=VERTEX_POINT('',#2881); +#2883=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.2E-1)); +#2884=VERTEX_POINT('',#2883); +#2885=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.E-1)); +#2886=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.E-1)); +#2887=VERTEX_POINT('',#2885); +#2888=VERTEX_POINT('',#2886); +#2889=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.E-1)); +#2890=VERTEX_POINT('',#2889); +#2891=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.E-1)); +#2892=VERTEX_POINT('',#2891); +#2893=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.2E-1)); +#2894=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.2E-1)); +#2895=VERTEX_POINT('',#2893); +#2896=VERTEX_POINT('',#2894); +#2897=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.2E-1)); +#2898=VERTEX_POINT('',#2897); +#2899=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.2E-1)); +#2900=VERTEX_POINT('',#2899); +#2901=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.E-1)); +#2902=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.E-1)); +#2903=VERTEX_POINT('',#2901); +#2904=VERTEX_POINT('',#2902); +#2905=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.E-1)); +#2906=VERTEX_POINT('',#2905); +#2907=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.E-1)); +#2908=VERTEX_POINT('',#2907); +#2909=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.2E-1)); +#2910=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.2E-1)); +#2911=VERTEX_POINT('',#2909); +#2912=VERTEX_POINT('',#2910); +#2913=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.2E-1)); +#2914=VERTEX_POINT('',#2913); +#2915=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.2E-1)); +#2916=VERTEX_POINT('',#2915); +#2917=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.E-1)); +#2918=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.E-1)); +#2919=VERTEX_POINT('',#2917); +#2920=VERTEX_POINT('',#2918); +#2921=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.E-1)); +#2922=VERTEX_POINT('',#2921); +#2923=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.E-1)); +#2924=VERTEX_POINT('',#2923); +#2925=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.2E-1)); +#2926=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.2E-1)); +#2927=VERTEX_POINT('',#2925); +#2928=VERTEX_POINT('',#2926); +#2929=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.2E-1)); +#2930=VERTEX_POINT('',#2929); +#2931=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.2E-1)); +#2932=VERTEX_POINT('',#2931); +#2933=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.E-1)); +#2934=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.E-1)); +#2935=VERTEX_POINT('',#2933); +#2936=VERTEX_POINT('',#2934); +#2937=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.E-1)); +#2938=VERTEX_POINT('',#2937); +#2939=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.E-1)); +#2940=VERTEX_POINT('',#2939); +#2941=CARTESIAN_POINT('',(-4.74E0,-4.309E1,-8.E-1)); +#2942=CARTESIAN_POINT('',(-4.44E0,-4.339E1,-8.E-1)); +#2943=VERTEX_POINT('',#2941); +#2944=VERTEX_POINT('',#2942); +#2945=CARTESIAN_POINT('',(4.46E0,-4.339E1,-8.E-1)); +#2946=CARTESIAN_POINT('',(4.76E0,-4.309E1,-8.E-1)); +#2947=VERTEX_POINT('',#2945); +#2948=VERTEX_POINT('',#2946); +#2949=CARTESIAN_POINT('',(4.76E0,-4.309E1,-1.1E0)); +#2950=CARTESIAN_POINT('',(4.46E0,-4.339E1,-1.1E0)); +#2951=VERTEX_POINT('',#2949); +#2952=VERTEX_POINT('',#2950); +#2953=CARTESIAN_POINT('',(-4.44E0,-4.339E1,-1.1E0)); +#2954=VERTEX_POINT('',#2953); +#2955=CARTESIAN_POINT('',(-4.74E0,-4.309E1,-1.1E0)); +#2956=VERTEX_POINT('',#2955); +#2957=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-1.1E0)); +#2958=VERTEX_POINT('',#2957); +#2959=CARTESIAN_POINT('',(4.76E0,-3.859E1,-1.1E0)); +#2960=VERTEX_POINT('',#2959); +#2961=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-9.7E-1)); +#2962=CARTESIAN_POINT('',(4.76E0,-3.859E1,-9.7E-1)); +#2963=VERTEX_POINT('',#2961); +#2964=VERTEX_POINT('',#2962); +#2965=CARTESIAN_POINT('',(1.3985E1,1.256E1,-4.E-2)); +#2966=CARTESIAN_POINT('',(8.985E0,1.756E1,-4.E-2)); +#2967=VERTEX_POINT('',#2965); +#2968=VERTEX_POINT('',#2966); +#2969=CARTESIAN_POINT('',(8.985E0,1.756E1,-2.E-2)); +#2970=VERTEX_POINT('',#2969); +#2971=CARTESIAN_POINT('',(1.3985E1,1.256E1,-2.E-2)); +#2972=VERTEX_POINT('',#2971); +#2973=CARTESIAN_POINT('',(-8.985E0,1.756E1,-4.E-2)); +#2974=CARTESIAN_POINT('',(-1.3985E1,1.256E1,-4.E-2)); +#2975=VERTEX_POINT('',#2973); +#2976=VERTEX_POINT('',#2974); +#2977=CARTESIAN_POINT('',(-1.3985E1,1.256E1,-2.E-2)); +#2978=VERTEX_POINT('',#2977); +#2979=CARTESIAN_POINT('',(-8.985E0,1.756E1,-2.E-2)); +#2980=VERTEX_POINT('',#2979); +#2981=CARTESIAN_POINT('',(-1.3985E1,-1.007E1,-4.E-2)); +#2982=CARTESIAN_POINT('',(-8.985E0,-1.507E1,-4.E-2)); +#2983=VERTEX_POINT('',#2981); +#2984=VERTEX_POINT('',#2982); +#2985=CARTESIAN_POINT('',(-8.985E0,-1.507E1,-2.E-2)); +#2986=VERTEX_POINT('',#2985); +#2987=CARTESIAN_POINT('',(-1.3985E1,-1.007E1,-2.E-2)); +#2988=VERTEX_POINT('',#2987); +#2989=CARTESIAN_POINT('',(8.985E0,-1.507E1,-4.E-2)); +#2990=CARTESIAN_POINT('',(1.3985E1,-1.007E1,-4.E-2)); +#2991=VERTEX_POINT('',#2989); +#2992=VERTEX_POINT('',#2990); +#2993=CARTESIAN_POINT('',(1.3985E1,-1.007E1,-2.E-2)); +#2994=VERTEX_POINT('',#2993); +#2995=CARTESIAN_POINT('',(8.985E0,-1.507E1,-2.E-2)); +#2996=VERTEX_POINT('',#2995); +#2997=CARTESIAN_POINT('',(-1.4385E1,-1.007E1,-2.E-2)); +#2998=CARTESIAN_POINT('',(-8.985E0,-1.547E1,-2.E-2)); +#2999=VERTEX_POINT('',#2997); +#3000=VERTEX_POINT('',#2998); +#3001=CARTESIAN_POINT('',(-8.985E0,-1.547E1,0.E0)); +#3002=VERTEX_POINT('',#3001); +#3003=CARTESIAN_POINT('',(-1.4385E1,-1.007E1,0.E0)); +#3004=VERTEX_POINT('',#3003); +#3005=CARTESIAN_POINT('',(-8.985E0,1.796E1,-2.E-2)); +#3006=CARTESIAN_POINT('',(-1.4385E1,1.256E1,-2.E-2)); +#3007=VERTEX_POINT('',#3005); +#3008=VERTEX_POINT('',#3006); +#3009=CARTESIAN_POINT('',(-1.4385E1,1.256E1,0.E0)); +#3010=VERTEX_POINT('',#3009); +#3011=CARTESIAN_POINT('',(-8.985E0,1.796E1,0.E0)); +#3012=VERTEX_POINT('',#3011); +#3013=CARTESIAN_POINT('',(1.4385E1,1.256E1,-2.E-2)); +#3014=CARTESIAN_POINT('',(8.985E0,1.796E1,-2.E-2)); +#3015=VERTEX_POINT('',#3013); +#3016=VERTEX_POINT('',#3014); +#3017=CARTESIAN_POINT('',(8.985E0,1.796E1,0.E0)); +#3018=VERTEX_POINT('',#3017); +#3019=CARTESIAN_POINT('',(1.4385E1,1.256E1,0.E0)); +#3020=VERTEX_POINT('',#3019); +#3021=CARTESIAN_POINT('',(8.985E0,-1.547E1,-2.E-2)); +#3022=CARTESIAN_POINT('',(1.4385E1,-1.007E1,-2.E-2)); +#3023=VERTEX_POINT('',#3021); +#3024=VERTEX_POINT('',#3022); +#3025=CARTESIAN_POINT('',(1.4385E1,-1.007E1,0.E0)); +#3026=VERTEX_POINT('',#3025); +#3027=CARTESIAN_POINT('',(8.985E0,-1.547E1,0.E0)); +#3028=VERTEX_POINT('',#3027); +#3029=CARTESIAN_POINT('',(9.835E0,1.871E1,-1.56E0)); +#3030=CARTESIAN_POINT('',(1.5035E1,1.351E1,-1.56E0)); +#3031=VERTEX_POINT('',#3029); +#3032=VERTEX_POINT('',#3030); +#3033=CARTESIAN_POINT('',(1.5035E1,1.351E1,0.E0)); +#3034=VERTEX_POINT('',#3033); +#3035=CARTESIAN_POINT('',(9.835E0,1.871E1,0.E0)); +#3036=VERTEX_POINT('',#3035); +#3037=CARTESIAN_POINT('',(1.5035E1,-1.351E1,-1.56E0)); +#3038=CARTESIAN_POINT('',(9.835E0,-1.871E1,-1.56E0)); +#3039=VERTEX_POINT('',#3037); +#3040=VERTEX_POINT('',#3038); +#3041=CARTESIAN_POINT('',(9.835E0,-1.871E1,0.E0)); +#3042=VERTEX_POINT('',#3041); +#3043=CARTESIAN_POINT('',(1.5035E1,-1.351E1,0.E0)); +#3044=VERTEX_POINT('',#3043); +#3045=CARTESIAN_POINT('',(-9.835E0,-1.871E1,-1.56E0)); +#3046=CARTESIAN_POINT('',(-1.5035E1,-1.351E1,-1.56E0)); +#3047=VERTEX_POINT('',#3045); +#3048=VERTEX_POINT('',#3046); +#3049=CARTESIAN_POINT('',(-1.5035E1,-1.351E1,0.E0)); +#3050=VERTEX_POINT('',#3049); +#3051=CARTESIAN_POINT('',(-9.835E0,-1.871E1,0.E0)); +#3052=VERTEX_POINT('',#3051); +#3053=CARTESIAN_POINT('',(-1.5035E1,1.351E1,-1.56E0)); +#3054=CARTESIAN_POINT('',(-9.835E0,1.871E1,-1.56E0)); +#3055=VERTEX_POINT('',#3053); +#3056=VERTEX_POINT('',#3054); +#3057=CARTESIAN_POINT('',(-9.835E0,1.871E1,0.E0)); +#3058=VERTEX_POINT('',#3057); +#3059=CARTESIAN_POINT('',(-1.5035E1,1.351E1,0.E0)); +#3060=VERTEX_POINT('',#3059); +#3061=CARTESIAN_POINT('',(0.E0,0.E0,0.E0)); +#3062=DIRECTION('',(0.E0,0.E0,1.E0)); +#3063=DIRECTION('',(1.E0,0.E0,0.E0)); +#3064=AXIS2_PLACEMENT_3D('',#3061,#3062,#3063); +#3065=PLANE('',#3064); +#3067=ORIENTED_EDGE('',*,*,#3066,.F.); +#3069=ORIENTED_EDGE('',*,*,#3068,.F.); +#3071=ORIENTED_EDGE('',*,*,#3070,.F.); +#3073=ORIENTED_EDGE('',*,*,#3072,.F.); +#3075=ORIENTED_EDGE('',*,*,#3074,.F.); +#3077=ORIENTED_EDGE('',*,*,#3076,.F.); +#3079=ORIENTED_EDGE('',*,*,#3078,.F.); +#3081=ORIENTED_EDGE('',*,*,#3080,.F.); +#3082=EDGE_LOOP('',(#3067,#3069,#3071,#3073,#3075,#3077,#3079,#3081)); +#3083=FACE_OUTER_BOUND('',#3082,.F.); +#3085=ORIENTED_EDGE('',*,*,#3084,.T.); +#3087=ORIENTED_EDGE('',*,*,#3086,.F.); +#3089=ORIENTED_EDGE('',*,*,#3088,.T.); +#3091=ORIENTED_EDGE('',*,*,#3090,.F.); +#3093=ORIENTED_EDGE('',*,*,#3092,.T.); +#3095=ORIENTED_EDGE('',*,*,#3094,.F.); +#3097=ORIENTED_EDGE('',*,*,#3096,.T.); +#3099=ORIENTED_EDGE('',*,*,#3098,.F.); +#3100=EDGE_LOOP('',(#3085,#3087,#3089,#3091,#3093,#3095,#3097,#3099)); +#3101=FACE_BOUND('',#3100,.F.); +#3102=ADVANCED_FACE('',(#3083,#3101),#3065,.T.); +#3103=CARTESIAN_POINT('',(1.4385E1,1.796E1,0.E0)); +#3104=DIRECTION('',(0.E0,1.E0,0.E0)); +#3105=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3106=AXIS2_PLACEMENT_3D('',#3103,#3104,#3105); +#3107=PLANE('',#3106); +#3109=ORIENTED_EDGE('',*,*,#3108,.F.); +#3110=ORIENTED_EDGE('',*,*,#3084,.F.); +#3112=ORIENTED_EDGE('',*,*,#3111,.T.); +#3114=ORIENTED_EDGE('',*,*,#3113,.T.); +#3115=EDGE_LOOP('',(#3109,#3110,#3112,#3114)); +#3116=FACE_OUTER_BOUND('',#3115,.F.); +#3117=ADVANCED_FACE('',(#3116),#3107,.F.); +#3118=CARTESIAN_POINT('',(-8.985E0,1.256E1,6.650832E0)); +#3119=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3120=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3121=AXIS2_PLACEMENT_3D('',#3118,#3119,#3120); +#3122=CYLINDRICAL_SURFACE('',#3121,5.4E0); +#3124=ORIENTED_EDGE('',*,*,#3123,.T.); +#3126=ORIENTED_EDGE('',*,*,#3125,.F.); +#3127=ORIENTED_EDGE('',*,*,#3086,.T.); +#3128=ORIENTED_EDGE('',*,*,#3108,.T.); +#3129=EDGE_LOOP('',(#3124,#3126,#3127,#3128)); +#3130=FACE_OUTER_BOUND('',#3129,.F.); +#3131=ADVANCED_FACE('',(#3130),#3122,.F.); +#3132=CARTESIAN_POINT('',(0.E0,0.E0,-2.E-2)); +#3133=DIRECTION('',(0.E0,0.E0,1.E0)); +#3134=DIRECTION('',(1.E0,0.E0,0.E0)); +#3135=AXIS2_PLACEMENT_3D('',#3132,#3133,#3134); +#3136=PLANE('',#3135); +#3138=ORIENTED_EDGE('',*,*,#3137,.F.); +#3140=ORIENTED_EDGE('',*,*,#3139,.F.); +#3141=ORIENTED_EDGE('',*,*,#3123,.F.); +#3142=ORIENTED_EDGE('',*,*,#3113,.F.); +#3144=ORIENTED_EDGE('',*,*,#3143,.F.); +#3146=ORIENTED_EDGE('',*,*,#3145,.F.); +#3148=ORIENTED_EDGE('',*,*,#3147,.F.); +#3150=ORIENTED_EDGE('',*,*,#3149,.F.); +#3151=EDGE_LOOP('',(#3138,#3140,#3141,#3142,#3144,#3146,#3148,#3150)); +#3152=FACE_OUTER_BOUND('',#3151,.F.); +#3154=ORIENTED_EDGE('',*,*,#3153,.T.); +#3156=ORIENTED_EDGE('',*,*,#3155,.F.); +#3158=ORIENTED_EDGE('',*,*,#3157,.T.); +#3160=ORIENTED_EDGE('',*,*,#3159,.F.); +#3162=ORIENTED_EDGE('',*,*,#3161,.T.); +#3164=ORIENTED_EDGE('',*,*,#3163,.F.); +#3166=ORIENTED_EDGE('',*,*,#3165,.T.); +#3168=ORIENTED_EDGE('',*,*,#3167,.F.); +#3169=EDGE_LOOP('',(#3154,#3156,#3158,#3160,#3162,#3164,#3166,#3168)); +#3170=FACE_BOUND('',#3169,.F.); +#3171=ADVANCED_FACE('',(#3152,#3170),#3136,.T.); +#3172=FILL_AREA_STYLE_COLOUR('',#1); +#3173=FILL_AREA_STYLE('',(#3172)); +#3174=SURFACE_STYLE_FILL_AREA(#3173); +#3175=SURFACE_SIDE_STYLE('',(#3174)); +#3176=SURFACE_STYLE_USAGE(.POSITIVE.,#3175); +#3177=FILL_AREA_STYLE_COLOUR('',#6); +#3178=FILL_AREA_STYLE('',(#3177)); +#3179=SURFACE_STYLE_FILL_AREA(#3178); +#3180=SURFACE_SIDE_STYLE('',(#3179)); +#3181=SURFACE_STYLE_USAGE(.NEGATIVE.,#3180); +#3182=PRESENTATION_STYLE_ASSIGNMENT((#3176,#3181)); +#3183=OVER_RIDING_STYLED_ITEM('',(#3182),#3171,#15); +#3184=CARTESIAN_POINT('',(1.3985E1,1.756E1,0.E0)); +#3185=DIRECTION('',(0.E0,1.E0,0.E0)); +#3186=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3187=AXIS2_PLACEMENT_3D('',#3184,#3185,#3186); +#3188=PLANE('',#3187); +#3190=ORIENTED_EDGE('',*,*,#3189,.T.); +#3192=ORIENTED_EDGE('',*,*,#3191,.T.); +#3194=ORIENTED_EDGE('',*,*,#3193,.F.); +#3195=ORIENTED_EDGE('',*,*,#3153,.F.); +#3196=EDGE_LOOP('',(#3190,#3192,#3194,#3195)); +#3197=FACE_OUTER_BOUND('',#3196,.F.); +#3198=ADVANCED_FACE('',(#3197),#3188,.F.); +#3199=CARTESIAN_POINT('',(8.985E0,1.256E1,6.169872E0)); +#3200=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3201=DIRECTION('',(0.E0,1.E0,0.E0)); +#3202=AXIS2_PLACEMENT_3D('',#3199,#3200,#3201); +#3203=CYLINDRICAL_SURFACE('',#3202,5.E0); +#3205=ORIENTED_EDGE('',*,*,#3204,.T.); +#3206=ORIENTED_EDGE('',*,*,#3189,.F.); +#3207=ORIENTED_EDGE('',*,*,#3167,.T.); +#3209=ORIENTED_EDGE('',*,*,#3208,.T.); +#3210=EDGE_LOOP('',(#3205,#3206,#3207,#3209)); +#3211=FACE_OUTER_BOUND('',#3210,.F.); +#3212=ADVANCED_FACE('',(#3211),#3203,.F.); +#3213=CARTESIAN_POINT('',(0.E0,0.E0,-4.E-2)); +#3214=DIRECTION('',(0.E0,0.E0,1.E0)); +#3215=DIRECTION('',(1.E0,0.E0,0.E0)); +#3216=AXIS2_PLACEMENT_3D('',#3213,#3214,#3215); +#3217=PLANE('',#3216); +#3218=ORIENTED_EDGE('',*,*,#3204,.F.); +#3220=ORIENTED_EDGE('',*,*,#3219,.F.); +#3222=ORIENTED_EDGE('',*,*,#3221,.F.); +#3224=ORIENTED_EDGE('',*,*,#3223,.F.); +#3226=ORIENTED_EDGE('',*,*,#3225,.F.); +#3228=ORIENTED_EDGE('',*,*,#3227,.F.); +#3230=ORIENTED_EDGE('',*,*,#3229,.F.); +#3231=ORIENTED_EDGE('',*,*,#3191,.F.); +#3232=EDGE_LOOP('',(#3218,#3220,#3222,#3224,#3226,#3228,#3230,#3231)); +#3233=FACE_OUTER_BOUND('',#3232,.F.); +#3234=ADVANCED_FACE('',(#3233),#3217,.T.); +#3235=FILL_AREA_STYLE_COLOUR('',#2); +#3236=FILL_AREA_STYLE('',(#3235)); +#3237=SURFACE_STYLE_FILL_AREA(#3236); +#3238=SURFACE_SIDE_STYLE('',(#3237)); +#3239=SURFACE_STYLE_USAGE(.POSITIVE.,#3238); +#3240=FILL_AREA_STYLE_COLOUR('',#6); +#3241=FILL_AREA_STYLE('',(#3240)); +#3242=SURFACE_STYLE_FILL_AREA(#3241); +#3243=SURFACE_SIDE_STYLE('',(#3242)); +#3244=SURFACE_STYLE_USAGE(.NEGATIVE.,#3243); +#3245=PRESENTATION_STYLE_ASSIGNMENT((#3239,#3244)); +#3246=OVER_RIDING_STYLED_ITEM('',(#3245),#3234,#15); +#3247=CARTESIAN_POINT('',(1.3985E1,-1.507E1,0.E0)); +#3248=DIRECTION('',(1.E0,0.E0,0.E0)); +#3249=DIRECTION('',(0.E0,1.E0,0.E0)); +#3250=AXIS2_PLACEMENT_3D('',#3247,#3248,#3249); +#3251=PLANE('',#3250); +#3252=ORIENTED_EDGE('',*,*,#3208,.F.); +#3253=ORIENTED_EDGE('',*,*,#3165,.F.); +#3255=ORIENTED_EDGE('',*,*,#3254,.T.); +#3256=ORIENTED_EDGE('',*,*,#3219,.T.); +#3257=EDGE_LOOP('',(#3252,#3253,#3255,#3256)); +#3258=FACE_OUTER_BOUND('',#3257,.F.); +#3259=ADVANCED_FACE('',(#3258),#3251,.F.); +#3260=CARTESIAN_POINT('',(8.985E0,-1.007E1,6.169872E0)); +#3261=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3262=DIRECTION('',(1.E0,0.E0,0.E0)); +#3263=AXIS2_PLACEMENT_3D('',#3260,#3261,#3262); +#3264=CYLINDRICAL_SURFACE('',#3263,5.E0); +#3265=ORIENTED_EDGE('',*,*,#3221,.T.); +#3266=ORIENTED_EDGE('',*,*,#3254,.F.); +#3267=ORIENTED_EDGE('',*,*,#3163,.T.); +#3269=ORIENTED_EDGE('',*,*,#3268,.T.); +#3270=EDGE_LOOP('',(#3265,#3266,#3267,#3269)); +#3271=FACE_OUTER_BOUND('',#3270,.F.); +#3272=ADVANCED_FACE('',(#3271),#3264,.F.); +#3273=CARTESIAN_POINT('',(-1.3985E1,-1.507E1,0.E0)); +#3274=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3275=DIRECTION('',(1.E0,0.E0,0.E0)); +#3276=AXIS2_PLACEMENT_3D('',#3273,#3274,#3275); +#3277=PLANE('',#3276); +#3279=ORIENTED_EDGE('',*,*,#3278,.T.); +#3280=ORIENTED_EDGE('',*,*,#3223,.T.); +#3281=ORIENTED_EDGE('',*,*,#3268,.F.); +#3282=ORIENTED_EDGE('',*,*,#3161,.F.); +#3283=EDGE_LOOP('',(#3279,#3280,#3281,#3282)); +#3284=FACE_OUTER_BOUND('',#3283,.F.); +#3285=ADVANCED_FACE('',(#3284),#3277,.F.); +#3286=CARTESIAN_POINT('',(-8.985E0,-1.007E1,6.169872E0)); +#3287=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3288=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3289=AXIS2_PLACEMENT_3D('',#3286,#3287,#3288); +#3290=CYLINDRICAL_SURFACE('',#3289,5.E0); +#3291=ORIENTED_EDGE('',*,*,#3225,.T.); +#3292=ORIENTED_EDGE('',*,*,#3278,.F.); +#3293=ORIENTED_EDGE('',*,*,#3159,.T.); +#3295=ORIENTED_EDGE('',*,*,#3294,.T.); +#3296=EDGE_LOOP('',(#3291,#3292,#3293,#3295)); +#3297=FACE_OUTER_BOUND('',#3296,.F.); +#3298=ADVANCED_FACE('',(#3297),#3290,.F.); +#3299=CARTESIAN_POINT('',(-1.3985E1,1.756E1,0.E0)); +#3300=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3301=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3302=AXIS2_PLACEMENT_3D('',#3299,#3300,#3301); +#3303=PLANE('',#3302); +#3305=ORIENTED_EDGE('',*,*,#3304,.T.); +#3306=ORIENTED_EDGE('',*,*,#3227,.T.); +#3307=ORIENTED_EDGE('',*,*,#3294,.F.); +#3308=ORIENTED_EDGE('',*,*,#3157,.F.); +#3309=EDGE_LOOP('',(#3305,#3306,#3307,#3308)); +#3310=FACE_OUTER_BOUND('',#3309,.F.); +#3311=ADVANCED_FACE('',(#3310),#3303,.F.); +#3312=CARTESIAN_POINT('',(-8.985E0,1.256E1,6.169872E0)); +#3313=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3314=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3315=AXIS2_PLACEMENT_3D('',#3312,#3313,#3314); +#3316=CYLINDRICAL_SURFACE('',#3315,5.E0); +#3317=ORIENTED_EDGE('',*,*,#3229,.T.); +#3318=ORIENTED_EDGE('',*,*,#3304,.F.); +#3319=ORIENTED_EDGE('',*,*,#3155,.T.); +#3320=ORIENTED_EDGE('',*,*,#3193,.T.); +#3321=EDGE_LOOP('',(#3317,#3318,#3319,#3320)); +#3322=FACE_OUTER_BOUND('',#3321,.F.); +#3323=ADVANCED_FACE('',(#3322),#3316,.F.); +#3324=CARTESIAN_POINT('',(-8.985E0,-1.007E1,6.650832E0)); +#3325=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3326=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3327=AXIS2_PLACEMENT_3D('',#3324,#3325,#3326); +#3328=CYLINDRICAL_SURFACE('',#3327,5.4E0); +#3329=ORIENTED_EDGE('',*,*,#3137,.T.); +#3331=ORIENTED_EDGE('',*,*,#3330,.F.); +#3332=ORIENTED_EDGE('',*,*,#3090,.T.); +#3334=ORIENTED_EDGE('',*,*,#3333,.T.); +#3335=EDGE_LOOP('',(#3329,#3331,#3332,#3334)); +#3336=FACE_OUTER_BOUND('',#3335,.F.); +#3337=ADVANCED_FACE('',(#3336),#3328,.F.); +#3338=CARTESIAN_POINT('',(-1.4385E1,-1.547E1,0.E0)); +#3339=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3340=DIRECTION('',(1.E0,0.E0,0.E0)); +#3341=AXIS2_PLACEMENT_3D('',#3338,#3339,#3340); +#3342=PLANE('',#3341); +#3343=ORIENTED_EDGE('',*,*,#3330,.T.); +#3344=ORIENTED_EDGE('',*,*,#3149,.T.); +#3346=ORIENTED_EDGE('',*,*,#3345,.F.); +#3347=ORIENTED_EDGE('',*,*,#3092,.F.); +#3348=EDGE_LOOP('',(#3343,#3344,#3346,#3347)); +#3349=FACE_OUTER_BOUND('',#3348,.F.); +#3350=ADVANCED_FACE('',(#3349),#3342,.F.); +#3351=CARTESIAN_POINT('',(8.985E0,-1.007E1,6.650832E0)); +#3352=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3353=DIRECTION('',(1.E0,0.E0,0.E0)); +#3354=AXIS2_PLACEMENT_3D('',#3351,#3352,#3353); +#3355=CYLINDRICAL_SURFACE('',#3354,5.4E0); +#3356=ORIENTED_EDGE('',*,*,#3147,.T.); +#3358=ORIENTED_EDGE('',*,*,#3357,.F.); +#3359=ORIENTED_EDGE('',*,*,#3094,.T.); +#3360=ORIENTED_EDGE('',*,*,#3345,.T.); +#3361=EDGE_LOOP('',(#3356,#3358,#3359,#3360)); +#3362=FACE_OUTER_BOUND('',#3361,.F.); +#3363=ADVANCED_FACE('',(#3362),#3355,.F.); +#3364=CARTESIAN_POINT('',(1.4385E1,-1.547E1,0.E0)); +#3365=DIRECTION('',(1.E0,0.E0,0.E0)); +#3366=DIRECTION('',(0.E0,1.E0,0.E0)); +#3367=AXIS2_PLACEMENT_3D('',#3364,#3365,#3366); +#3368=PLANE('',#3367); +#3370=ORIENTED_EDGE('',*,*,#3369,.F.); +#3371=ORIENTED_EDGE('',*,*,#3096,.F.); +#3372=ORIENTED_EDGE('',*,*,#3357,.T.); +#3373=ORIENTED_EDGE('',*,*,#3145,.T.); +#3374=EDGE_LOOP('',(#3370,#3371,#3372,#3373)); +#3375=FACE_OUTER_BOUND('',#3374,.F.); +#3376=ADVANCED_FACE('',(#3375),#3368,.F.); +#3377=CARTESIAN_POINT('',(8.985E0,1.256E1,6.650832E0)); +#3378=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3379=DIRECTION('',(0.E0,1.E0,0.E0)); +#3380=AXIS2_PLACEMENT_3D('',#3377,#3378,#3379); +#3381=CYLINDRICAL_SURFACE('',#3380,5.4E0); +#3382=ORIENTED_EDGE('',*,*,#3143,.T.); +#3383=ORIENTED_EDGE('',*,*,#3111,.F.); +#3384=ORIENTED_EDGE('',*,*,#3098,.T.); +#3385=ORIENTED_EDGE('',*,*,#3369,.T.); +#3386=EDGE_LOOP('',(#3382,#3383,#3384,#3385)); +#3387=FACE_OUTER_BOUND('',#3386,.F.); +#3388=ADVANCED_FACE('',(#3387),#3381,.F.); +#3389=CARTESIAN_POINT('',(-1.4385E1,1.796E1,0.E0)); +#3390=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3391=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3392=AXIS2_PLACEMENT_3D('',#3389,#3390,#3391); +#3393=PLANE('',#3392); +#3394=ORIENTED_EDGE('',*,*,#3333,.F.); +#3395=ORIENTED_EDGE('',*,*,#3088,.F.); +#3396=ORIENTED_EDGE('',*,*,#3125,.T.); +#3397=ORIENTED_EDGE('',*,*,#3139,.T.); +#3398=EDGE_LOOP('',(#3394,#3395,#3396,#3397)); +#3399=FACE_OUTER_BOUND('',#3398,.F.); +#3400=ADVANCED_FACE('',(#3399),#3393,.F.); +#3401=CARTESIAN_POINT('',(9.835E0,1.351E1,6.410352E0)); +#3402=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3403=DIRECTION('',(0.E0,1.E0,0.E0)); +#3404=AXIS2_PLACEMENT_3D('',#3401,#3402,#3403); +#3405=CYLINDRICAL_SURFACE('',#3404,5.2E0); +#3407=ORIENTED_EDGE('',*,*,#3406,.T.); +#3409=ORIENTED_EDGE('',*,*,#3408,.F.); +#3410=ORIENTED_EDGE('',*,*,#3066,.T.); +#3412=ORIENTED_EDGE('',*,*,#3411,.T.); +#3413=EDGE_LOOP('',(#3407,#3409,#3410,#3412)); +#3414=FACE_OUTER_BOUND('',#3413,.F.); +#3415=ADVANCED_FACE('',(#3414),#3405,.T.); +#3416=CARTESIAN_POINT('',(0.E0,0.E0,-1.56E0)); +#3417=DIRECTION('',(0.E0,0.E0,1.E0)); +#3418=DIRECTION('',(1.E0,0.E0,0.E0)); +#3419=AXIS2_PLACEMENT_3D('',#3416,#3417,#3418); +#3420=PLANE('',#3419); +#3421=ORIENTED_EDGE('',*,*,#3406,.F.); +#3423=ORIENTED_EDGE('',*,*,#3422,.T.); +#3425=ORIENTED_EDGE('',*,*,#3424,.F.); +#3427=ORIENTED_EDGE('',*,*,#3426,.T.); +#3429=ORIENTED_EDGE('',*,*,#3428,.F.); +#3431=ORIENTED_EDGE('',*,*,#3430,.T.); +#3433=ORIENTED_EDGE('',*,*,#3432,.F.); +#3435=ORIENTED_EDGE('',*,*,#3434,.T.); +#3436=EDGE_LOOP('',(#3421,#3423,#3425,#3427,#3429,#3431,#3433,#3435)); +#3437=FACE_OUTER_BOUND('',#3436,.F.); +#3438=ADVANCED_FACE('',(#3437),#3420,.F.); +#3439=CARTESIAN_POINT('',(1.5035E1,1.871E1,0.E0)); +#3440=DIRECTION('',(0.E0,1.E0,0.E0)); +#3441=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3442=AXIS2_PLACEMENT_3D('',#3439,#3440,#3441); +#3443=PLANE('',#3442); +#3444=ORIENTED_EDGE('',*,*,#3411,.F.); +#3445=ORIENTED_EDGE('',*,*,#3080,.T.); +#3447=ORIENTED_EDGE('',*,*,#3446,.T.); +#3448=ORIENTED_EDGE('',*,*,#3422,.F.); +#3449=EDGE_LOOP('',(#3444,#3445,#3447,#3448)); +#3450=FACE_OUTER_BOUND('',#3449,.F.); +#3451=ADVANCED_FACE('',(#3450),#3443,.T.); +#3452=CARTESIAN_POINT('',(-9.835E0,1.351E1,6.410352E0)); +#3453=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3454=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3455=AXIS2_PLACEMENT_3D('',#3452,#3453,#3454); +#3456=CYLINDRICAL_SURFACE('',#3455,5.2E0); +#3457=ORIENTED_EDGE('',*,*,#3424,.T.); +#3458=ORIENTED_EDGE('',*,*,#3446,.F.); +#3459=ORIENTED_EDGE('',*,*,#3078,.T.); +#3461=ORIENTED_EDGE('',*,*,#3460,.T.); +#3462=EDGE_LOOP('',(#3457,#3458,#3459,#3461)); +#3463=FACE_OUTER_BOUND('',#3462,.F.); +#3464=ADVANCED_FACE('',(#3463),#3456,.T.); +#3465=CARTESIAN_POINT('',(-1.5035E1,1.871E1,0.E0)); +#3466=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3467=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3468=AXIS2_PLACEMENT_3D('',#3465,#3466,#3467); +#3469=PLANE('',#3468); +#3471=ORIENTED_EDGE('',*,*,#3470,.T.); +#3472=ORIENTED_EDGE('',*,*,#3426,.F.); +#3473=ORIENTED_EDGE('',*,*,#3460,.F.); +#3474=ORIENTED_EDGE('',*,*,#3076,.T.); +#3475=EDGE_LOOP('',(#3471,#3472,#3473,#3474)); +#3476=FACE_OUTER_BOUND('',#3475,.F.); +#3477=ADVANCED_FACE('',(#3476),#3469,.T.); +#3478=CARTESIAN_POINT('',(-9.835E0,-1.351E1,6.410352E0)); +#3479=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3480=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3481=AXIS2_PLACEMENT_3D('',#3478,#3479,#3480); +#3482=CYLINDRICAL_SURFACE('',#3481,5.2E0); +#3483=ORIENTED_EDGE('',*,*,#3428,.T.); +#3484=ORIENTED_EDGE('',*,*,#3470,.F.); +#3485=ORIENTED_EDGE('',*,*,#3074,.T.); +#3487=ORIENTED_EDGE('',*,*,#3486,.T.); +#3488=EDGE_LOOP('',(#3483,#3484,#3485,#3487)); +#3489=FACE_OUTER_BOUND('',#3488,.F.); +#3490=ADVANCED_FACE('',(#3489),#3482,.T.); +#3491=CARTESIAN_POINT('',(-1.5035E1,-1.871E1,0.E0)); +#3492=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3493=DIRECTION('',(1.E0,0.E0,0.E0)); +#3494=AXIS2_PLACEMENT_3D('',#3491,#3492,#3493); +#3495=PLANE('',#3494); +#3497=ORIENTED_EDGE('',*,*,#3496,.T.); +#3498=ORIENTED_EDGE('',*,*,#3430,.F.); +#3499=ORIENTED_EDGE('',*,*,#3486,.F.); +#3500=ORIENTED_EDGE('',*,*,#3072,.T.); +#3501=EDGE_LOOP('',(#3497,#3498,#3499,#3500)); +#3502=FACE_OUTER_BOUND('',#3501,.F.); +#3504=ORIENTED_EDGE('',*,*,#3503,.F.); +#3506=ORIENTED_EDGE('',*,*,#3505,.T.); +#3508=ORIENTED_EDGE('',*,*,#3507,.T.); +#3510=ORIENTED_EDGE('',*,*,#3509,.T.); +#3511=EDGE_LOOP('',(#3504,#3506,#3508,#3510)); +#3512=FACE_BOUND('',#3511,.F.); +#3513=ADVANCED_FACE('',(#3502,#3512),#3495,.T.); +#3514=CARTESIAN_POINT('',(3.732518888096E0,-2.101E1,0.E0)); +#3515=DIRECTION('',(1.E0,0.E0,0.E0)); +#3516=DIRECTION('',(0.E0,1.E0,0.E0)); +#3517=AXIS2_PLACEMENT_3D('',#3514,#3515,#3516); +#3518=PLANE('',#3517); +#3520=ORIENTED_EDGE('',*,*,#3519,.T.); +#3522=ORIENTED_EDGE('',*,*,#3521,.T.); +#3523=ORIENTED_EDGE('',*,*,#3503,.T.); +#3525=ORIENTED_EDGE('',*,*,#3524,.F.); +#3526=EDGE_LOOP('',(#3520,#3522,#3523,#3525)); +#3527=FACE_OUTER_BOUND('',#3526,.F.); +#3528=ADVANCED_FACE('',(#3527),#3518,.T.); +#3529=CARTESIAN_POINT('',(4.232518888096E0,-2.051E1,-3.593616E0)); +#3530=DIRECTION('',(0.E0,0.E0,1.E0)); +#3531=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3532=AXIS2_PLACEMENT_3D('',#3529,#3530,#3531); +#3533=CYLINDRICAL_SURFACE('',#3532,5.E-1); +#3534=ORIENTED_EDGE('',*,*,#3519,.F.); +#3536=ORIENTED_EDGE('',*,*,#3535,.T.); +#3538=ORIENTED_EDGE('',*,*,#3537,.T.); +#3540=ORIENTED_EDGE('',*,*,#3539,.T.); +#3541=EDGE_LOOP('',(#3534,#3536,#3538,#3540)); +#3542=FACE_OUTER_BOUND('',#3541,.F.); +#3543=ADVANCED_FACE('',(#3542),#3533,.F.); +#3544=CARTESIAN_POINT('',(0.E0,0.E0,-9.7E-1)); +#3545=DIRECTION('',(0.E0,0.E0,1.E0)); +#3546=DIRECTION('',(1.E0,0.E0,0.E0)); +#3547=AXIS2_PLACEMENT_3D('',#3544,#3545,#3546); +#3548=PLANE('',#3547); +#3550=ORIENTED_EDGE('',*,*,#3549,.T.); +#3552=ORIENTED_EDGE('',*,*,#3551,.T.); +#3554=ORIENTED_EDGE('',*,*,#3553,.F.); +#3556=ORIENTED_EDGE('',*,*,#3555,.T.); +#3558=ORIENTED_EDGE('',*,*,#3557,.F.); +#3560=ORIENTED_EDGE('',*,*,#3559,.T.); +#3562=ORIENTED_EDGE('',*,*,#3561,.F.); +#3564=ORIENTED_EDGE('',*,*,#3563,.T.); +#3565=ORIENTED_EDGE('',*,*,#3535,.F.); +#3566=ORIENTED_EDGE('',*,*,#3524,.T.); +#3567=ORIENTED_EDGE('',*,*,#3509,.F.); +#3569=ORIENTED_EDGE('',*,*,#3568,.T.); +#3571=ORIENTED_EDGE('',*,*,#3570,.F.); +#3573=ORIENTED_EDGE('',*,*,#3572,.T.); +#3575=ORIENTED_EDGE('',*,*,#3574,.F.); +#3577=ORIENTED_EDGE('',*,*,#3576,.T.); +#3579=ORIENTED_EDGE('',*,*,#3578,.F.); +#3581=ORIENTED_EDGE('',*,*,#3580,.T.); +#3583=ORIENTED_EDGE('',*,*,#3582,.F.); +#3585=ORIENTED_EDGE('',*,*,#3584,.T.); +#3586=EDGE_LOOP('',(#3550,#3552,#3554,#3556,#3558,#3560,#3562,#3564,#3565,#3566, +#3567,#3569,#3571,#3573,#3575,#3577,#3579,#3581,#3583,#3585)); +#3587=FACE_OUTER_BOUND('',#3586,.F.); +#3588=ADVANCED_FACE('',(#3587),#3548,.F.); +#3589=CARTESIAN_POINT('',(-4.74E0,-3.859E1,-9.7E-1)); +#3590=DIRECTION('',(0.E0,1.E0,0.E0)); +#3591=DIRECTION('',(1.E0,0.E0,0.E0)); +#3592=AXIS2_PLACEMENT_3D('',#3589,#3590,#3591); +#3593=PLANE('',#3592); +#3594=ORIENTED_EDGE('',*,*,#3549,.F.); +#3596=ORIENTED_EDGE('',*,*,#3595,.T.); +#3598=ORIENTED_EDGE('',*,*,#3597,.T.); +#3600=ORIENTED_EDGE('',*,*,#3599,.F.); +#3601=EDGE_LOOP('',(#3594,#3596,#3598,#3600)); +#3602=FACE_OUTER_BOUND('',#3601,.F.); +#3603=ADVANCED_FACE('',(#3602),#3593,.T.); +#3604=CARTESIAN_POINT('',(-4.74E0,-3.092E1,0.E0)); +#3605=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3606=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3607=AXIS2_PLACEMENT_3D('',#3604,#3605,#3606); +#3608=PLANE('',#3607); +#3610=ORIENTED_EDGE('',*,*,#3609,.T.); +#3612=ORIENTED_EDGE('',*,*,#3611,.T.); +#3613=ORIENTED_EDGE('',*,*,#3595,.F.); +#3614=ORIENTED_EDGE('',*,*,#3584,.F.); +#3616=ORIENTED_EDGE('',*,*,#3615,.T.); +#3618=ORIENTED_EDGE('',*,*,#3617,.T.); +#3619=EDGE_LOOP('',(#3610,#3612,#3613,#3614,#3616,#3618)); +#3620=FACE_OUTER_BOUND('',#3619,.F.); +#3621=ADVANCED_FACE('',(#3620),#3608,.T.); +#3622=CARTESIAN_POINT('',(-4.44E0,-4.309E1,2.033616E0)); +#3623=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3624=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3625=AXIS2_PLACEMENT_3D('',#3622,#3623,#3624); +#3626=CYLINDRICAL_SURFACE('',#3625,3.E-1); +#3628=ORIENTED_EDGE('',*,*,#3627,.T.); +#3630=ORIENTED_EDGE('',*,*,#3629,.T.); +#3631=ORIENTED_EDGE('',*,*,#3609,.F.); +#3633=ORIENTED_EDGE('',*,*,#3632,.T.); +#3634=EDGE_LOOP('',(#3628,#3630,#3631,#3633)); +#3635=FACE_OUTER_BOUND('',#3634,.F.); +#3636=ADVANCED_FACE('',(#3635),#3626,.T.); +#3637=CARTESIAN_POINT('',(-4.74E0,-4.339E1,0.E0)); +#3638=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3639=DIRECTION('',(1.E0,0.E0,0.E0)); +#3640=AXIS2_PLACEMENT_3D('',#3637,#3638,#3639); +#3641=PLANE('',#3640); +#3643=ORIENTED_EDGE('',*,*,#3642,.T.); +#3645=ORIENTED_EDGE('',*,*,#3644,.T.); +#3646=ORIENTED_EDGE('',*,*,#3627,.F.); +#3648=ORIENTED_EDGE('',*,*,#3647,.T.); +#3649=EDGE_LOOP('',(#3643,#3645,#3646,#3648)); +#3650=FACE_OUTER_BOUND('',#3649,.F.); +#3651=ADVANCED_FACE('',(#3650),#3641,.T.); +#3652=CARTESIAN_POINT('',(4.46E0,-4.309E1,2.033616E0)); +#3653=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3654=DIRECTION('',(1.E0,2.368475785867E-14,0.E0)); +#3655=AXIS2_PLACEMENT_3D('',#3652,#3653,#3654); +#3656=CYLINDRICAL_SURFACE('',#3655,3.E-1); +#3658=ORIENTED_EDGE('',*,*,#3657,.F.); +#3660=ORIENTED_EDGE('',*,*,#3659,.T.); +#3661=ORIENTED_EDGE('',*,*,#3642,.F.); +#3663=ORIENTED_EDGE('',*,*,#3662,.T.); +#3664=EDGE_LOOP('',(#3658,#3660,#3661,#3663)); +#3665=FACE_OUTER_BOUND('',#3664,.F.); +#3666=ADVANCED_FACE('',(#3665),#3656,.T.); +#3667=CARTESIAN_POINT('',(4.76E0,-4.339E1,0.E0)); +#3668=DIRECTION('',(1.E0,0.E0,0.E0)); +#3669=DIRECTION('',(0.E0,1.E0,0.E0)); +#3670=AXIS2_PLACEMENT_3D('',#3667,#3668,#3669); +#3671=PLANE('',#3670); +#3672=ORIENTED_EDGE('',*,*,#3551,.F.); +#3673=ORIENTED_EDGE('',*,*,#3599,.T.); +#3675=ORIENTED_EDGE('',*,*,#3674,.T.); +#3676=ORIENTED_EDGE('',*,*,#3657,.T.); +#3678=ORIENTED_EDGE('',*,*,#3677,.T.); +#3680=ORIENTED_EDGE('',*,*,#3679,.F.); +#3681=EDGE_LOOP('',(#3672,#3673,#3675,#3676,#3678,#3680)); +#3682=FACE_OUTER_BOUND('',#3681,.F.); +#3683=ADVANCED_FACE('',(#3682),#3671,.T.); +#3684=CARTESIAN_POINT('',(0.E0,0.E0,-1.1E0)); +#3685=DIRECTION('',(0.E0,0.E0,-1.E0)); +#3686=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3687=AXIS2_PLACEMENT_3D('',#3684,#3685,#3686); +#3688=PLANE('',#3687); +#3689=ORIENTED_EDGE('',*,*,#3659,.F.); +#3690=ORIENTED_EDGE('',*,*,#3674,.F.); +#3691=ORIENTED_EDGE('',*,*,#3597,.F.); +#3692=ORIENTED_EDGE('',*,*,#3611,.F.); +#3693=ORIENTED_EDGE('',*,*,#3629,.F.); +#3694=ORIENTED_EDGE('',*,*,#3644,.F.); +#3695=EDGE_LOOP('',(#3689,#3690,#3691,#3692,#3693,#3694)); +#3696=FACE_OUTER_BOUND('',#3695,.F.); +#3697=ADVANCED_FACE('',(#3696),#3688,.T.); +#3698=CARTESIAN_POINT('',(0.E0,0.E0,-8.E-1)); +#3699=DIRECTION('',(0.E0,0.E0,1.E0)); +#3700=DIRECTION('',(1.E0,0.E0,0.E0)); +#3701=AXIS2_PLACEMENT_3D('',#3698,#3699,#3700); +#3702=PLANE('',#3701); +#3703=ORIENTED_EDGE('',*,*,#3632,.F.); +#3704=ORIENTED_EDGE('',*,*,#3617,.F.); +#3706=ORIENTED_EDGE('',*,*,#3705,.F.); +#3708=ORIENTED_EDGE('',*,*,#3707,.F.); +#3710=ORIENTED_EDGE('',*,*,#3709,.F.); +#3712=ORIENTED_EDGE('',*,*,#3711,.F.); +#3714=ORIENTED_EDGE('',*,*,#3713,.F.); +#3716=ORIENTED_EDGE('',*,*,#3715,.F.); +#3718=ORIENTED_EDGE('',*,*,#3717,.F.); +#3720=ORIENTED_EDGE('',*,*,#3719,.F.); +#3721=ORIENTED_EDGE('',*,*,#3505,.F.); +#3722=ORIENTED_EDGE('',*,*,#3521,.F.); +#3723=ORIENTED_EDGE('',*,*,#3539,.F.); +#3725=ORIENTED_EDGE('',*,*,#3724,.F.); +#3727=ORIENTED_EDGE('',*,*,#3726,.F.); +#3729=ORIENTED_EDGE('',*,*,#3728,.F.); +#3731=ORIENTED_EDGE('',*,*,#3730,.F.); +#3733=ORIENTED_EDGE('',*,*,#3732,.F.); +#3735=ORIENTED_EDGE('',*,*,#3734,.F.); +#3736=ORIENTED_EDGE('',*,*,#3677,.F.); +#3737=ORIENTED_EDGE('',*,*,#3662,.F.); +#3738=ORIENTED_EDGE('',*,*,#3647,.F.); +#3739=EDGE_LOOP('',(#3703,#3704,#3706,#3708,#3710,#3712,#3714,#3716,#3718,#3720, +#3721,#3722,#3723,#3725,#3727,#3729,#3731,#3733,#3735,#3736,#3737,#3738)); +#3740=FACE_OUTER_BOUND('',#3739,.F.); +#3742=ORIENTED_EDGE('',*,*,#3741,.T.); +#3744=ORIENTED_EDGE('',*,*,#3743,.T.); +#3746=ORIENTED_EDGE('',*,*,#3745,.T.); +#3748=ORIENTED_EDGE('',*,*,#3747,.T.); +#3749=EDGE_LOOP('',(#3742,#3744,#3746,#3748)); +#3750=FACE_BOUND('',#3749,.F.); +#3752=ORIENTED_EDGE('',*,*,#3751,.T.); +#3754=ORIENTED_EDGE('',*,*,#3753,.T.); +#3756=ORIENTED_EDGE('',*,*,#3755,.T.); +#3758=ORIENTED_EDGE('',*,*,#3757,.T.); +#3759=EDGE_LOOP('',(#3752,#3754,#3756,#3758)); +#3760=FACE_BOUND('',#3759,.F.); +#3762=ORIENTED_EDGE('',*,*,#3761,.T.); +#3764=ORIENTED_EDGE('',*,*,#3763,.T.); +#3766=ORIENTED_EDGE('',*,*,#3765,.T.); +#3768=ORIENTED_EDGE('',*,*,#3767,.T.); +#3769=EDGE_LOOP('',(#3762,#3764,#3766,#3768)); +#3770=FACE_BOUND('',#3769,.F.); +#3772=ORIENTED_EDGE('',*,*,#3771,.T.); +#3774=ORIENTED_EDGE('',*,*,#3773,.T.); +#3776=ORIENTED_EDGE('',*,*,#3775,.T.); +#3778=ORIENTED_EDGE('',*,*,#3777,.T.); +#3779=EDGE_LOOP('',(#3772,#3774,#3776,#3778)); +#3780=FACE_BOUND('',#3779,.F.); +#3782=ORIENTED_EDGE('',*,*,#3781,.T.); +#3784=ORIENTED_EDGE('',*,*,#3783,.T.); +#3786=ORIENTED_EDGE('',*,*,#3785,.T.); +#3788=ORIENTED_EDGE('',*,*,#3787,.T.); +#3789=EDGE_LOOP('',(#3782,#3784,#3786,#3788)); +#3790=FACE_BOUND('',#3789,.F.); +#3792=ORIENTED_EDGE('',*,*,#3791,.T.); +#3794=ORIENTED_EDGE('',*,*,#3793,.T.); +#3796=ORIENTED_EDGE('',*,*,#3795,.T.); +#3798=ORIENTED_EDGE('',*,*,#3797,.T.); +#3799=EDGE_LOOP('',(#3792,#3794,#3796,#3798)); +#3800=FACE_BOUND('',#3799,.F.); +#3802=ORIENTED_EDGE('',*,*,#3801,.T.); +#3804=ORIENTED_EDGE('',*,*,#3803,.T.); +#3806=ORIENTED_EDGE('',*,*,#3805,.T.); +#3808=ORIENTED_EDGE('',*,*,#3807,.T.); +#3809=EDGE_LOOP('',(#3802,#3804,#3806,#3808)); +#3810=FACE_BOUND('',#3809,.F.); +#3812=ORIENTED_EDGE('',*,*,#3811,.T.); +#3814=ORIENTED_EDGE('',*,*,#3813,.T.); +#3816=ORIENTED_EDGE('',*,*,#3815,.T.); +#3818=ORIENTED_EDGE('',*,*,#3817,.T.); +#3819=EDGE_LOOP('',(#3812,#3814,#3816,#3818)); +#3820=FACE_BOUND('',#3819,.F.); +#3822=ORIENTED_EDGE('',*,*,#3821,.T.); +#3824=ORIENTED_EDGE('',*,*,#3823,.T.); +#3826=ORIENTED_EDGE('',*,*,#3825,.T.); +#3828=ORIENTED_EDGE('',*,*,#3827,.T.); +#3829=EDGE_LOOP('',(#3822,#3824,#3826,#3828)); +#3830=FACE_BOUND('',#3829,.F.); +#3832=ORIENTED_EDGE('',*,*,#3831,.T.); +#3834=ORIENTED_EDGE('',*,*,#3833,.T.); +#3836=ORIENTED_EDGE('',*,*,#3835,.T.); +#3838=ORIENTED_EDGE('',*,*,#3837,.T.); +#3839=EDGE_LOOP('',(#3832,#3834,#3836,#3838)); +#3840=FACE_BOUND('',#3839,.F.); +#3842=ORIENTED_EDGE('',*,*,#3841,.T.); +#3844=ORIENTED_EDGE('',*,*,#3843,.T.); +#3846=ORIENTED_EDGE('',*,*,#3845,.T.); +#3848=ORIENTED_EDGE('',*,*,#3847,.T.); +#3849=EDGE_LOOP('',(#3842,#3844,#3846,#3848)); +#3850=FACE_BOUND('',#3849,.F.); +#3852=ORIENTED_EDGE('',*,*,#3851,.T.); +#3854=ORIENTED_EDGE('',*,*,#3853,.T.); +#3856=ORIENTED_EDGE('',*,*,#3855,.T.); +#3858=ORIENTED_EDGE('',*,*,#3857,.T.); +#3859=EDGE_LOOP('',(#3852,#3854,#3856,#3858)); +#3860=FACE_BOUND('',#3859,.F.); +#3862=ORIENTED_EDGE('',*,*,#3861,.T.); +#3864=ORIENTED_EDGE('',*,*,#3863,.T.); +#3866=ORIENTED_EDGE('',*,*,#3865,.T.); +#3868=ORIENTED_EDGE('',*,*,#3867,.T.); +#3869=EDGE_LOOP('',(#3862,#3864,#3866,#3868)); +#3870=FACE_BOUND('',#3869,.F.); +#3872=ORIENTED_EDGE('',*,*,#3871,.T.); +#3874=ORIENTED_EDGE('',*,*,#3873,.T.); +#3876=ORIENTED_EDGE('',*,*,#3875,.T.); +#3878=ORIENTED_EDGE('',*,*,#3877,.T.); +#3879=EDGE_LOOP('',(#3872,#3874,#3876,#3878)); +#3880=FACE_BOUND('',#3879,.F.); +#3882=ORIENTED_EDGE('',*,*,#3881,.T.); +#3884=ORIENTED_EDGE('',*,*,#3883,.T.); +#3886=ORIENTED_EDGE('',*,*,#3885,.T.); +#3888=ORIENTED_EDGE('',*,*,#3887,.T.); +#3889=EDGE_LOOP('',(#3882,#3884,#3886,#3888)); +#3890=FACE_BOUND('',#3889,.F.); +#3892=ORIENTED_EDGE('',*,*,#3891,.T.); +#3894=ORIENTED_EDGE('',*,*,#3893,.T.); +#3896=ORIENTED_EDGE('',*,*,#3895,.T.); +#3898=ORIENTED_EDGE('',*,*,#3897,.T.); +#3899=EDGE_LOOP('',(#3892,#3894,#3896,#3898)); +#3900=FACE_BOUND('',#3899,.F.); +#3902=ORIENTED_EDGE('',*,*,#3901,.T.); +#3904=ORIENTED_EDGE('',*,*,#3903,.T.); +#3906=ORIENTED_EDGE('',*,*,#3905,.T.); +#3908=ORIENTED_EDGE('',*,*,#3907,.T.); +#3909=EDGE_LOOP('',(#3902,#3904,#3906,#3908)); +#3910=FACE_BOUND('',#3909,.F.); +#3912=ORIENTED_EDGE('',*,*,#3911,.T.); +#3914=ORIENTED_EDGE('',*,*,#3913,.T.); +#3916=ORIENTED_EDGE('',*,*,#3915,.T.); +#3918=ORIENTED_EDGE('',*,*,#3917,.T.); +#3919=EDGE_LOOP('',(#3912,#3914,#3916,#3918)); +#3920=FACE_BOUND('',#3919,.F.); +#3921=ADVANCED_FACE('',(#3740,#3750,#3760,#3770,#3780,#3790,#3800,#3810,#3820, +#3830,#3840,#3850,#3860,#3870,#3880,#3890,#3900,#3910,#3920),#3702,.T.); +#3922=CARTESIAN_POINT('',(-4.41E0,-4.039E1,-8.E-1)); +#3923=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3924=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3925=AXIS2_PLACEMENT_3D('',#3922,#3923,#3924); +#3926=PLANE('',#3925); +#3927=ORIENTED_EDGE('',*,*,#3911,.F.); +#3929=ORIENTED_EDGE('',*,*,#3928,.T.); +#3931=ORIENTED_EDGE('',*,*,#3930,.T.); +#3933=ORIENTED_EDGE('',*,*,#3932,.F.); +#3934=EDGE_LOOP('',(#3927,#3929,#3931,#3933)); +#3935=FACE_OUTER_BOUND('',#3934,.F.); +#3936=ADVANCED_FACE('',(#3935),#3926,.F.); +#3937=CARTESIAN_POINT('',(-4.06E0,-4.039E1,-8.E-1)); +#3938=DIRECTION('',(0.E0,1.E0,0.E0)); +#3939=DIRECTION('',(-1.E0,0.E0,0.E0)); +#3940=AXIS2_PLACEMENT_3D('',#3937,#3938,#3939); +#3941=PLANE('',#3940); +#3942=ORIENTED_EDGE('',*,*,#3917,.F.); +#3944=ORIENTED_EDGE('',*,*,#3943,.T.); +#3946=ORIENTED_EDGE('',*,*,#3945,.T.); +#3947=ORIENTED_EDGE('',*,*,#3928,.F.); +#3948=EDGE_LOOP('',(#3942,#3944,#3946,#3947)); +#3949=FACE_OUTER_BOUND('',#3948,.F.); +#3950=ADVANCED_FACE('',(#3949),#3941,.F.); +#3951=CARTESIAN_POINT('',(-4.06E0,-4.319E1,-8.E-1)); +#3952=DIRECTION('',(1.E0,0.E0,0.E0)); +#3953=DIRECTION('',(0.E0,1.E0,0.E0)); +#3954=AXIS2_PLACEMENT_3D('',#3951,#3952,#3953); +#3955=PLANE('',#3954); +#3956=ORIENTED_EDGE('',*,*,#3915,.F.); +#3958=ORIENTED_EDGE('',*,*,#3957,.T.); +#3960=ORIENTED_EDGE('',*,*,#3959,.T.); +#3961=ORIENTED_EDGE('',*,*,#3943,.F.); +#3962=EDGE_LOOP('',(#3956,#3958,#3960,#3961)); +#3963=FACE_OUTER_BOUND('',#3962,.F.); +#3964=ADVANCED_FACE('',(#3963),#3955,.F.); +#3965=CARTESIAN_POINT('',(-4.41E0,-4.319E1,-8.E-1)); +#3966=DIRECTION('',(0.E0,-1.E0,0.E0)); +#3967=DIRECTION('',(1.E0,0.E0,0.E0)); +#3968=AXIS2_PLACEMENT_3D('',#3965,#3966,#3967); +#3969=PLANE('',#3968); +#3970=ORIENTED_EDGE('',*,*,#3913,.F.); +#3971=ORIENTED_EDGE('',*,*,#3932,.T.); +#3973=ORIENTED_EDGE('',*,*,#3972,.T.); +#3974=ORIENTED_EDGE('',*,*,#3957,.F.); +#3975=EDGE_LOOP('',(#3970,#3971,#3973,#3974)); +#3976=FACE_OUTER_BOUND('',#3975,.F.); +#3977=ADVANCED_FACE('',(#3976),#3969,.F.); +#3978=CARTESIAN_POINT('',(0.E0,0.E0,-8.2E-1)); +#3979=DIRECTION('',(0.E0,0.E0,1.E0)); +#3980=DIRECTION('',(1.E0,0.E0,0.E0)); +#3981=AXIS2_PLACEMENT_3D('',#3978,#3979,#3980); +#3982=PLANE('',#3981); +#3983=ORIENTED_EDGE('',*,*,#3930,.F.); +#3984=ORIENTED_EDGE('',*,*,#3945,.F.); +#3985=ORIENTED_EDGE('',*,*,#3959,.F.); +#3986=ORIENTED_EDGE('',*,*,#3972,.F.); +#3987=EDGE_LOOP('',(#3983,#3984,#3985,#3986)); +#3988=FACE_OUTER_BOUND('',#3987,.F.); +#3989=ADVANCED_FACE('',(#3988),#3982,.T.); +#3990=FILL_AREA_STYLE_COLOUR('',#11); +#3991=FILL_AREA_STYLE('',(#3990)); +#3992=SURFACE_STYLE_FILL_AREA(#3991); +#3993=SURFACE_SIDE_STYLE('',(#3992)); +#3994=SURFACE_STYLE_USAGE(.POSITIVE.,#3993); +#3995=FILL_AREA_STYLE_COLOUR('',#6); +#3996=FILL_AREA_STYLE('',(#3995)); +#3997=SURFACE_STYLE_FILL_AREA(#3996); +#3998=SURFACE_SIDE_STYLE('',(#3997)); +#3999=SURFACE_STYLE_USAGE(.NEGATIVE.,#3998); +#4000=PRESENTATION_STYLE_ASSIGNMENT((#3994,#3999)); +#4001=OVER_RIDING_STYLED_ITEM('',(#4000),#3989,#15); +#4002=CARTESIAN_POINT('',(-3.91E0,-4.039E1,-8.E-1)); +#4003=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4004=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4005=AXIS2_PLACEMENT_3D('',#4002,#4003,#4004); +#4006=PLANE('',#4005); +#4007=ORIENTED_EDGE('',*,*,#3741,.F.); +#4009=ORIENTED_EDGE('',*,*,#4008,.T.); +#4011=ORIENTED_EDGE('',*,*,#4010,.T.); +#4013=ORIENTED_EDGE('',*,*,#4012,.F.); +#4014=EDGE_LOOP('',(#4007,#4009,#4011,#4013)); +#4015=FACE_OUTER_BOUND('',#4014,.F.); +#4016=ADVANCED_FACE('',(#4015),#4006,.F.); +#4017=CARTESIAN_POINT('',(-3.56E0,-4.039E1,-8.E-1)); +#4018=DIRECTION('',(0.E0,1.E0,0.E0)); +#4019=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4020=AXIS2_PLACEMENT_3D('',#4017,#4018,#4019); +#4021=PLANE('',#4020); +#4022=ORIENTED_EDGE('',*,*,#3747,.F.); +#4024=ORIENTED_EDGE('',*,*,#4023,.T.); +#4026=ORIENTED_EDGE('',*,*,#4025,.T.); +#4027=ORIENTED_EDGE('',*,*,#4008,.F.); +#4028=EDGE_LOOP('',(#4022,#4024,#4026,#4027)); +#4029=FACE_OUTER_BOUND('',#4028,.F.); +#4030=ADVANCED_FACE('',(#4029),#4021,.F.); +#4031=CARTESIAN_POINT('',(-3.56E0,-4.319E1,-8.E-1)); +#4032=DIRECTION('',(1.E0,0.E0,0.E0)); +#4033=DIRECTION('',(0.E0,1.E0,0.E0)); +#4034=AXIS2_PLACEMENT_3D('',#4031,#4032,#4033); +#4035=PLANE('',#4034); +#4036=ORIENTED_EDGE('',*,*,#3745,.F.); +#4038=ORIENTED_EDGE('',*,*,#4037,.T.); +#4040=ORIENTED_EDGE('',*,*,#4039,.T.); +#4041=ORIENTED_EDGE('',*,*,#4023,.F.); +#4042=EDGE_LOOP('',(#4036,#4038,#4040,#4041)); +#4043=FACE_OUTER_BOUND('',#4042,.F.); +#4044=ADVANCED_FACE('',(#4043),#4035,.F.); +#4045=CARTESIAN_POINT('',(-3.91E0,-4.319E1,-8.E-1)); +#4046=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4047=DIRECTION('',(1.E0,0.E0,0.E0)); +#4048=AXIS2_PLACEMENT_3D('',#4045,#4046,#4047); +#4049=PLANE('',#4048); +#4050=ORIENTED_EDGE('',*,*,#3743,.F.); +#4051=ORIENTED_EDGE('',*,*,#4012,.T.); +#4053=ORIENTED_EDGE('',*,*,#4052,.T.); +#4054=ORIENTED_EDGE('',*,*,#4037,.F.); +#4055=EDGE_LOOP('',(#4050,#4051,#4053,#4054)); +#4056=FACE_OUTER_BOUND('',#4055,.F.); +#4057=ADVANCED_FACE('',(#4056),#4049,.F.); +#4058=CARTESIAN_POINT('',(5.E-1,0.E0,-8.2E-1)); +#4059=DIRECTION('',(0.E0,0.E0,1.E0)); +#4060=DIRECTION('',(1.E0,0.E0,0.E0)); +#4061=AXIS2_PLACEMENT_3D('',#4058,#4059,#4060); +#4062=PLANE('',#4061); +#4063=ORIENTED_EDGE('',*,*,#4010,.F.); +#4064=ORIENTED_EDGE('',*,*,#4025,.F.); +#4065=ORIENTED_EDGE('',*,*,#4039,.F.); +#4066=ORIENTED_EDGE('',*,*,#4052,.F.); +#4067=EDGE_LOOP('',(#4063,#4064,#4065,#4066)); +#4068=FACE_OUTER_BOUND('',#4067,.F.); +#4069=ADVANCED_FACE('',(#4068),#4062,.T.); +#4070=FILL_AREA_STYLE_COLOUR('',#11); +#4071=FILL_AREA_STYLE('',(#4070)); +#4072=SURFACE_STYLE_FILL_AREA(#4071); +#4073=SURFACE_SIDE_STYLE('',(#4072)); +#4074=SURFACE_STYLE_USAGE(.POSITIVE.,#4073); +#4075=FILL_AREA_STYLE_COLOUR('',#6); +#4076=FILL_AREA_STYLE('',(#4075)); +#4077=SURFACE_STYLE_FILL_AREA(#4076); +#4078=SURFACE_SIDE_STYLE('',(#4077)); +#4079=SURFACE_STYLE_USAGE(.NEGATIVE.,#4078); +#4080=PRESENTATION_STYLE_ASSIGNMENT((#4074,#4079)); +#4081=OVER_RIDING_STYLED_ITEM('',(#4080),#4069,#15); +#4082=CARTESIAN_POINT('',(-3.41E0,-4.039E1,-8.E-1)); +#4083=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4084=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4085=AXIS2_PLACEMENT_3D('',#4082,#4083,#4084); +#4086=PLANE('',#4085); +#4087=ORIENTED_EDGE('',*,*,#3751,.F.); +#4089=ORIENTED_EDGE('',*,*,#4088,.T.); +#4091=ORIENTED_EDGE('',*,*,#4090,.T.); +#4093=ORIENTED_EDGE('',*,*,#4092,.F.); +#4094=EDGE_LOOP('',(#4087,#4089,#4091,#4093)); +#4095=FACE_OUTER_BOUND('',#4094,.F.); +#4096=ADVANCED_FACE('',(#4095),#4086,.F.); +#4097=CARTESIAN_POINT('',(-3.06E0,-4.039E1,-8.E-1)); +#4098=DIRECTION('',(0.E0,1.E0,0.E0)); +#4099=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4100=AXIS2_PLACEMENT_3D('',#4097,#4098,#4099); +#4101=PLANE('',#4100); +#4102=ORIENTED_EDGE('',*,*,#3757,.F.); +#4104=ORIENTED_EDGE('',*,*,#4103,.T.); +#4106=ORIENTED_EDGE('',*,*,#4105,.T.); +#4107=ORIENTED_EDGE('',*,*,#4088,.F.); +#4108=EDGE_LOOP('',(#4102,#4104,#4106,#4107)); +#4109=FACE_OUTER_BOUND('',#4108,.F.); +#4110=ADVANCED_FACE('',(#4109),#4101,.F.); +#4111=CARTESIAN_POINT('',(-3.06E0,-4.319E1,-8.E-1)); +#4112=DIRECTION('',(1.E0,0.E0,0.E0)); +#4113=DIRECTION('',(0.E0,1.E0,0.E0)); +#4114=AXIS2_PLACEMENT_3D('',#4111,#4112,#4113); +#4115=PLANE('',#4114); +#4116=ORIENTED_EDGE('',*,*,#3755,.F.); +#4118=ORIENTED_EDGE('',*,*,#4117,.T.); +#4120=ORIENTED_EDGE('',*,*,#4119,.T.); +#4121=ORIENTED_EDGE('',*,*,#4103,.F.); +#4122=EDGE_LOOP('',(#4116,#4118,#4120,#4121)); +#4123=FACE_OUTER_BOUND('',#4122,.F.); +#4124=ADVANCED_FACE('',(#4123),#4115,.F.); +#4125=CARTESIAN_POINT('',(-3.41E0,-4.319E1,-8.E-1)); +#4126=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4127=DIRECTION('',(1.E0,0.E0,0.E0)); +#4128=AXIS2_PLACEMENT_3D('',#4125,#4126,#4127); +#4129=PLANE('',#4128); +#4130=ORIENTED_EDGE('',*,*,#3753,.F.); +#4131=ORIENTED_EDGE('',*,*,#4092,.T.); +#4133=ORIENTED_EDGE('',*,*,#4132,.T.); +#4134=ORIENTED_EDGE('',*,*,#4117,.F.); +#4135=EDGE_LOOP('',(#4130,#4131,#4133,#4134)); +#4136=FACE_OUTER_BOUND('',#4135,.F.); +#4137=ADVANCED_FACE('',(#4136),#4129,.F.); +#4138=CARTESIAN_POINT('',(1.E0,0.E0,-8.2E-1)); +#4139=DIRECTION('',(0.E0,0.E0,1.E0)); +#4140=DIRECTION('',(1.E0,0.E0,0.E0)); +#4141=AXIS2_PLACEMENT_3D('',#4138,#4139,#4140); +#4142=PLANE('',#4141); +#4143=ORIENTED_EDGE('',*,*,#4090,.F.); +#4144=ORIENTED_EDGE('',*,*,#4105,.F.); +#4145=ORIENTED_EDGE('',*,*,#4119,.F.); +#4146=ORIENTED_EDGE('',*,*,#4132,.F.); +#4147=EDGE_LOOP('',(#4143,#4144,#4145,#4146)); +#4148=FACE_OUTER_BOUND('',#4147,.F.); +#4149=ADVANCED_FACE('',(#4148),#4142,.T.); +#4150=FILL_AREA_STYLE_COLOUR('',#11); +#4151=FILL_AREA_STYLE('',(#4150)); +#4152=SURFACE_STYLE_FILL_AREA(#4151); +#4153=SURFACE_SIDE_STYLE('',(#4152)); +#4154=SURFACE_STYLE_USAGE(.POSITIVE.,#4153); +#4155=FILL_AREA_STYLE_COLOUR('',#6); +#4156=FILL_AREA_STYLE('',(#4155)); +#4157=SURFACE_STYLE_FILL_AREA(#4156); +#4158=SURFACE_SIDE_STYLE('',(#4157)); +#4159=SURFACE_STYLE_USAGE(.NEGATIVE.,#4158); +#4160=PRESENTATION_STYLE_ASSIGNMENT((#4154,#4159)); +#4161=OVER_RIDING_STYLED_ITEM('',(#4160),#4149,#15); +#4162=CARTESIAN_POINT('',(-2.91E0,-4.039E1,-8.E-1)); +#4163=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4164=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4165=AXIS2_PLACEMENT_3D('',#4162,#4163,#4164); +#4166=PLANE('',#4165); +#4167=ORIENTED_EDGE('',*,*,#3761,.F.); +#4169=ORIENTED_EDGE('',*,*,#4168,.T.); +#4171=ORIENTED_EDGE('',*,*,#4170,.T.); +#4173=ORIENTED_EDGE('',*,*,#4172,.F.); +#4174=EDGE_LOOP('',(#4167,#4169,#4171,#4173)); +#4175=FACE_OUTER_BOUND('',#4174,.F.); +#4176=ADVANCED_FACE('',(#4175),#4166,.F.); +#4177=CARTESIAN_POINT('',(-2.56E0,-4.039E1,-8.E-1)); +#4178=DIRECTION('',(0.E0,1.E0,0.E0)); +#4179=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4180=AXIS2_PLACEMENT_3D('',#4177,#4178,#4179); +#4181=PLANE('',#4180); +#4182=ORIENTED_EDGE('',*,*,#3767,.F.); +#4184=ORIENTED_EDGE('',*,*,#4183,.T.); +#4186=ORIENTED_EDGE('',*,*,#4185,.T.); +#4187=ORIENTED_EDGE('',*,*,#4168,.F.); +#4188=EDGE_LOOP('',(#4182,#4184,#4186,#4187)); +#4189=FACE_OUTER_BOUND('',#4188,.F.); +#4190=ADVANCED_FACE('',(#4189),#4181,.F.); +#4191=CARTESIAN_POINT('',(-2.56E0,-4.319E1,-8.E-1)); +#4192=DIRECTION('',(1.E0,0.E0,0.E0)); +#4193=DIRECTION('',(0.E0,1.E0,0.E0)); +#4194=AXIS2_PLACEMENT_3D('',#4191,#4192,#4193); +#4195=PLANE('',#4194); +#4196=ORIENTED_EDGE('',*,*,#3765,.F.); +#4198=ORIENTED_EDGE('',*,*,#4197,.T.); +#4200=ORIENTED_EDGE('',*,*,#4199,.T.); +#4201=ORIENTED_EDGE('',*,*,#4183,.F.); +#4202=EDGE_LOOP('',(#4196,#4198,#4200,#4201)); +#4203=FACE_OUTER_BOUND('',#4202,.F.); +#4204=ADVANCED_FACE('',(#4203),#4195,.F.); +#4205=CARTESIAN_POINT('',(-2.91E0,-4.319E1,-8.E-1)); +#4206=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4207=DIRECTION('',(1.E0,0.E0,0.E0)); +#4208=AXIS2_PLACEMENT_3D('',#4205,#4206,#4207); +#4209=PLANE('',#4208); +#4210=ORIENTED_EDGE('',*,*,#3763,.F.); +#4211=ORIENTED_EDGE('',*,*,#4172,.T.); +#4213=ORIENTED_EDGE('',*,*,#4212,.T.); +#4214=ORIENTED_EDGE('',*,*,#4197,.F.); +#4215=EDGE_LOOP('',(#4210,#4211,#4213,#4214)); +#4216=FACE_OUTER_BOUND('',#4215,.F.); +#4217=ADVANCED_FACE('',(#4216),#4209,.F.); +#4218=CARTESIAN_POINT('',(1.5E0,0.E0,-8.2E-1)); +#4219=DIRECTION('',(0.E0,0.E0,1.E0)); +#4220=DIRECTION('',(1.E0,0.E0,0.E0)); +#4221=AXIS2_PLACEMENT_3D('',#4218,#4219,#4220); +#4222=PLANE('',#4221); +#4223=ORIENTED_EDGE('',*,*,#4170,.F.); +#4224=ORIENTED_EDGE('',*,*,#4185,.F.); +#4225=ORIENTED_EDGE('',*,*,#4199,.F.); +#4226=ORIENTED_EDGE('',*,*,#4212,.F.); +#4227=EDGE_LOOP('',(#4223,#4224,#4225,#4226)); +#4228=FACE_OUTER_BOUND('',#4227,.F.); +#4229=ADVANCED_FACE('',(#4228),#4222,.T.); +#4230=FILL_AREA_STYLE_COLOUR('',#11); +#4231=FILL_AREA_STYLE('',(#4230)); +#4232=SURFACE_STYLE_FILL_AREA(#4231); +#4233=SURFACE_SIDE_STYLE('',(#4232)); +#4234=SURFACE_STYLE_USAGE(.POSITIVE.,#4233); +#4235=FILL_AREA_STYLE_COLOUR('',#6); +#4236=FILL_AREA_STYLE('',(#4235)); +#4237=SURFACE_STYLE_FILL_AREA(#4236); +#4238=SURFACE_SIDE_STYLE('',(#4237)); +#4239=SURFACE_STYLE_USAGE(.NEGATIVE.,#4238); +#4240=PRESENTATION_STYLE_ASSIGNMENT((#4234,#4239)); +#4241=OVER_RIDING_STYLED_ITEM('',(#4240),#4229,#15); +#4242=CARTESIAN_POINT('',(-2.41E0,-4.039E1,-8.E-1)); +#4243=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4244=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4245=AXIS2_PLACEMENT_3D('',#4242,#4243,#4244); +#4246=PLANE('',#4245); +#4247=ORIENTED_EDGE('',*,*,#3771,.F.); +#4249=ORIENTED_EDGE('',*,*,#4248,.T.); +#4251=ORIENTED_EDGE('',*,*,#4250,.T.); +#4253=ORIENTED_EDGE('',*,*,#4252,.F.); +#4254=EDGE_LOOP('',(#4247,#4249,#4251,#4253)); +#4255=FACE_OUTER_BOUND('',#4254,.F.); +#4256=ADVANCED_FACE('',(#4255),#4246,.F.); +#4257=CARTESIAN_POINT('',(-2.06E0,-4.039E1,-8.E-1)); +#4258=DIRECTION('',(0.E0,1.E0,0.E0)); +#4259=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4260=AXIS2_PLACEMENT_3D('',#4257,#4258,#4259); +#4261=PLANE('',#4260); +#4262=ORIENTED_EDGE('',*,*,#3777,.F.); +#4264=ORIENTED_EDGE('',*,*,#4263,.T.); +#4266=ORIENTED_EDGE('',*,*,#4265,.T.); +#4267=ORIENTED_EDGE('',*,*,#4248,.F.); +#4268=EDGE_LOOP('',(#4262,#4264,#4266,#4267)); +#4269=FACE_OUTER_BOUND('',#4268,.F.); +#4270=ADVANCED_FACE('',(#4269),#4261,.F.); +#4271=CARTESIAN_POINT('',(-2.06E0,-4.319E1,-8.E-1)); +#4272=DIRECTION('',(1.E0,0.E0,0.E0)); +#4273=DIRECTION('',(0.E0,1.E0,0.E0)); +#4274=AXIS2_PLACEMENT_3D('',#4271,#4272,#4273); +#4275=PLANE('',#4274); +#4276=ORIENTED_EDGE('',*,*,#3775,.F.); +#4278=ORIENTED_EDGE('',*,*,#4277,.T.); +#4280=ORIENTED_EDGE('',*,*,#4279,.T.); +#4281=ORIENTED_EDGE('',*,*,#4263,.F.); +#4282=EDGE_LOOP('',(#4276,#4278,#4280,#4281)); +#4283=FACE_OUTER_BOUND('',#4282,.F.); +#4284=ADVANCED_FACE('',(#4283),#4275,.F.); +#4285=CARTESIAN_POINT('',(-2.41E0,-4.319E1,-8.E-1)); +#4286=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4287=DIRECTION('',(1.E0,0.E0,0.E0)); +#4288=AXIS2_PLACEMENT_3D('',#4285,#4286,#4287); +#4289=PLANE('',#4288); +#4290=ORIENTED_EDGE('',*,*,#3773,.F.); +#4291=ORIENTED_EDGE('',*,*,#4252,.T.); +#4293=ORIENTED_EDGE('',*,*,#4292,.T.); +#4294=ORIENTED_EDGE('',*,*,#4277,.F.); +#4295=EDGE_LOOP('',(#4290,#4291,#4293,#4294)); +#4296=FACE_OUTER_BOUND('',#4295,.F.); +#4297=ADVANCED_FACE('',(#4296),#4289,.F.); +#4298=CARTESIAN_POINT('',(2.E0,0.E0,-8.2E-1)); +#4299=DIRECTION('',(0.E0,0.E0,1.E0)); +#4300=DIRECTION('',(1.E0,0.E0,0.E0)); +#4301=AXIS2_PLACEMENT_3D('',#4298,#4299,#4300); +#4302=PLANE('',#4301); +#4303=ORIENTED_EDGE('',*,*,#4250,.F.); +#4304=ORIENTED_EDGE('',*,*,#4265,.F.); +#4305=ORIENTED_EDGE('',*,*,#4279,.F.); +#4306=ORIENTED_EDGE('',*,*,#4292,.F.); +#4307=EDGE_LOOP('',(#4303,#4304,#4305,#4306)); +#4308=FACE_OUTER_BOUND('',#4307,.F.); +#4309=ADVANCED_FACE('',(#4308),#4302,.T.); +#4310=FILL_AREA_STYLE_COLOUR('',#11); +#4311=FILL_AREA_STYLE('',(#4310)); +#4312=SURFACE_STYLE_FILL_AREA(#4311); +#4313=SURFACE_SIDE_STYLE('',(#4312)); +#4314=SURFACE_STYLE_USAGE(.POSITIVE.,#4313); +#4315=FILL_AREA_STYLE_COLOUR('',#6); +#4316=FILL_AREA_STYLE('',(#4315)); +#4317=SURFACE_STYLE_FILL_AREA(#4316); +#4318=SURFACE_SIDE_STYLE('',(#4317)); +#4319=SURFACE_STYLE_USAGE(.NEGATIVE.,#4318); +#4320=PRESENTATION_STYLE_ASSIGNMENT((#4314,#4319)); +#4321=OVER_RIDING_STYLED_ITEM('',(#4320),#4309,#15); +#4322=CARTESIAN_POINT('',(-1.91E0,-4.039E1,-8.E-1)); +#4323=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4324=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4325=AXIS2_PLACEMENT_3D('',#4322,#4323,#4324); +#4326=PLANE('',#4325); +#4327=ORIENTED_EDGE('',*,*,#3781,.F.); +#4329=ORIENTED_EDGE('',*,*,#4328,.T.); +#4331=ORIENTED_EDGE('',*,*,#4330,.T.); +#4333=ORIENTED_EDGE('',*,*,#4332,.F.); +#4334=EDGE_LOOP('',(#4327,#4329,#4331,#4333)); +#4335=FACE_OUTER_BOUND('',#4334,.F.); +#4336=ADVANCED_FACE('',(#4335),#4326,.F.); +#4337=CARTESIAN_POINT('',(-1.56E0,-4.039E1,-8.E-1)); +#4338=DIRECTION('',(0.E0,1.E0,0.E0)); +#4339=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4340=AXIS2_PLACEMENT_3D('',#4337,#4338,#4339); +#4341=PLANE('',#4340); +#4342=ORIENTED_EDGE('',*,*,#3787,.F.); +#4344=ORIENTED_EDGE('',*,*,#4343,.T.); +#4346=ORIENTED_EDGE('',*,*,#4345,.T.); +#4347=ORIENTED_EDGE('',*,*,#4328,.F.); +#4348=EDGE_LOOP('',(#4342,#4344,#4346,#4347)); +#4349=FACE_OUTER_BOUND('',#4348,.F.); +#4350=ADVANCED_FACE('',(#4349),#4341,.F.); +#4351=CARTESIAN_POINT('',(-1.56E0,-4.319E1,-8.E-1)); +#4352=DIRECTION('',(1.E0,0.E0,0.E0)); +#4353=DIRECTION('',(0.E0,1.E0,0.E0)); +#4354=AXIS2_PLACEMENT_3D('',#4351,#4352,#4353); +#4355=PLANE('',#4354); +#4356=ORIENTED_EDGE('',*,*,#3785,.F.); +#4358=ORIENTED_EDGE('',*,*,#4357,.T.); +#4360=ORIENTED_EDGE('',*,*,#4359,.T.); +#4361=ORIENTED_EDGE('',*,*,#4343,.F.); +#4362=EDGE_LOOP('',(#4356,#4358,#4360,#4361)); +#4363=FACE_OUTER_BOUND('',#4362,.F.); +#4364=ADVANCED_FACE('',(#4363),#4355,.F.); +#4365=CARTESIAN_POINT('',(-1.91E0,-4.319E1,-8.E-1)); +#4366=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4367=DIRECTION('',(1.E0,0.E0,0.E0)); +#4368=AXIS2_PLACEMENT_3D('',#4365,#4366,#4367); +#4369=PLANE('',#4368); +#4370=ORIENTED_EDGE('',*,*,#3783,.F.); +#4371=ORIENTED_EDGE('',*,*,#4332,.T.); +#4373=ORIENTED_EDGE('',*,*,#4372,.T.); +#4374=ORIENTED_EDGE('',*,*,#4357,.F.); +#4375=EDGE_LOOP('',(#4370,#4371,#4373,#4374)); +#4376=FACE_OUTER_BOUND('',#4375,.F.); +#4377=ADVANCED_FACE('',(#4376),#4369,.F.); +#4378=CARTESIAN_POINT('',(2.5E0,0.E0,-8.2E-1)); +#4379=DIRECTION('',(0.E0,0.E0,1.E0)); +#4380=DIRECTION('',(1.E0,0.E0,0.E0)); +#4381=AXIS2_PLACEMENT_3D('',#4378,#4379,#4380); +#4382=PLANE('',#4381); +#4383=ORIENTED_EDGE('',*,*,#4330,.F.); +#4384=ORIENTED_EDGE('',*,*,#4345,.F.); +#4385=ORIENTED_EDGE('',*,*,#4359,.F.); +#4386=ORIENTED_EDGE('',*,*,#4372,.F.); +#4387=EDGE_LOOP('',(#4383,#4384,#4385,#4386)); +#4388=FACE_OUTER_BOUND('',#4387,.F.); +#4389=ADVANCED_FACE('',(#4388),#4382,.T.); +#4390=FILL_AREA_STYLE_COLOUR('',#11); +#4391=FILL_AREA_STYLE('',(#4390)); +#4392=SURFACE_STYLE_FILL_AREA(#4391); +#4393=SURFACE_SIDE_STYLE('',(#4392)); +#4394=SURFACE_STYLE_USAGE(.POSITIVE.,#4393); +#4395=FILL_AREA_STYLE_COLOUR('',#6); +#4396=FILL_AREA_STYLE('',(#4395)); +#4397=SURFACE_STYLE_FILL_AREA(#4396); +#4398=SURFACE_SIDE_STYLE('',(#4397)); +#4399=SURFACE_STYLE_USAGE(.NEGATIVE.,#4398); +#4400=PRESENTATION_STYLE_ASSIGNMENT((#4394,#4399)); +#4401=OVER_RIDING_STYLED_ITEM('',(#4400),#4389,#15); +#4402=CARTESIAN_POINT('',(-1.41E0,-4.039E1,-8.E-1)); +#4403=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4404=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4405=AXIS2_PLACEMENT_3D('',#4402,#4403,#4404); +#4406=PLANE('',#4405); +#4407=ORIENTED_EDGE('',*,*,#3791,.F.); +#4409=ORIENTED_EDGE('',*,*,#4408,.T.); +#4411=ORIENTED_EDGE('',*,*,#4410,.T.); +#4413=ORIENTED_EDGE('',*,*,#4412,.F.); +#4414=EDGE_LOOP('',(#4407,#4409,#4411,#4413)); +#4415=FACE_OUTER_BOUND('',#4414,.F.); +#4416=ADVANCED_FACE('',(#4415),#4406,.F.); +#4417=CARTESIAN_POINT('',(-1.06E0,-4.039E1,-8.E-1)); +#4418=DIRECTION('',(0.E0,1.E0,0.E0)); +#4419=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4420=AXIS2_PLACEMENT_3D('',#4417,#4418,#4419); +#4421=PLANE('',#4420); +#4422=ORIENTED_EDGE('',*,*,#3797,.F.); +#4424=ORIENTED_EDGE('',*,*,#4423,.T.); +#4426=ORIENTED_EDGE('',*,*,#4425,.T.); +#4427=ORIENTED_EDGE('',*,*,#4408,.F.); +#4428=EDGE_LOOP('',(#4422,#4424,#4426,#4427)); +#4429=FACE_OUTER_BOUND('',#4428,.F.); +#4430=ADVANCED_FACE('',(#4429),#4421,.F.); +#4431=CARTESIAN_POINT('',(-1.06E0,-4.319E1,-8.E-1)); +#4432=DIRECTION('',(1.E0,0.E0,0.E0)); +#4433=DIRECTION('',(0.E0,1.E0,0.E0)); +#4434=AXIS2_PLACEMENT_3D('',#4431,#4432,#4433); +#4435=PLANE('',#4434); +#4436=ORIENTED_EDGE('',*,*,#3795,.F.); +#4438=ORIENTED_EDGE('',*,*,#4437,.T.); +#4440=ORIENTED_EDGE('',*,*,#4439,.T.); +#4441=ORIENTED_EDGE('',*,*,#4423,.F.); +#4442=EDGE_LOOP('',(#4436,#4438,#4440,#4441)); +#4443=FACE_OUTER_BOUND('',#4442,.F.); +#4444=ADVANCED_FACE('',(#4443),#4435,.F.); +#4445=CARTESIAN_POINT('',(-1.41E0,-4.319E1,-8.E-1)); +#4446=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4447=DIRECTION('',(1.E0,0.E0,0.E0)); +#4448=AXIS2_PLACEMENT_3D('',#4445,#4446,#4447); +#4449=PLANE('',#4448); +#4450=ORIENTED_EDGE('',*,*,#3793,.F.); +#4451=ORIENTED_EDGE('',*,*,#4412,.T.); +#4453=ORIENTED_EDGE('',*,*,#4452,.T.); +#4454=ORIENTED_EDGE('',*,*,#4437,.F.); +#4455=EDGE_LOOP('',(#4450,#4451,#4453,#4454)); +#4456=FACE_OUTER_BOUND('',#4455,.F.); +#4457=ADVANCED_FACE('',(#4456),#4449,.F.); +#4458=CARTESIAN_POINT('',(3.E0,0.E0,-8.2E-1)); +#4459=DIRECTION('',(0.E0,0.E0,1.E0)); +#4460=DIRECTION('',(1.E0,0.E0,0.E0)); +#4461=AXIS2_PLACEMENT_3D('',#4458,#4459,#4460); +#4462=PLANE('',#4461); +#4463=ORIENTED_EDGE('',*,*,#4410,.F.); +#4464=ORIENTED_EDGE('',*,*,#4425,.F.); +#4465=ORIENTED_EDGE('',*,*,#4439,.F.); +#4466=ORIENTED_EDGE('',*,*,#4452,.F.); +#4467=EDGE_LOOP('',(#4463,#4464,#4465,#4466)); +#4468=FACE_OUTER_BOUND('',#4467,.F.); +#4469=ADVANCED_FACE('',(#4468),#4462,.T.); +#4470=FILL_AREA_STYLE_COLOUR('',#11); +#4471=FILL_AREA_STYLE('',(#4470)); +#4472=SURFACE_STYLE_FILL_AREA(#4471); +#4473=SURFACE_SIDE_STYLE('',(#4472)); +#4474=SURFACE_STYLE_USAGE(.POSITIVE.,#4473); +#4475=FILL_AREA_STYLE_COLOUR('',#6); +#4476=FILL_AREA_STYLE('',(#4475)); +#4477=SURFACE_STYLE_FILL_AREA(#4476); +#4478=SURFACE_SIDE_STYLE('',(#4477)); +#4479=SURFACE_STYLE_USAGE(.NEGATIVE.,#4478); +#4480=PRESENTATION_STYLE_ASSIGNMENT((#4474,#4479)); +#4481=OVER_RIDING_STYLED_ITEM('',(#4480),#4469,#15); +#4482=CARTESIAN_POINT('',(-9.1E-1,-4.039E1,-8.E-1)); +#4483=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4484=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4485=AXIS2_PLACEMENT_3D('',#4482,#4483,#4484); +#4486=PLANE('',#4485); +#4487=ORIENTED_EDGE('',*,*,#3801,.F.); +#4489=ORIENTED_EDGE('',*,*,#4488,.T.); +#4491=ORIENTED_EDGE('',*,*,#4490,.T.); +#4493=ORIENTED_EDGE('',*,*,#4492,.F.); +#4494=EDGE_LOOP('',(#4487,#4489,#4491,#4493)); +#4495=FACE_OUTER_BOUND('',#4494,.F.); +#4496=ADVANCED_FACE('',(#4495),#4486,.F.); +#4497=CARTESIAN_POINT('',(-5.6E-1,-4.039E1,-8.E-1)); +#4498=DIRECTION('',(0.E0,1.E0,0.E0)); +#4499=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4500=AXIS2_PLACEMENT_3D('',#4497,#4498,#4499); +#4501=PLANE('',#4500); +#4502=ORIENTED_EDGE('',*,*,#3807,.F.); +#4504=ORIENTED_EDGE('',*,*,#4503,.T.); +#4506=ORIENTED_EDGE('',*,*,#4505,.T.); +#4507=ORIENTED_EDGE('',*,*,#4488,.F.); +#4508=EDGE_LOOP('',(#4502,#4504,#4506,#4507)); +#4509=FACE_OUTER_BOUND('',#4508,.F.); +#4510=ADVANCED_FACE('',(#4509),#4501,.F.); +#4511=CARTESIAN_POINT('',(-5.6E-1,-4.319E1,-8.E-1)); +#4512=DIRECTION('',(1.E0,0.E0,0.E0)); +#4513=DIRECTION('',(0.E0,1.E0,0.E0)); +#4514=AXIS2_PLACEMENT_3D('',#4511,#4512,#4513); +#4515=PLANE('',#4514); +#4516=ORIENTED_EDGE('',*,*,#3805,.F.); +#4518=ORIENTED_EDGE('',*,*,#4517,.T.); +#4520=ORIENTED_EDGE('',*,*,#4519,.T.); +#4521=ORIENTED_EDGE('',*,*,#4503,.F.); +#4522=EDGE_LOOP('',(#4516,#4518,#4520,#4521)); +#4523=FACE_OUTER_BOUND('',#4522,.F.); +#4524=ADVANCED_FACE('',(#4523),#4515,.F.); +#4525=CARTESIAN_POINT('',(-9.1E-1,-4.319E1,-8.E-1)); +#4526=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4527=DIRECTION('',(1.E0,0.E0,0.E0)); +#4528=AXIS2_PLACEMENT_3D('',#4525,#4526,#4527); +#4529=PLANE('',#4528); +#4530=ORIENTED_EDGE('',*,*,#3803,.F.); +#4531=ORIENTED_EDGE('',*,*,#4492,.T.); +#4533=ORIENTED_EDGE('',*,*,#4532,.T.); +#4534=ORIENTED_EDGE('',*,*,#4517,.F.); +#4535=EDGE_LOOP('',(#4530,#4531,#4533,#4534)); +#4536=FACE_OUTER_BOUND('',#4535,.F.); +#4537=ADVANCED_FACE('',(#4536),#4529,.F.); +#4538=CARTESIAN_POINT('',(3.5E0,0.E0,-8.2E-1)); +#4539=DIRECTION('',(0.E0,0.E0,1.E0)); +#4540=DIRECTION('',(1.E0,0.E0,0.E0)); +#4541=AXIS2_PLACEMENT_3D('',#4538,#4539,#4540); +#4542=PLANE('',#4541); +#4543=ORIENTED_EDGE('',*,*,#4490,.F.); +#4544=ORIENTED_EDGE('',*,*,#4505,.F.); +#4545=ORIENTED_EDGE('',*,*,#4519,.F.); +#4546=ORIENTED_EDGE('',*,*,#4532,.F.); +#4547=EDGE_LOOP('',(#4543,#4544,#4545,#4546)); +#4548=FACE_OUTER_BOUND('',#4547,.F.); +#4549=ADVANCED_FACE('',(#4548),#4542,.T.); +#4550=FILL_AREA_STYLE_COLOUR('',#11); +#4551=FILL_AREA_STYLE('',(#4550)); +#4552=SURFACE_STYLE_FILL_AREA(#4551); +#4553=SURFACE_SIDE_STYLE('',(#4552)); +#4554=SURFACE_STYLE_USAGE(.POSITIVE.,#4553); +#4555=FILL_AREA_STYLE_COLOUR('',#6); +#4556=FILL_AREA_STYLE('',(#4555)); +#4557=SURFACE_STYLE_FILL_AREA(#4556); +#4558=SURFACE_SIDE_STYLE('',(#4557)); +#4559=SURFACE_STYLE_USAGE(.NEGATIVE.,#4558); +#4560=PRESENTATION_STYLE_ASSIGNMENT((#4554,#4559)); +#4561=OVER_RIDING_STYLED_ITEM('',(#4560),#4549,#15); +#4562=CARTESIAN_POINT('',(-4.1E-1,-4.039E1,-8.E-1)); +#4563=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4564=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4565=AXIS2_PLACEMENT_3D('',#4562,#4563,#4564); +#4566=PLANE('',#4565); +#4567=ORIENTED_EDGE('',*,*,#3811,.F.); +#4569=ORIENTED_EDGE('',*,*,#4568,.T.); +#4571=ORIENTED_EDGE('',*,*,#4570,.T.); +#4573=ORIENTED_EDGE('',*,*,#4572,.F.); +#4574=EDGE_LOOP('',(#4567,#4569,#4571,#4573)); +#4575=FACE_OUTER_BOUND('',#4574,.F.); +#4576=ADVANCED_FACE('',(#4575),#4566,.F.); +#4577=CARTESIAN_POINT('',(-6.E-2,-4.039E1,-8.E-1)); +#4578=DIRECTION('',(0.E0,1.E0,0.E0)); +#4579=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4580=AXIS2_PLACEMENT_3D('',#4577,#4578,#4579); +#4581=PLANE('',#4580); +#4582=ORIENTED_EDGE('',*,*,#3817,.F.); +#4584=ORIENTED_EDGE('',*,*,#4583,.T.); +#4586=ORIENTED_EDGE('',*,*,#4585,.T.); +#4587=ORIENTED_EDGE('',*,*,#4568,.F.); +#4588=EDGE_LOOP('',(#4582,#4584,#4586,#4587)); +#4589=FACE_OUTER_BOUND('',#4588,.F.); +#4590=ADVANCED_FACE('',(#4589),#4581,.F.); +#4591=CARTESIAN_POINT('',(-6.E-2,-4.319E1,-8.E-1)); +#4592=DIRECTION('',(1.E0,0.E0,0.E0)); +#4593=DIRECTION('',(0.E0,1.E0,0.E0)); +#4594=AXIS2_PLACEMENT_3D('',#4591,#4592,#4593); +#4595=PLANE('',#4594); +#4596=ORIENTED_EDGE('',*,*,#3815,.F.); +#4598=ORIENTED_EDGE('',*,*,#4597,.T.); +#4600=ORIENTED_EDGE('',*,*,#4599,.T.); +#4601=ORIENTED_EDGE('',*,*,#4583,.F.); +#4602=EDGE_LOOP('',(#4596,#4598,#4600,#4601)); +#4603=FACE_OUTER_BOUND('',#4602,.F.); +#4604=ADVANCED_FACE('',(#4603),#4595,.F.); +#4605=CARTESIAN_POINT('',(-4.1E-1,-4.319E1,-8.E-1)); +#4606=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4607=DIRECTION('',(1.E0,0.E0,0.E0)); +#4608=AXIS2_PLACEMENT_3D('',#4605,#4606,#4607); +#4609=PLANE('',#4608); +#4610=ORIENTED_EDGE('',*,*,#3813,.F.); +#4611=ORIENTED_EDGE('',*,*,#4572,.T.); +#4613=ORIENTED_EDGE('',*,*,#4612,.T.); +#4614=ORIENTED_EDGE('',*,*,#4597,.F.); +#4615=EDGE_LOOP('',(#4610,#4611,#4613,#4614)); +#4616=FACE_OUTER_BOUND('',#4615,.F.); +#4617=ADVANCED_FACE('',(#4616),#4609,.F.); +#4618=CARTESIAN_POINT('',(4.E0,0.E0,-8.2E-1)); +#4619=DIRECTION('',(0.E0,0.E0,1.E0)); +#4620=DIRECTION('',(1.E0,0.E0,0.E0)); +#4621=AXIS2_PLACEMENT_3D('',#4618,#4619,#4620); +#4622=PLANE('',#4621); +#4623=ORIENTED_EDGE('',*,*,#4570,.F.); +#4624=ORIENTED_EDGE('',*,*,#4585,.F.); +#4625=ORIENTED_EDGE('',*,*,#4599,.F.); +#4626=ORIENTED_EDGE('',*,*,#4612,.F.); +#4627=EDGE_LOOP('',(#4623,#4624,#4625,#4626)); +#4628=FACE_OUTER_BOUND('',#4627,.F.); +#4629=ADVANCED_FACE('',(#4628),#4622,.T.); +#4630=FILL_AREA_STYLE_COLOUR('',#11); +#4631=FILL_AREA_STYLE('',(#4630)); +#4632=SURFACE_STYLE_FILL_AREA(#4631); +#4633=SURFACE_SIDE_STYLE('',(#4632)); +#4634=SURFACE_STYLE_USAGE(.POSITIVE.,#4633); +#4635=FILL_AREA_STYLE_COLOUR('',#6); +#4636=FILL_AREA_STYLE('',(#4635)); +#4637=SURFACE_STYLE_FILL_AREA(#4636); +#4638=SURFACE_SIDE_STYLE('',(#4637)); +#4639=SURFACE_STYLE_USAGE(.NEGATIVE.,#4638); +#4640=PRESENTATION_STYLE_ASSIGNMENT((#4634,#4639)); +#4641=OVER_RIDING_STYLED_ITEM('',(#4640),#4629,#15); +#4642=CARTESIAN_POINT('',(9.E-2,-4.039E1,-8.E-1)); +#4643=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4644=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4645=AXIS2_PLACEMENT_3D('',#4642,#4643,#4644); +#4646=PLANE('',#4645); +#4647=ORIENTED_EDGE('',*,*,#3821,.F.); +#4649=ORIENTED_EDGE('',*,*,#4648,.T.); +#4651=ORIENTED_EDGE('',*,*,#4650,.T.); +#4653=ORIENTED_EDGE('',*,*,#4652,.F.); +#4654=EDGE_LOOP('',(#4647,#4649,#4651,#4653)); +#4655=FACE_OUTER_BOUND('',#4654,.F.); +#4656=ADVANCED_FACE('',(#4655),#4646,.F.); +#4657=CARTESIAN_POINT('',(4.4E-1,-4.039E1,-8.E-1)); +#4658=DIRECTION('',(0.E0,1.E0,0.E0)); +#4659=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4660=AXIS2_PLACEMENT_3D('',#4657,#4658,#4659); +#4661=PLANE('',#4660); +#4662=ORIENTED_EDGE('',*,*,#3827,.F.); +#4664=ORIENTED_EDGE('',*,*,#4663,.T.); +#4666=ORIENTED_EDGE('',*,*,#4665,.T.); +#4667=ORIENTED_EDGE('',*,*,#4648,.F.); +#4668=EDGE_LOOP('',(#4662,#4664,#4666,#4667)); +#4669=FACE_OUTER_BOUND('',#4668,.F.); +#4670=ADVANCED_FACE('',(#4669),#4661,.F.); +#4671=CARTESIAN_POINT('',(4.4E-1,-4.319E1,-8.E-1)); +#4672=DIRECTION('',(1.E0,0.E0,0.E0)); +#4673=DIRECTION('',(0.E0,1.E0,0.E0)); +#4674=AXIS2_PLACEMENT_3D('',#4671,#4672,#4673); +#4675=PLANE('',#4674); +#4676=ORIENTED_EDGE('',*,*,#3825,.F.); +#4678=ORIENTED_EDGE('',*,*,#4677,.T.); +#4680=ORIENTED_EDGE('',*,*,#4679,.T.); +#4681=ORIENTED_EDGE('',*,*,#4663,.F.); +#4682=EDGE_LOOP('',(#4676,#4678,#4680,#4681)); +#4683=FACE_OUTER_BOUND('',#4682,.F.); +#4684=ADVANCED_FACE('',(#4683),#4675,.F.); +#4685=CARTESIAN_POINT('',(9.E-2,-4.319E1,-8.E-1)); +#4686=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4687=DIRECTION('',(1.E0,0.E0,0.E0)); +#4688=AXIS2_PLACEMENT_3D('',#4685,#4686,#4687); +#4689=PLANE('',#4688); +#4690=ORIENTED_EDGE('',*,*,#3823,.F.); +#4691=ORIENTED_EDGE('',*,*,#4652,.T.); +#4693=ORIENTED_EDGE('',*,*,#4692,.T.); +#4694=ORIENTED_EDGE('',*,*,#4677,.F.); +#4695=EDGE_LOOP('',(#4690,#4691,#4693,#4694)); +#4696=FACE_OUTER_BOUND('',#4695,.F.); +#4697=ADVANCED_FACE('',(#4696),#4689,.F.); +#4698=CARTESIAN_POINT('',(4.5E0,0.E0,-8.2E-1)); +#4699=DIRECTION('',(0.E0,0.E0,1.E0)); +#4700=DIRECTION('',(1.E0,0.E0,0.E0)); +#4701=AXIS2_PLACEMENT_3D('',#4698,#4699,#4700); +#4702=PLANE('',#4701); +#4703=ORIENTED_EDGE('',*,*,#4650,.F.); +#4704=ORIENTED_EDGE('',*,*,#4665,.F.); +#4705=ORIENTED_EDGE('',*,*,#4679,.F.); +#4706=ORIENTED_EDGE('',*,*,#4692,.F.); +#4707=EDGE_LOOP('',(#4703,#4704,#4705,#4706)); +#4708=FACE_OUTER_BOUND('',#4707,.F.); +#4709=ADVANCED_FACE('',(#4708),#4702,.T.); +#4710=FILL_AREA_STYLE_COLOUR('',#11); +#4711=FILL_AREA_STYLE('',(#4710)); +#4712=SURFACE_STYLE_FILL_AREA(#4711); +#4713=SURFACE_SIDE_STYLE('',(#4712)); +#4714=SURFACE_STYLE_USAGE(.POSITIVE.,#4713); +#4715=FILL_AREA_STYLE_COLOUR('',#6); +#4716=FILL_AREA_STYLE('',(#4715)); +#4717=SURFACE_STYLE_FILL_AREA(#4716); +#4718=SURFACE_SIDE_STYLE('',(#4717)); +#4719=SURFACE_STYLE_USAGE(.NEGATIVE.,#4718); +#4720=PRESENTATION_STYLE_ASSIGNMENT((#4714,#4719)); +#4721=OVER_RIDING_STYLED_ITEM('',(#4720),#4709,#15); +#4722=CARTESIAN_POINT('',(5.9E-1,-4.039E1,-8.E-1)); +#4723=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4724=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4725=AXIS2_PLACEMENT_3D('',#4722,#4723,#4724); +#4726=PLANE('',#4725); +#4727=ORIENTED_EDGE('',*,*,#3831,.F.); +#4729=ORIENTED_EDGE('',*,*,#4728,.T.); +#4731=ORIENTED_EDGE('',*,*,#4730,.T.); +#4733=ORIENTED_EDGE('',*,*,#4732,.F.); +#4734=EDGE_LOOP('',(#4727,#4729,#4731,#4733)); +#4735=FACE_OUTER_BOUND('',#4734,.F.); +#4736=ADVANCED_FACE('',(#4735),#4726,.F.); +#4737=CARTESIAN_POINT('',(9.4E-1,-4.039E1,-8.E-1)); +#4738=DIRECTION('',(0.E0,1.E0,0.E0)); +#4739=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4740=AXIS2_PLACEMENT_3D('',#4737,#4738,#4739); +#4741=PLANE('',#4740); +#4742=ORIENTED_EDGE('',*,*,#3837,.F.); +#4744=ORIENTED_EDGE('',*,*,#4743,.T.); +#4746=ORIENTED_EDGE('',*,*,#4745,.T.); +#4747=ORIENTED_EDGE('',*,*,#4728,.F.); +#4748=EDGE_LOOP('',(#4742,#4744,#4746,#4747)); +#4749=FACE_OUTER_BOUND('',#4748,.F.); +#4750=ADVANCED_FACE('',(#4749),#4741,.F.); +#4751=CARTESIAN_POINT('',(9.4E-1,-4.319E1,-8.E-1)); +#4752=DIRECTION('',(1.E0,0.E0,0.E0)); +#4753=DIRECTION('',(0.E0,1.E0,0.E0)); +#4754=AXIS2_PLACEMENT_3D('',#4751,#4752,#4753); +#4755=PLANE('',#4754); +#4756=ORIENTED_EDGE('',*,*,#3835,.F.); +#4758=ORIENTED_EDGE('',*,*,#4757,.T.); +#4760=ORIENTED_EDGE('',*,*,#4759,.T.); +#4761=ORIENTED_EDGE('',*,*,#4743,.F.); +#4762=EDGE_LOOP('',(#4756,#4758,#4760,#4761)); +#4763=FACE_OUTER_BOUND('',#4762,.F.); +#4764=ADVANCED_FACE('',(#4763),#4755,.F.); +#4765=CARTESIAN_POINT('',(5.9E-1,-4.319E1,-8.E-1)); +#4766=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4767=DIRECTION('',(1.E0,0.E0,0.E0)); +#4768=AXIS2_PLACEMENT_3D('',#4765,#4766,#4767); +#4769=PLANE('',#4768); +#4770=ORIENTED_EDGE('',*,*,#3833,.F.); +#4771=ORIENTED_EDGE('',*,*,#4732,.T.); +#4773=ORIENTED_EDGE('',*,*,#4772,.T.); +#4774=ORIENTED_EDGE('',*,*,#4757,.F.); +#4775=EDGE_LOOP('',(#4770,#4771,#4773,#4774)); +#4776=FACE_OUTER_BOUND('',#4775,.F.); +#4777=ADVANCED_FACE('',(#4776),#4769,.F.); +#4778=CARTESIAN_POINT('',(5.E0,0.E0,-8.2E-1)); +#4779=DIRECTION('',(0.E0,0.E0,1.E0)); +#4780=DIRECTION('',(1.E0,0.E0,0.E0)); +#4781=AXIS2_PLACEMENT_3D('',#4778,#4779,#4780); +#4782=PLANE('',#4781); +#4783=ORIENTED_EDGE('',*,*,#4730,.F.); +#4784=ORIENTED_EDGE('',*,*,#4745,.F.); +#4785=ORIENTED_EDGE('',*,*,#4759,.F.); +#4786=ORIENTED_EDGE('',*,*,#4772,.F.); +#4787=EDGE_LOOP('',(#4783,#4784,#4785,#4786)); +#4788=FACE_OUTER_BOUND('',#4787,.F.); +#4789=ADVANCED_FACE('',(#4788),#4782,.T.); +#4790=FILL_AREA_STYLE_COLOUR('',#11); +#4791=FILL_AREA_STYLE('',(#4790)); +#4792=SURFACE_STYLE_FILL_AREA(#4791); +#4793=SURFACE_SIDE_STYLE('',(#4792)); +#4794=SURFACE_STYLE_USAGE(.POSITIVE.,#4793); +#4795=FILL_AREA_STYLE_COLOUR('',#6); +#4796=FILL_AREA_STYLE('',(#4795)); +#4797=SURFACE_STYLE_FILL_AREA(#4796); +#4798=SURFACE_SIDE_STYLE('',(#4797)); +#4799=SURFACE_STYLE_USAGE(.NEGATIVE.,#4798); +#4800=PRESENTATION_STYLE_ASSIGNMENT((#4794,#4799)); +#4801=OVER_RIDING_STYLED_ITEM('',(#4800),#4789,#15); +#4802=CARTESIAN_POINT('',(1.09E0,-4.039E1,-8.E-1)); +#4803=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4804=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4805=AXIS2_PLACEMENT_3D('',#4802,#4803,#4804); +#4806=PLANE('',#4805); +#4807=ORIENTED_EDGE('',*,*,#3841,.F.); +#4809=ORIENTED_EDGE('',*,*,#4808,.T.); +#4811=ORIENTED_EDGE('',*,*,#4810,.T.); +#4813=ORIENTED_EDGE('',*,*,#4812,.F.); +#4814=EDGE_LOOP('',(#4807,#4809,#4811,#4813)); +#4815=FACE_OUTER_BOUND('',#4814,.F.); +#4816=ADVANCED_FACE('',(#4815),#4806,.F.); +#4817=CARTESIAN_POINT('',(1.44E0,-4.039E1,-8.E-1)); +#4818=DIRECTION('',(0.E0,1.E0,0.E0)); +#4819=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4820=AXIS2_PLACEMENT_3D('',#4817,#4818,#4819); +#4821=PLANE('',#4820); +#4822=ORIENTED_EDGE('',*,*,#3847,.F.); +#4824=ORIENTED_EDGE('',*,*,#4823,.T.); +#4826=ORIENTED_EDGE('',*,*,#4825,.T.); +#4827=ORIENTED_EDGE('',*,*,#4808,.F.); +#4828=EDGE_LOOP('',(#4822,#4824,#4826,#4827)); +#4829=FACE_OUTER_BOUND('',#4828,.F.); +#4830=ADVANCED_FACE('',(#4829),#4821,.F.); +#4831=CARTESIAN_POINT('',(1.44E0,-4.319E1,-8.E-1)); +#4832=DIRECTION('',(1.E0,0.E0,0.E0)); +#4833=DIRECTION('',(0.E0,1.E0,0.E0)); +#4834=AXIS2_PLACEMENT_3D('',#4831,#4832,#4833); +#4835=PLANE('',#4834); +#4836=ORIENTED_EDGE('',*,*,#3845,.F.); +#4838=ORIENTED_EDGE('',*,*,#4837,.T.); +#4840=ORIENTED_EDGE('',*,*,#4839,.T.); +#4841=ORIENTED_EDGE('',*,*,#4823,.F.); +#4842=EDGE_LOOP('',(#4836,#4838,#4840,#4841)); +#4843=FACE_OUTER_BOUND('',#4842,.F.); +#4844=ADVANCED_FACE('',(#4843),#4835,.F.); +#4845=CARTESIAN_POINT('',(1.09E0,-4.319E1,-8.E-1)); +#4846=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4847=DIRECTION('',(1.E0,0.E0,0.E0)); +#4848=AXIS2_PLACEMENT_3D('',#4845,#4846,#4847); +#4849=PLANE('',#4848); +#4850=ORIENTED_EDGE('',*,*,#3843,.F.); +#4851=ORIENTED_EDGE('',*,*,#4812,.T.); +#4853=ORIENTED_EDGE('',*,*,#4852,.T.); +#4854=ORIENTED_EDGE('',*,*,#4837,.F.); +#4855=EDGE_LOOP('',(#4850,#4851,#4853,#4854)); +#4856=FACE_OUTER_BOUND('',#4855,.F.); +#4857=ADVANCED_FACE('',(#4856),#4849,.F.); +#4858=CARTESIAN_POINT('',(5.5E0,0.E0,-8.2E-1)); +#4859=DIRECTION('',(0.E0,0.E0,1.E0)); +#4860=DIRECTION('',(1.E0,0.E0,0.E0)); +#4861=AXIS2_PLACEMENT_3D('',#4858,#4859,#4860); +#4862=PLANE('',#4861); +#4863=ORIENTED_EDGE('',*,*,#4810,.F.); +#4864=ORIENTED_EDGE('',*,*,#4825,.F.); +#4865=ORIENTED_EDGE('',*,*,#4839,.F.); +#4866=ORIENTED_EDGE('',*,*,#4852,.F.); +#4867=EDGE_LOOP('',(#4863,#4864,#4865,#4866)); +#4868=FACE_OUTER_BOUND('',#4867,.F.); +#4869=ADVANCED_FACE('',(#4868),#4862,.T.); +#4870=FILL_AREA_STYLE_COLOUR('',#11); +#4871=FILL_AREA_STYLE('',(#4870)); +#4872=SURFACE_STYLE_FILL_AREA(#4871); +#4873=SURFACE_SIDE_STYLE('',(#4872)); +#4874=SURFACE_STYLE_USAGE(.POSITIVE.,#4873); +#4875=FILL_AREA_STYLE_COLOUR('',#6); +#4876=FILL_AREA_STYLE('',(#4875)); +#4877=SURFACE_STYLE_FILL_AREA(#4876); +#4878=SURFACE_SIDE_STYLE('',(#4877)); +#4879=SURFACE_STYLE_USAGE(.NEGATIVE.,#4878); +#4880=PRESENTATION_STYLE_ASSIGNMENT((#4874,#4879)); +#4881=OVER_RIDING_STYLED_ITEM('',(#4880),#4869,#15); +#4882=CARTESIAN_POINT('',(1.59E0,-4.039E1,-8.E-1)); +#4883=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4884=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4885=AXIS2_PLACEMENT_3D('',#4882,#4883,#4884); +#4886=PLANE('',#4885); +#4887=ORIENTED_EDGE('',*,*,#3851,.F.); +#4889=ORIENTED_EDGE('',*,*,#4888,.T.); +#4891=ORIENTED_EDGE('',*,*,#4890,.T.); +#4893=ORIENTED_EDGE('',*,*,#4892,.F.); +#4894=EDGE_LOOP('',(#4887,#4889,#4891,#4893)); +#4895=FACE_OUTER_BOUND('',#4894,.F.); +#4896=ADVANCED_FACE('',(#4895),#4886,.F.); +#4897=CARTESIAN_POINT('',(1.94E0,-4.039E1,-8.E-1)); +#4898=DIRECTION('',(0.E0,1.E0,0.E0)); +#4899=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4900=AXIS2_PLACEMENT_3D('',#4897,#4898,#4899); +#4901=PLANE('',#4900); +#4902=ORIENTED_EDGE('',*,*,#3857,.F.); +#4904=ORIENTED_EDGE('',*,*,#4903,.T.); +#4906=ORIENTED_EDGE('',*,*,#4905,.T.); +#4907=ORIENTED_EDGE('',*,*,#4888,.F.); +#4908=EDGE_LOOP('',(#4902,#4904,#4906,#4907)); +#4909=FACE_OUTER_BOUND('',#4908,.F.); +#4910=ADVANCED_FACE('',(#4909),#4901,.F.); +#4911=CARTESIAN_POINT('',(1.94E0,-4.319E1,-8.E-1)); +#4912=DIRECTION('',(1.E0,0.E0,0.E0)); +#4913=DIRECTION('',(0.E0,1.E0,0.E0)); +#4914=AXIS2_PLACEMENT_3D('',#4911,#4912,#4913); +#4915=PLANE('',#4914); +#4916=ORIENTED_EDGE('',*,*,#3855,.F.); +#4918=ORIENTED_EDGE('',*,*,#4917,.T.); +#4920=ORIENTED_EDGE('',*,*,#4919,.T.); +#4921=ORIENTED_EDGE('',*,*,#4903,.F.); +#4922=EDGE_LOOP('',(#4916,#4918,#4920,#4921)); +#4923=FACE_OUTER_BOUND('',#4922,.F.); +#4924=ADVANCED_FACE('',(#4923),#4915,.F.); +#4925=CARTESIAN_POINT('',(1.59E0,-4.319E1,-8.E-1)); +#4926=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4927=DIRECTION('',(1.E0,0.E0,0.E0)); +#4928=AXIS2_PLACEMENT_3D('',#4925,#4926,#4927); +#4929=PLANE('',#4928); +#4930=ORIENTED_EDGE('',*,*,#3853,.F.); +#4931=ORIENTED_EDGE('',*,*,#4892,.T.); +#4933=ORIENTED_EDGE('',*,*,#4932,.T.); +#4934=ORIENTED_EDGE('',*,*,#4917,.F.); +#4935=EDGE_LOOP('',(#4930,#4931,#4933,#4934)); +#4936=FACE_OUTER_BOUND('',#4935,.F.); +#4937=ADVANCED_FACE('',(#4936),#4929,.F.); +#4938=CARTESIAN_POINT('',(6.E0,0.E0,-8.2E-1)); +#4939=DIRECTION('',(0.E0,0.E0,1.E0)); +#4940=DIRECTION('',(1.E0,0.E0,0.E0)); +#4941=AXIS2_PLACEMENT_3D('',#4938,#4939,#4940); +#4942=PLANE('',#4941); +#4943=ORIENTED_EDGE('',*,*,#4890,.F.); +#4944=ORIENTED_EDGE('',*,*,#4905,.F.); +#4945=ORIENTED_EDGE('',*,*,#4919,.F.); +#4946=ORIENTED_EDGE('',*,*,#4932,.F.); +#4947=EDGE_LOOP('',(#4943,#4944,#4945,#4946)); +#4948=FACE_OUTER_BOUND('',#4947,.F.); +#4949=ADVANCED_FACE('',(#4948),#4942,.T.); +#4950=FILL_AREA_STYLE_COLOUR('',#11); +#4951=FILL_AREA_STYLE('',(#4950)); +#4952=SURFACE_STYLE_FILL_AREA(#4951); +#4953=SURFACE_SIDE_STYLE('',(#4952)); +#4954=SURFACE_STYLE_USAGE(.POSITIVE.,#4953); +#4955=FILL_AREA_STYLE_COLOUR('',#6); +#4956=FILL_AREA_STYLE('',(#4955)); +#4957=SURFACE_STYLE_FILL_AREA(#4956); +#4958=SURFACE_SIDE_STYLE('',(#4957)); +#4959=SURFACE_STYLE_USAGE(.NEGATIVE.,#4958); +#4960=PRESENTATION_STYLE_ASSIGNMENT((#4954,#4959)); +#4961=OVER_RIDING_STYLED_ITEM('',(#4960),#4949,#15); +#4962=CARTESIAN_POINT('',(2.09E0,-4.039E1,-8.E-1)); +#4963=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4964=DIRECTION('',(0.E0,-1.E0,0.E0)); +#4965=AXIS2_PLACEMENT_3D('',#4962,#4963,#4964); +#4966=PLANE('',#4965); +#4967=ORIENTED_EDGE('',*,*,#3861,.F.); +#4969=ORIENTED_EDGE('',*,*,#4968,.T.); +#4971=ORIENTED_EDGE('',*,*,#4970,.T.); +#4973=ORIENTED_EDGE('',*,*,#4972,.F.); +#4974=EDGE_LOOP('',(#4967,#4969,#4971,#4973)); +#4975=FACE_OUTER_BOUND('',#4974,.F.); +#4976=ADVANCED_FACE('',(#4975),#4966,.F.); +#4977=CARTESIAN_POINT('',(2.44E0,-4.039E1,-8.E-1)); +#4978=DIRECTION('',(0.E0,1.E0,0.E0)); +#4979=DIRECTION('',(-1.E0,0.E0,0.E0)); +#4980=AXIS2_PLACEMENT_3D('',#4977,#4978,#4979); +#4981=PLANE('',#4980); +#4982=ORIENTED_EDGE('',*,*,#3867,.F.); +#4984=ORIENTED_EDGE('',*,*,#4983,.T.); +#4986=ORIENTED_EDGE('',*,*,#4985,.T.); +#4987=ORIENTED_EDGE('',*,*,#4968,.F.); +#4988=EDGE_LOOP('',(#4982,#4984,#4986,#4987)); +#4989=FACE_OUTER_BOUND('',#4988,.F.); +#4990=ADVANCED_FACE('',(#4989),#4981,.F.); +#4991=CARTESIAN_POINT('',(2.44E0,-4.319E1,-8.E-1)); +#4992=DIRECTION('',(1.E0,0.E0,0.E0)); +#4993=DIRECTION('',(0.E0,1.E0,0.E0)); +#4994=AXIS2_PLACEMENT_3D('',#4991,#4992,#4993); +#4995=PLANE('',#4994); +#4996=ORIENTED_EDGE('',*,*,#3865,.F.); +#4998=ORIENTED_EDGE('',*,*,#4997,.T.); +#5000=ORIENTED_EDGE('',*,*,#4999,.T.); +#5001=ORIENTED_EDGE('',*,*,#4983,.F.); +#5002=EDGE_LOOP('',(#4996,#4998,#5000,#5001)); +#5003=FACE_OUTER_BOUND('',#5002,.F.); +#5004=ADVANCED_FACE('',(#5003),#4995,.F.); +#5005=CARTESIAN_POINT('',(2.09E0,-4.319E1,-8.E-1)); +#5006=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5007=DIRECTION('',(1.E0,0.E0,0.E0)); +#5008=AXIS2_PLACEMENT_3D('',#5005,#5006,#5007); +#5009=PLANE('',#5008); +#5010=ORIENTED_EDGE('',*,*,#3863,.F.); +#5011=ORIENTED_EDGE('',*,*,#4972,.T.); +#5013=ORIENTED_EDGE('',*,*,#5012,.T.); +#5014=ORIENTED_EDGE('',*,*,#4997,.F.); +#5015=EDGE_LOOP('',(#5010,#5011,#5013,#5014)); +#5016=FACE_OUTER_BOUND('',#5015,.F.); +#5017=ADVANCED_FACE('',(#5016),#5009,.F.); +#5018=CARTESIAN_POINT('',(6.5E0,0.E0,-8.2E-1)); +#5019=DIRECTION('',(0.E0,0.E0,1.E0)); +#5020=DIRECTION('',(1.E0,0.E0,0.E0)); +#5021=AXIS2_PLACEMENT_3D('',#5018,#5019,#5020); +#5022=PLANE('',#5021); +#5023=ORIENTED_EDGE('',*,*,#4970,.F.); +#5024=ORIENTED_EDGE('',*,*,#4985,.F.); +#5025=ORIENTED_EDGE('',*,*,#4999,.F.); +#5026=ORIENTED_EDGE('',*,*,#5012,.F.); +#5027=EDGE_LOOP('',(#5023,#5024,#5025,#5026)); +#5028=FACE_OUTER_BOUND('',#5027,.F.); +#5029=ADVANCED_FACE('',(#5028),#5022,.T.); +#5030=FILL_AREA_STYLE_COLOUR('',#11); +#5031=FILL_AREA_STYLE('',(#5030)); +#5032=SURFACE_STYLE_FILL_AREA(#5031); +#5033=SURFACE_SIDE_STYLE('',(#5032)); +#5034=SURFACE_STYLE_USAGE(.POSITIVE.,#5033); +#5035=FILL_AREA_STYLE_COLOUR('',#6); +#5036=FILL_AREA_STYLE('',(#5035)); +#5037=SURFACE_STYLE_FILL_AREA(#5036); +#5038=SURFACE_SIDE_STYLE('',(#5037)); +#5039=SURFACE_STYLE_USAGE(.NEGATIVE.,#5038); +#5040=PRESENTATION_STYLE_ASSIGNMENT((#5034,#5039)); +#5041=OVER_RIDING_STYLED_ITEM('',(#5040),#5029,#15); +#5042=CARTESIAN_POINT('',(2.59E0,-4.039E1,-8.E-1)); +#5043=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5044=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5045=AXIS2_PLACEMENT_3D('',#5042,#5043,#5044); +#5046=PLANE('',#5045); +#5047=ORIENTED_EDGE('',*,*,#3871,.F.); +#5049=ORIENTED_EDGE('',*,*,#5048,.T.); +#5051=ORIENTED_EDGE('',*,*,#5050,.T.); +#5053=ORIENTED_EDGE('',*,*,#5052,.F.); +#5054=EDGE_LOOP('',(#5047,#5049,#5051,#5053)); +#5055=FACE_OUTER_BOUND('',#5054,.F.); +#5056=ADVANCED_FACE('',(#5055),#5046,.F.); +#5057=CARTESIAN_POINT('',(2.94E0,-4.039E1,-8.E-1)); +#5058=DIRECTION('',(0.E0,1.E0,0.E0)); +#5059=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5060=AXIS2_PLACEMENT_3D('',#5057,#5058,#5059); +#5061=PLANE('',#5060); +#5062=ORIENTED_EDGE('',*,*,#3877,.F.); +#5064=ORIENTED_EDGE('',*,*,#5063,.T.); +#5066=ORIENTED_EDGE('',*,*,#5065,.T.); +#5067=ORIENTED_EDGE('',*,*,#5048,.F.); +#5068=EDGE_LOOP('',(#5062,#5064,#5066,#5067)); +#5069=FACE_OUTER_BOUND('',#5068,.F.); +#5070=ADVANCED_FACE('',(#5069),#5061,.F.); +#5071=CARTESIAN_POINT('',(2.94E0,-4.319E1,-8.E-1)); +#5072=DIRECTION('',(1.E0,0.E0,0.E0)); +#5073=DIRECTION('',(0.E0,1.E0,0.E0)); +#5074=AXIS2_PLACEMENT_3D('',#5071,#5072,#5073); +#5075=PLANE('',#5074); +#5076=ORIENTED_EDGE('',*,*,#3875,.F.); +#5078=ORIENTED_EDGE('',*,*,#5077,.T.); +#5080=ORIENTED_EDGE('',*,*,#5079,.T.); +#5081=ORIENTED_EDGE('',*,*,#5063,.F.); +#5082=EDGE_LOOP('',(#5076,#5078,#5080,#5081)); +#5083=FACE_OUTER_BOUND('',#5082,.F.); +#5084=ADVANCED_FACE('',(#5083),#5075,.F.); +#5085=CARTESIAN_POINT('',(2.59E0,-4.319E1,-8.E-1)); +#5086=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5087=DIRECTION('',(1.E0,0.E0,0.E0)); +#5088=AXIS2_PLACEMENT_3D('',#5085,#5086,#5087); +#5089=PLANE('',#5088); +#5090=ORIENTED_EDGE('',*,*,#3873,.F.); +#5091=ORIENTED_EDGE('',*,*,#5052,.T.); +#5093=ORIENTED_EDGE('',*,*,#5092,.T.); +#5094=ORIENTED_EDGE('',*,*,#5077,.F.); +#5095=EDGE_LOOP('',(#5090,#5091,#5093,#5094)); +#5096=FACE_OUTER_BOUND('',#5095,.F.); +#5097=ADVANCED_FACE('',(#5096),#5089,.F.); +#5098=CARTESIAN_POINT('',(7.E0,0.E0,-8.2E-1)); +#5099=DIRECTION('',(0.E0,0.E0,1.E0)); +#5100=DIRECTION('',(1.E0,0.E0,0.E0)); +#5101=AXIS2_PLACEMENT_3D('',#5098,#5099,#5100); +#5102=PLANE('',#5101); +#5103=ORIENTED_EDGE('',*,*,#5050,.F.); +#5104=ORIENTED_EDGE('',*,*,#5065,.F.); +#5105=ORIENTED_EDGE('',*,*,#5079,.F.); +#5106=ORIENTED_EDGE('',*,*,#5092,.F.); +#5107=EDGE_LOOP('',(#5103,#5104,#5105,#5106)); +#5108=FACE_OUTER_BOUND('',#5107,.F.); +#5109=ADVANCED_FACE('',(#5108),#5102,.T.); +#5110=FILL_AREA_STYLE_COLOUR('',#11); +#5111=FILL_AREA_STYLE('',(#5110)); +#5112=SURFACE_STYLE_FILL_AREA(#5111); +#5113=SURFACE_SIDE_STYLE('',(#5112)); +#5114=SURFACE_STYLE_USAGE(.POSITIVE.,#5113); +#5115=FILL_AREA_STYLE_COLOUR('',#6); +#5116=FILL_AREA_STYLE('',(#5115)); +#5117=SURFACE_STYLE_FILL_AREA(#5116); +#5118=SURFACE_SIDE_STYLE('',(#5117)); +#5119=SURFACE_STYLE_USAGE(.NEGATIVE.,#5118); +#5120=PRESENTATION_STYLE_ASSIGNMENT((#5114,#5119)); +#5121=OVER_RIDING_STYLED_ITEM('',(#5120),#5109,#15); +#5122=CARTESIAN_POINT('',(3.09E0,-4.039E1,-8.E-1)); +#5123=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5124=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5125=AXIS2_PLACEMENT_3D('',#5122,#5123,#5124); +#5126=PLANE('',#5125); +#5127=ORIENTED_EDGE('',*,*,#3881,.F.); +#5129=ORIENTED_EDGE('',*,*,#5128,.T.); +#5131=ORIENTED_EDGE('',*,*,#5130,.T.); +#5133=ORIENTED_EDGE('',*,*,#5132,.F.); +#5134=EDGE_LOOP('',(#5127,#5129,#5131,#5133)); +#5135=FACE_OUTER_BOUND('',#5134,.F.); +#5136=ADVANCED_FACE('',(#5135),#5126,.F.); +#5137=CARTESIAN_POINT('',(3.44E0,-4.039E1,-8.E-1)); +#5138=DIRECTION('',(0.E0,1.E0,0.E0)); +#5139=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5140=AXIS2_PLACEMENT_3D('',#5137,#5138,#5139); +#5141=PLANE('',#5140); +#5142=ORIENTED_EDGE('',*,*,#3887,.F.); +#5144=ORIENTED_EDGE('',*,*,#5143,.T.); +#5146=ORIENTED_EDGE('',*,*,#5145,.T.); +#5147=ORIENTED_EDGE('',*,*,#5128,.F.); +#5148=EDGE_LOOP('',(#5142,#5144,#5146,#5147)); +#5149=FACE_OUTER_BOUND('',#5148,.F.); +#5150=ADVANCED_FACE('',(#5149),#5141,.F.); +#5151=CARTESIAN_POINT('',(3.44E0,-4.319E1,-8.E-1)); +#5152=DIRECTION('',(1.E0,0.E0,0.E0)); +#5153=DIRECTION('',(0.E0,1.E0,0.E0)); +#5154=AXIS2_PLACEMENT_3D('',#5151,#5152,#5153); +#5155=PLANE('',#5154); +#5156=ORIENTED_EDGE('',*,*,#3885,.F.); +#5158=ORIENTED_EDGE('',*,*,#5157,.T.); +#5160=ORIENTED_EDGE('',*,*,#5159,.T.); +#5161=ORIENTED_EDGE('',*,*,#5143,.F.); +#5162=EDGE_LOOP('',(#5156,#5158,#5160,#5161)); +#5163=FACE_OUTER_BOUND('',#5162,.F.); +#5164=ADVANCED_FACE('',(#5163),#5155,.F.); +#5165=CARTESIAN_POINT('',(3.09E0,-4.319E1,-8.E-1)); +#5166=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5167=DIRECTION('',(1.E0,0.E0,0.E0)); +#5168=AXIS2_PLACEMENT_3D('',#5165,#5166,#5167); +#5169=PLANE('',#5168); +#5170=ORIENTED_EDGE('',*,*,#3883,.F.); +#5171=ORIENTED_EDGE('',*,*,#5132,.T.); +#5173=ORIENTED_EDGE('',*,*,#5172,.T.); +#5174=ORIENTED_EDGE('',*,*,#5157,.F.); +#5175=EDGE_LOOP('',(#5170,#5171,#5173,#5174)); +#5176=FACE_OUTER_BOUND('',#5175,.F.); +#5177=ADVANCED_FACE('',(#5176),#5169,.F.); +#5178=CARTESIAN_POINT('',(7.5E0,0.E0,-8.2E-1)); +#5179=DIRECTION('',(0.E0,0.E0,1.E0)); +#5180=DIRECTION('',(1.E0,0.E0,0.E0)); +#5181=AXIS2_PLACEMENT_3D('',#5178,#5179,#5180); +#5182=PLANE('',#5181); +#5183=ORIENTED_EDGE('',*,*,#5130,.F.); +#5184=ORIENTED_EDGE('',*,*,#5145,.F.); +#5185=ORIENTED_EDGE('',*,*,#5159,.F.); +#5186=ORIENTED_EDGE('',*,*,#5172,.F.); +#5187=EDGE_LOOP('',(#5183,#5184,#5185,#5186)); +#5188=FACE_OUTER_BOUND('',#5187,.F.); +#5189=ADVANCED_FACE('',(#5188),#5182,.T.); +#5190=FILL_AREA_STYLE_COLOUR('',#11); +#5191=FILL_AREA_STYLE('',(#5190)); +#5192=SURFACE_STYLE_FILL_AREA(#5191); +#5193=SURFACE_SIDE_STYLE('',(#5192)); +#5194=SURFACE_STYLE_USAGE(.POSITIVE.,#5193); +#5195=FILL_AREA_STYLE_COLOUR('',#6); +#5196=FILL_AREA_STYLE('',(#5195)); +#5197=SURFACE_STYLE_FILL_AREA(#5196); +#5198=SURFACE_SIDE_STYLE('',(#5197)); +#5199=SURFACE_STYLE_USAGE(.NEGATIVE.,#5198); +#5200=PRESENTATION_STYLE_ASSIGNMENT((#5194,#5199)); +#5201=OVER_RIDING_STYLED_ITEM('',(#5200),#5189,#15); +#5202=CARTESIAN_POINT('',(3.59E0,-4.039E1,-8.E-1)); +#5203=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5204=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5205=AXIS2_PLACEMENT_3D('',#5202,#5203,#5204); +#5206=PLANE('',#5205); +#5207=ORIENTED_EDGE('',*,*,#3891,.F.); +#5209=ORIENTED_EDGE('',*,*,#5208,.T.); +#5211=ORIENTED_EDGE('',*,*,#5210,.T.); +#5213=ORIENTED_EDGE('',*,*,#5212,.F.); +#5214=EDGE_LOOP('',(#5207,#5209,#5211,#5213)); +#5215=FACE_OUTER_BOUND('',#5214,.F.); +#5216=ADVANCED_FACE('',(#5215),#5206,.F.); +#5217=CARTESIAN_POINT('',(3.94E0,-4.039E1,-8.E-1)); +#5218=DIRECTION('',(0.E0,1.E0,0.E0)); +#5219=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5220=AXIS2_PLACEMENT_3D('',#5217,#5218,#5219); +#5221=PLANE('',#5220); +#5222=ORIENTED_EDGE('',*,*,#3897,.F.); +#5224=ORIENTED_EDGE('',*,*,#5223,.T.); +#5226=ORIENTED_EDGE('',*,*,#5225,.T.); +#5227=ORIENTED_EDGE('',*,*,#5208,.F.); +#5228=EDGE_LOOP('',(#5222,#5224,#5226,#5227)); +#5229=FACE_OUTER_BOUND('',#5228,.F.); +#5230=ADVANCED_FACE('',(#5229),#5221,.F.); +#5231=CARTESIAN_POINT('',(3.94E0,-4.319E1,-8.E-1)); +#5232=DIRECTION('',(1.E0,0.E0,0.E0)); +#5233=DIRECTION('',(0.E0,1.E0,0.E0)); +#5234=AXIS2_PLACEMENT_3D('',#5231,#5232,#5233); +#5235=PLANE('',#5234); +#5236=ORIENTED_EDGE('',*,*,#3895,.F.); +#5238=ORIENTED_EDGE('',*,*,#5237,.T.); +#5240=ORIENTED_EDGE('',*,*,#5239,.T.); +#5241=ORIENTED_EDGE('',*,*,#5223,.F.); +#5242=EDGE_LOOP('',(#5236,#5238,#5240,#5241)); +#5243=FACE_OUTER_BOUND('',#5242,.F.); +#5244=ADVANCED_FACE('',(#5243),#5235,.F.); +#5245=CARTESIAN_POINT('',(3.59E0,-4.319E1,-8.E-1)); +#5246=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5247=DIRECTION('',(1.E0,0.E0,0.E0)); +#5248=AXIS2_PLACEMENT_3D('',#5245,#5246,#5247); +#5249=PLANE('',#5248); +#5250=ORIENTED_EDGE('',*,*,#3893,.F.); +#5251=ORIENTED_EDGE('',*,*,#5212,.T.); +#5253=ORIENTED_EDGE('',*,*,#5252,.T.); +#5254=ORIENTED_EDGE('',*,*,#5237,.F.); +#5255=EDGE_LOOP('',(#5250,#5251,#5253,#5254)); +#5256=FACE_OUTER_BOUND('',#5255,.F.); +#5257=ADVANCED_FACE('',(#5256),#5249,.F.); +#5258=CARTESIAN_POINT('',(8.E0,0.E0,-8.2E-1)); +#5259=DIRECTION('',(0.E0,0.E0,1.E0)); +#5260=DIRECTION('',(1.E0,0.E0,0.E0)); +#5261=AXIS2_PLACEMENT_3D('',#5258,#5259,#5260); +#5262=PLANE('',#5261); +#5263=ORIENTED_EDGE('',*,*,#5210,.F.); +#5264=ORIENTED_EDGE('',*,*,#5225,.F.); +#5265=ORIENTED_EDGE('',*,*,#5239,.F.); +#5266=ORIENTED_EDGE('',*,*,#5252,.F.); +#5267=EDGE_LOOP('',(#5263,#5264,#5265,#5266)); +#5268=FACE_OUTER_BOUND('',#5267,.F.); +#5269=ADVANCED_FACE('',(#5268),#5262,.T.); +#5270=FILL_AREA_STYLE_COLOUR('',#11); +#5271=FILL_AREA_STYLE('',(#5270)); +#5272=SURFACE_STYLE_FILL_AREA(#5271); +#5273=SURFACE_SIDE_STYLE('',(#5272)); +#5274=SURFACE_STYLE_USAGE(.POSITIVE.,#5273); +#5275=FILL_AREA_STYLE_COLOUR('',#6); +#5276=FILL_AREA_STYLE('',(#5275)); +#5277=SURFACE_STYLE_FILL_AREA(#5276); +#5278=SURFACE_SIDE_STYLE('',(#5277)); +#5279=SURFACE_STYLE_USAGE(.NEGATIVE.,#5278); +#5280=PRESENTATION_STYLE_ASSIGNMENT((#5274,#5279)); +#5281=OVER_RIDING_STYLED_ITEM('',(#5280),#5269,#15); +#5282=CARTESIAN_POINT('',(4.09E0,-4.039E1,-8.E-1)); +#5283=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5284=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5285=AXIS2_PLACEMENT_3D('',#5282,#5283,#5284); +#5286=PLANE('',#5285); +#5287=ORIENTED_EDGE('',*,*,#3901,.F.); +#5289=ORIENTED_EDGE('',*,*,#5288,.T.); +#5291=ORIENTED_EDGE('',*,*,#5290,.T.); +#5293=ORIENTED_EDGE('',*,*,#5292,.F.); +#5294=EDGE_LOOP('',(#5287,#5289,#5291,#5293)); +#5295=FACE_OUTER_BOUND('',#5294,.F.); +#5296=ADVANCED_FACE('',(#5295),#5286,.F.); +#5297=CARTESIAN_POINT('',(4.44E0,-4.039E1,-8.E-1)); +#5298=DIRECTION('',(0.E0,1.E0,0.E0)); +#5299=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5300=AXIS2_PLACEMENT_3D('',#5297,#5298,#5299); +#5301=PLANE('',#5300); +#5302=ORIENTED_EDGE('',*,*,#3907,.F.); +#5304=ORIENTED_EDGE('',*,*,#5303,.T.); +#5306=ORIENTED_EDGE('',*,*,#5305,.T.); +#5307=ORIENTED_EDGE('',*,*,#5288,.F.); +#5308=EDGE_LOOP('',(#5302,#5304,#5306,#5307)); +#5309=FACE_OUTER_BOUND('',#5308,.F.); +#5310=ADVANCED_FACE('',(#5309),#5301,.F.); +#5311=CARTESIAN_POINT('',(4.44E0,-4.319E1,-8.E-1)); +#5312=DIRECTION('',(1.E0,0.E0,0.E0)); +#5313=DIRECTION('',(0.E0,1.E0,0.E0)); +#5314=AXIS2_PLACEMENT_3D('',#5311,#5312,#5313); +#5315=PLANE('',#5314); +#5316=ORIENTED_EDGE('',*,*,#3905,.F.); +#5318=ORIENTED_EDGE('',*,*,#5317,.T.); +#5320=ORIENTED_EDGE('',*,*,#5319,.T.); +#5321=ORIENTED_EDGE('',*,*,#5303,.F.); +#5322=EDGE_LOOP('',(#5316,#5318,#5320,#5321)); +#5323=FACE_OUTER_BOUND('',#5322,.F.); +#5324=ADVANCED_FACE('',(#5323),#5315,.F.); +#5325=CARTESIAN_POINT('',(4.09E0,-4.319E1,-8.E-1)); +#5326=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5327=DIRECTION('',(1.E0,0.E0,0.E0)); +#5328=AXIS2_PLACEMENT_3D('',#5325,#5326,#5327); +#5329=PLANE('',#5328); +#5330=ORIENTED_EDGE('',*,*,#3903,.F.); +#5331=ORIENTED_EDGE('',*,*,#5292,.T.); +#5333=ORIENTED_EDGE('',*,*,#5332,.T.); +#5334=ORIENTED_EDGE('',*,*,#5317,.F.); +#5335=EDGE_LOOP('',(#5330,#5331,#5333,#5334)); +#5336=FACE_OUTER_BOUND('',#5335,.F.); +#5337=ADVANCED_FACE('',(#5336),#5329,.F.); +#5338=CARTESIAN_POINT('',(8.5E0,0.E0,-8.2E-1)); +#5339=DIRECTION('',(0.E0,0.E0,1.E0)); +#5340=DIRECTION('',(1.E0,0.E0,0.E0)); +#5341=AXIS2_PLACEMENT_3D('',#5338,#5339,#5340); +#5342=PLANE('',#5341); +#5343=ORIENTED_EDGE('',*,*,#5290,.F.); +#5344=ORIENTED_EDGE('',*,*,#5305,.F.); +#5345=ORIENTED_EDGE('',*,*,#5319,.F.); +#5346=ORIENTED_EDGE('',*,*,#5332,.F.); +#5347=EDGE_LOOP('',(#5343,#5344,#5345,#5346)); +#5348=FACE_OUTER_BOUND('',#5347,.F.); +#5349=ADVANCED_FACE('',(#5348),#5342,.T.); +#5350=FILL_AREA_STYLE_COLOUR('',#11); +#5351=FILL_AREA_STYLE('',(#5350)); +#5352=SURFACE_STYLE_FILL_AREA(#5351); +#5353=SURFACE_SIDE_STYLE('',(#5352)); +#5354=SURFACE_STYLE_USAGE(.POSITIVE.,#5353); +#5355=FILL_AREA_STYLE_COLOUR('',#6); +#5356=FILL_AREA_STYLE('',(#5355)); +#5357=SURFACE_STYLE_FILL_AREA(#5356); +#5358=SURFACE_SIDE_STYLE('',(#5357)); +#5359=SURFACE_STYLE_USAGE(.NEGATIVE.,#5358); +#5360=PRESENTATION_STYLE_ASSIGNMENT((#5354,#5359)); +#5361=OVER_RIDING_STYLED_ITEM('',(#5360),#5349,#15); +#5362=CARTESIAN_POINT('',(-5.74E0,-3.192E1,-3.593616E0)); +#5363=DIRECTION('',(0.E0,0.E0,1.E0)); +#5364=DIRECTION('',(1.E0,0.E0,0.E0)); +#5365=AXIS2_PLACEMENT_3D('',#5362,#5363,#5364); +#5366=CYLINDRICAL_SURFACE('',#5365,1.E0); +#5367=ORIENTED_EDGE('',*,*,#3615,.F.); +#5368=ORIENTED_EDGE('',*,*,#3582,.T.); +#5370=ORIENTED_EDGE('',*,*,#5369,.T.); +#5371=ORIENTED_EDGE('',*,*,#3705,.T.); +#5372=EDGE_LOOP('',(#5367,#5368,#5370,#5371)); +#5373=FACE_OUTER_BOUND('',#5372,.F.); +#5374=ADVANCED_FACE('',(#5373),#5366,.F.); +#5375=CARTESIAN_POINT('',(-1.064E1,-3.092E1,0.E0)); +#5376=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5377=DIRECTION('',(1.E0,0.E0,0.E0)); +#5378=AXIS2_PLACEMENT_3D('',#5375,#5376,#5377); +#5379=PLANE('',#5378); +#5381=ORIENTED_EDGE('',*,*,#5380,.F.); +#5382=ORIENTED_EDGE('',*,*,#3707,.T.); +#5383=ORIENTED_EDGE('',*,*,#5369,.F.); +#5384=ORIENTED_EDGE('',*,*,#3580,.F.); +#5385=EDGE_LOOP('',(#5381,#5382,#5383,#5384)); +#5386=FACE_OUTER_BOUND('',#5385,.F.); +#5387=ADVANCED_FACE('',(#5386),#5379,.T.); +#5388=CARTESIAN_POINT('',(-9.64E0,-2.992E1,2.033616E0)); +#5389=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5390=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5391=AXIS2_PLACEMENT_3D('',#5388,#5389,#5390); +#5392=CYLINDRICAL_SURFACE('',#5391,1.E0); +#5393=ORIENTED_EDGE('',*,*,#3578,.T.); +#5395=ORIENTED_EDGE('',*,*,#5394,.F.); +#5396=ORIENTED_EDGE('',*,*,#3709,.T.); +#5397=ORIENTED_EDGE('',*,*,#5380,.T.); +#5398=EDGE_LOOP('',(#5393,#5395,#5396,#5397)); +#5399=FACE_OUTER_BOUND('',#5398,.F.); +#5400=ADVANCED_FACE('',(#5399),#5392,.T.); +#5401=CARTESIAN_POINT('',(-1.064E1,-2.101E1,0.E0)); +#5402=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5403=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5404=AXIS2_PLACEMENT_3D('',#5401,#5402,#5403); +#5405=PLANE('',#5404); +#5407=ORIENTED_EDGE('',*,*,#5406,.F.); +#5408=ORIENTED_EDGE('',*,*,#3711,.T.); +#5409=ORIENTED_EDGE('',*,*,#5394,.T.); +#5410=ORIENTED_EDGE('',*,*,#3576,.F.); +#5411=EDGE_LOOP('',(#5407,#5408,#5409,#5410)); +#5412=FACE_OUTER_BOUND('',#5411,.F.); +#5413=ADVANCED_FACE('',(#5412),#5405,.T.); +#5414=CARTESIAN_POINT('',(-9.64E0,-2.201E1,2.033616E0)); +#5415=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5416=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5417=AXIS2_PLACEMENT_3D('',#5414,#5415,#5416); +#5418=CYLINDRICAL_SURFACE('',#5417,1.E0); +#5419=ORIENTED_EDGE('',*,*,#3574,.T.); +#5421=ORIENTED_EDGE('',*,*,#5420,.F.); +#5422=ORIENTED_EDGE('',*,*,#3713,.T.); +#5423=ORIENTED_EDGE('',*,*,#5406,.T.); +#5424=EDGE_LOOP('',(#5419,#5421,#5422,#5423)); +#5425=FACE_OUTER_BOUND('',#5424,.F.); +#5426=ADVANCED_FACE('',(#5425),#5418,.T.); +#5427=CARTESIAN_POINT('',(-4.03E0,-2.101E1,0.E0)); +#5428=DIRECTION('',(0.E0,1.E0,0.E0)); +#5429=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5430=AXIS2_PLACEMENT_3D('',#5427,#5428,#5429); +#5431=PLANE('',#5430); +#5432=ORIENTED_EDGE('',*,*,#5420,.T.); +#5433=ORIENTED_EDGE('',*,*,#3572,.F.); +#5435=ORIENTED_EDGE('',*,*,#5434,.T.); +#5436=ORIENTED_EDGE('',*,*,#3715,.T.); +#5437=EDGE_LOOP('',(#5432,#5433,#5435,#5436)); +#5438=FACE_OUTER_BOUND('',#5437,.F.); +#5439=ADVANCED_FACE('',(#5438),#5431,.T.); +#5440=CARTESIAN_POINT('',(-4.53E0,-2.051E1,-3.593616E0)); +#5441=DIRECTION('',(0.E0,0.E0,1.E0)); +#5442=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5443=AXIS2_PLACEMENT_3D('',#5440,#5441,#5442); +#5444=CYLINDRICAL_SURFACE('',#5443,5.E-1); +#5445=ORIENTED_EDGE('',*,*,#5434,.F.); +#5446=ORIENTED_EDGE('',*,*,#3570,.T.); +#5448=ORIENTED_EDGE('',*,*,#5447,.T.); +#5449=ORIENTED_EDGE('',*,*,#3717,.T.); +#5450=EDGE_LOOP('',(#5445,#5446,#5448,#5449)); +#5451=FACE_OUTER_BOUND('',#5450,.F.); +#5452=ADVANCED_FACE('',(#5451),#5444,.F.); +#5453=CARTESIAN_POINT('',(-4.03E0,-1.871E1,0.E0)); +#5454=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5455=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5456=AXIS2_PLACEMENT_3D('',#5453,#5454,#5455); +#5457=PLANE('',#5456); +#5458=ORIENTED_EDGE('',*,*,#5447,.F.); +#5459=ORIENTED_EDGE('',*,*,#3568,.F.); +#5460=ORIENTED_EDGE('',*,*,#3507,.F.); +#5461=ORIENTED_EDGE('',*,*,#3719,.T.); +#5462=EDGE_LOOP('',(#5458,#5459,#5460,#5461)); +#5463=FACE_OUTER_BOUND('',#5462,.F.); +#5464=ADVANCED_FACE('',(#5463),#5457,.T.); +#5465=CARTESIAN_POINT('',(9.01E0,-2.101E1,0.E0)); +#5466=DIRECTION('',(0.E0,1.E0,0.E0)); +#5467=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5468=AXIS2_PLACEMENT_3D('',#5465,#5466,#5467); +#5469=PLANE('',#5468); +#5471=ORIENTED_EDGE('',*,*,#5470,.F.); +#5472=ORIENTED_EDGE('',*,*,#3724,.T.); +#5473=ORIENTED_EDGE('',*,*,#3537,.F.); +#5474=ORIENTED_EDGE('',*,*,#3563,.F.); +#5475=EDGE_LOOP('',(#5471,#5472,#5473,#5474)); +#5476=FACE_OUTER_BOUND('',#5475,.F.); +#5477=ADVANCED_FACE('',(#5476),#5469,.T.); +#5478=CARTESIAN_POINT('',(8.01E0,-2.201E1,2.033616E0)); +#5479=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5480=DIRECTION('',(0.E0,1.E0,0.E0)); +#5481=AXIS2_PLACEMENT_3D('',#5478,#5479,#5480); +#5482=CYLINDRICAL_SURFACE('',#5481,1.E0); +#5483=ORIENTED_EDGE('',*,*,#3561,.T.); +#5485=ORIENTED_EDGE('',*,*,#5484,.F.); +#5486=ORIENTED_EDGE('',*,*,#3726,.T.); +#5487=ORIENTED_EDGE('',*,*,#5470,.T.); +#5488=EDGE_LOOP('',(#5483,#5485,#5486,#5487)); +#5489=FACE_OUTER_BOUND('',#5488,.F.); +#5490=ADVANCED_FACE('',(#5489),#5482,.T.); +#5491=CARTESIAN_POINT('',(9.01E0,-3.092E1,0.E0)); +#5492=DIRECTION('',(1.E0,0.E0,0.E0)); +#5493=DIRECTION('',(0.E0,1.E0,0.E0)); +#5494=AXIS2_PLACEMENT_3D('',#5491,#5492,#5493); +#5495=PLANE('',#5494); +#5497=ORIENTED_EDGE('',*,*,#5496,.F.); +#5498=ORIENTED_EDGE('',*,*,#3728,.T.); +#5499=ORIENTED_EDGE('',*,*,#5484,.T.); +#5500=ORIENTED_EDGE('',*,*,#3559,.F.); +#5501=EDGE_LOOP('',(#5497,#5498,#5499,#5500)); +#5502=FACE_OUTER_BOUND('',#5501,.F.); +#5503=ADVANCED_FACE('',(#5502),#5495,.T.); +#5504=CARTESIAN_POINT('',(8.01E0,-2.992E1,2.033616E0)); +#5505=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5506=DIRECTION('',(1.E0,0.E0,0.E0)); +#5507=AXIS2_PLACEMENT_3D('',#5504,#5505,#5506); +#5508=CYLINDRICAL_SURFACE('',#5507,1.E0); +#5509=ORIENTED_EDGE('',*,*,#3557,.T.); +#5511=ORIENTED_EDGE('',*,*,#5510,.F.); +#5512=ORIENTED_EDGE('',*,*,#3730,.T.); +#5513=ORIENTED_EDGE('',*,*,#5496,.T.); +#5514=EDGE_LOOP('',(#5509,#5511,#5512,#5513)); +#5515=FACE_OUTER_BOUND('',#5514,.F.); +#5516=ADVANCED_FACE('',(#5515),#5508,.T.); +#5517=CARTESIAN_POINT('',(4.76E0,-3.092E1,0.E0)); +#5518=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5519=DIRECTION('',(1.E0,0.E0,0.E0)); +#5520=AXIS2_PLACEMENT_3D('',#5517,#5518,#5519); +#5521=PLANE('',#5520); +#5522=ORIENTED_EDGE('',*,*,#5510,.T.); +#5523=ORIENTED_EDGE('',*,*,#3555,.F.); +#5525=ORIENTED_EDGE('',*,*,#5524,.T.); +#5526=ORIENTED_EDGE('',*,*,#3732,.T.); +#5527=EDGE_LOOP('',(#5522,#5523,#5525,#5526)); +#5528=FACE_OUTER_BOUND('',#5527,.F.); +#5529=ADVANCED_FACE('',(#5528),#5521,.T.); +#5530=CARTESIAN_POINT('',(5.76E0,-3.192E1,-3.593616E0)); +#5531=DIRECTION('',(0.E0,0.E0,1.E0)); +#5532=DIRECTION('',(0.E0,1.E0,0.E0)); +#5533=AXIS2_PLACEMENT_3D('',#5530,#5531,#5532); +#5534=CYLINDRICAL_SURFACE('',#5533,1.E0); +#5535=ORIENTED_EDGE('',*,*,#5524,.F.); +#5536=ORIENTED_EDGE('',*,*,#3553,.T.); +#5537=ORIENTED_EDGE('',*,*,#3679,.T.); +#5538=ORIENTED_EDGE('',*,*,#3734,.T.); +#5539=EDGE_LOOP('',(#5535,#5536,#5537,#5538)); +#5540=FACE_OUTER_BOUND('',#5539,.F.); +#5541=ADVANCED_FACE('',(#5540),#5534,.F.); +#5542=CARTESIAN_POINT('',(9.835E0,-1.351E1,6.410352E0)); +#5543=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5544=DIRECTION('',(1.E0,0.E0,0.E0)); +#5545=AXIS2_PLACEMENT_3D('',#5542,#5543,#5544); +#5546=CYLINDRICAL_SURFACE('',#5545,5.2E0); +#5547=ORIENTED_EDGE('',*,*,#3432,.T.); +#5548=ORIENTED_EDGE('',*,*,#3496,.F.); +#5549=ORIENTED_EDGE('',*,*,#3070,.T.); +#5551=ORIENTED_EDGE('',*,*,#5550,.T.); +#5552=EDGE_LOOP('',(#5547,#5548,#5549,#5551)); +#5553=FACE_OUTER_BOUND('',#5552,.F.); +#5554=ADVANCED_FACE('',(#5553),#5546,.T.); +#5555=CARTESIAN_POINT('',(1.5035E1,-1.871E1,0.E0)); +#5556=DIRECTION('',(1.E0,0.E0,0.E0)); +#5557=DIRECTION('',(0.E0,1.E0,0.E0)); +#5558=AXIS2_PLACEMENT_3D('',#5555,#5556,#5557); +#5559=PLANE('',#5558); +#5560=ORIENTED_EDGE('',*,*,#3408,.T.); +#5561=ORIENTED_EDGE('',*,*,#3434,.F.); +#5562=ORIENTED_EDGE('',*,*,#5550,.F.); +#5563=ORIENTED_EDGE('',*,*,#3068,.T.); +#5564=EDGE_LOOP('',(#5560,#5561,#5562,#5563)); +#5565=FACE_OUTER_BOUND('',#5564,.F.); +#5566=ADVANCED_FACE('',(#5565),#5559,.T.); +#5567=CLOSED_SHELL('',(#3102,#3117,#3131,#3171,#3198,#3212,#3234,#3259,#3272, +#3285,#3298,#3311,#3323,#3337,#3350,#3363,#3376,#3388,#3400,#3415,#3438,#3451, +#3464,#3477,#3490,#3513,#3528,#3543,#3588,#3603,#3621,#3636,#3651,#3666,#3683, +#3697,#3921,#3936,#3950,#3964,#3977,#3989,#4016,#4030,#4044,#4057,#4069,#4096, +#4110,#4124,#4137,#4149,#4176,#4190,#4204,#4217,#4229,#4256,#4270,#4284,#4297, +#4309,#4336,#4350,#4364,#4377,#4389,#4416,#4430,#4444,#4457,#4469,#4496,#4510, +#4524,#4537,#4549,#4576,#4590,#4604,#4617,#4629,#4656,#4670,#4684,#4697,#4709, +#4736,#4750,#4764,#4777,#4789,#4816,#4830,#4844,#4857,#4869,#4896,#4910,#4924, +#4937,#4949,#4976,#4990,#5004,#5017,#5029,#5056,#5070,#5084,#5097,#5109,#5136, +#5150,#5164,#5177,#5189,#5216,#5230,#5244,#5257,#5269,#5296,#5310,#5324,#5337, +#5349,#5374,#5387,#5400,#5413,#5426,#5439,#5452,#5464,#5477,#5490,#5503,#5516, +#5529,#5541,#5554,#5566)); +#5568=MANIFOLD_SOLID_BREP('',#5567); +#5569=FILL_AREA_STYLE_COLOUR('',#6); +#5570=FILL_AREA_STYLE('',(#5569)); +#5571=SURFACE_STYLE_FILL_AREA(#5570); +#5572=SURFACE_SIDE_STYLE('',(#5571)); +#5573=SURFACE_STYLE_USAGE(.BOTH.,#5572); +#5574=PRESENTATION_STYLE_ASSIGNMENT((#5573)); +#15=STYLED_ITEM('',(#5574),#5568); +#5575=CARTESIAN_POINT('',(0.E0,0.E0,0.E0)); +#5576=DIRECTION('',(0.E0,0.E0,1.E0)); +#5577=DIRECTION('',(1.E0,0.E0,0.E0)); +#5578=AXIS2_PLACEMENT_3D('PRT_CSYS_DEF',#5575,#5576,#5577); +#5579=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#11); +#5580=PRESENTATION_STYLE_ASSIGNMENT((#5579)); +#5581=STYLED_ITEM('',(#5580),#5578); +#5582=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5583=VECTOR('',#5582,1.3E-1); +#5584=CARTESIAN_POINT('',(-4.44E0,-4.309E1,-9.7E-1)); +#5585=LINE('',#5584,#5583); +#5587=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#11); +#5588=PRESENTATION_STYLE_ASSIGNMENT((#5587)); +#5589=STYLED_ITEM('',(#5588),#5586); +#5591=DIRECTION('',(0.E0,0.E0,-1.E0)); +#5592=VECTOR('',#5591,1.3E-1); +#5593=CARTESIAN_POINT('',(4.46E0,-4.309E1,-9.7E-1)); +#5594=LINE('',#5593,#5592); +#5596=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#11); +#5597=PRESENTATION_STYLE_ASSIGNMENT((#5596)); +#5598=STYLED_ITEM('',(#5597),#5595); +#5599=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5600=VECTOR('',#5599,2.127659618855E-1); +#5601=CARTESIAN_POINT('',(-1.030861900248E1,-2.841030049659E0,-4.E-2)); +#5602=LINE('',#5601,#5600); +#5604=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5605=PRESENTATION_STYLE_ASSIGNMENT((#5604)); +#5606=STYLED_ITEM('',(#5605),#5603); +#5608=DIRECTION('',(1.E0,0.E0,0.E0)); +#5609=VECTOR('',#5608,1.5E0); +#5610=CARTESIAN_POINT('',(-1.030861900248E1,-3.053796011545E0,-4.E-2)); +#5611=LINE('',#5610,#5609); +#5613=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5614=PRESENTATION_STYLE_ASSIGNMENT((#5613)); +#5615=STYLED_ITEM('',(#5614),#5612); +#5617=DIRECTION('',(0.E0,1.E0,0.E0)); +#5618=VECTOR('',#5617,2.127659618855E-1); +#5619=CARTESIAN_POINT('',(-8.808619002485E0,-3.053796011545E0,-4.E-2)); +#5620=LINE('',#5619,#5618); +#5622=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5623=PRESENTATION_STYLE_ASSIGNMENT((#5622)); +#5624=STYLED_ITEM('',(#5623),#5621); +#5626=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5627=VECTOR('',#5626,1.166666656733E0); +#5628=CARTESIAN_POINT('',(-8.808619002485E0,-2.841030049659E0,-4.E-2)); +#5629=LINE('',#5628,#5627); +#5631=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5632=PRESENTATION_STYLE_ASSIGNMENT((#5631)); +#5633=STYLED_ITEM('',(#5632),#5630); +#5635=DIRECTION('',(7.437660872566E-1,6.684399804373E-1,0.E0)); +#5636=VECTOR('',#5635,1.400529917376E0); +#5637=CARTESIAN_POINT('',(-9.975285659217E0,-2.841030049659E0,-4.E-2)); +#5638=LINE('',#5637,#5636); +#5640=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5641=PRESENTATION_STYLE_ASSIGNMENT((#5640)); +#5642=STYLED_ITEM('',(#5641),#5639); +#5644=DIRECTION('',(5.466227293958E-1,8.373790012342E-1,0.E0)); +#5645=VECTOR('',#5644,1.524513500598E-1); +#5646=CARTESIAN_POINT('',(-8.933619002485E0,-1.904859859087E0,-4.E-2)); +#5647=LINE('',#5646,#5645); +#5649=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5650=PRESENTATION_STYLE_ASSIGNMENT((#5649)); +#5651=STYLED_ITEM('',(#5650),#5648); +#5653=DIRECTION('',(2.377711385310E-1,9.713212062349E-1,0.E0)); +#5654=VECTOR('',#5653,1.752383707613E-1); +#5655=CARTESIAN_POINT('',(-8.850285629415E0,-1.777200299837E0,-4.E-2)); +#5656=LINE('',#5655,#5654); +#5658=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5659=PRESENTATION_STYLE_ASSIGNMENT((#5658)); +#5660=STYLED_ITEM('',(#5659),#5657); +#5662=DIRECTION('',(0.E0,1.E0,0.E0)); +#5663=VECTOR('',#5662,8.510649204254E-2); +#5664=CARTESIAN_POINT('',(-8.808619002485E0,-1.606987554170E0,-4.E-2)); +#5665=LINE('',#5664,#5663); +#5667=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5668=PRESENTATION_STYLE_ASSIGNMENT((#5667)); +#5669=STYLED_ITEM('',(#5668),#5666); +#5671=DIRECTION('',(-2.377711385310E-1,9.713212062349E-1,0.E0)); +#5672=VECTOR('',#5671,1.752383707613E-1); +#5673=CARTESIAN_POINT('',(-8.808619002485E0,-1.521881062128E0,-4.E-2)); +#5674=LINE('',#5673,#5672); +#5676=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5677=PRESENTATION_STYLE_ASSIGNMENT((#5676)); +#5678=STYLED_ITEM('',(#5677),#5675); +#5680=DIRECTION('',(-6.996250055017E-1,7.145102180353E-1,0.E0)); +#5681=VECTOR('',#5680,2.382229692034E-1); +#5682=CARTESIAN_POINT('',(-8.850285629415E0,-1.351668316461E0,-4.E-2)); +#5683=LINE('',#5682,#5681); +#5685=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5686=PRESENTATION_STYLE_ASSIGNMENT((#5685)); +#5687=STYLED_ITEM('',(#5686),#5684); +#5689=DIRECTION('',(-8.906052429498E-1,4.547771995497E-1,0.E0)); +#5690=VECTOR('',#5689,1.871386096698E-1); +#5691=CARTESIAN_POINT('',(-9.016952375554E0,-1.181455570795E0,-4.E-2)); +#5692=LINE('',#5691,#5690); +#5694=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5695=PRESENTATION_STYLE_ASSIGNMENT((#5694)); +#5696=STYLED_ITEM('',(#5695),#5693); +#5698=DIRECTION('',(-9.858211730931E-1,1.677993286083E-1,0.E0)); +#5699=VECTOR('',#5698,2.535956893841E-1); +#5700=CARTESIAN_POINT('',(-9.183619002485E0,-1.096349197962E0,-4.E-2)); +#5701=LINE('',#5700,#5699); +#5703=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5704=PRESENTATION_STYLE_ASSIGNMENT((#5703)); +#5705=STYLED_ITEM('',(#5704),#5702); +#5707=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5708=VECTOR('',#5707,1.666666865349E-1); +#5709=CARTESIAN_POINT('',(-9.433619002485E0,-1.053796011545E0,-4.E-2)); +#5710=LINE('',#5709,#5708); +#5712=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5713=PRESENTATION_STYLE_ASSIGNMENT((#5712)); +#5714=STYLED_ITEM('',(#5713),#5711); +#5716=DIRECTION('',(-9.895240333173E-1,-1.443682357291E-1,0.E0)); +#5717=VECTOR('',#5716,2.947544950018E-1); +#5718=CARTESIAN_POINT('',(-9.600285689019E0,-1.053796011545E0,-4.E-2)); +#5719=LINE('',#5718,#5717); +#5721=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5722=PRESENTATION_STYLE_ASSIGNMENT((#5721)); +#5723=STYLED_ITEM('',(#5722),#5720); +#5725=DIRECTION('',(-8.906052758868E-1,-4.547771350481E-1,0.E0)); +#5726=VECTOR('',#5725,1.871386362119E-1); +#5727=CARTESIAN_POINT('',(-9.891952345752E0,-1.096349197962E0,-4.E-2)); +#5728=LINE('',#5727,#5726); +#5730=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5731=PRESENTATION_STYLE_ASSIGNMENT((#5730)); +#5732=STYLED_ITEM('',(#5731),#5729); +#5734=DIRECTION('',(-6.996248298646E-1,-7.145103900133E-1,0.E0)); +#5735=VECTOR('',#5734,2.382229118646E-1); +#5736=CARTESIAN_POINT('',(-1.005861900248E1,-1.181455570795E0,-4.E-2)); +#5737=LINE('',#5736,#5735); +#5739=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5740=PRESENTATION_STYLE_ASSIGNMENT((#5739)); +#5741=STYLED_ITEM('',(#5740),#5738); +#5743=DIRECTION('',(-2.377713591533E-1,-9.713211522284E-1,0.E0)); +#5744=VECTOR('',#5743,1.752383805047E-1); +#5745=CARTESIAN_POINT('',(-1.022528566667E1,-1.351668316461E0,-4.E-2)); +#5746=LINE('',#5745,#5744); +#5748=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5749=PRESENTATION_STYLE_ASSIGNMENT((#5748)); +#5750=STYLED_ITEM('',(#5749),#5747); +#5752=DIRECTION('',(1.E0,0.E0,0.E0)); +#5753=VECTOR('',#5752,2.083333320916E-1); +#5754=CARTESIAN_POINT('',(-1.026695233458E1,-1.521881062128E0,-4.E-2)); +#5755=LINE('',#5754,#5753); +#5757=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5758=PRESENTATION_STYLE_ASSIGNMENT((#5757)); +#5759=STYLED_ITEM('',(#5758),#5756); +#5761=DIRECTION('',(5.466225923193E-1,8.373790907147E-1,0.E0)); +#5762=VECTOR('',#5761,1.524513337692E-1); +#5763=CARTESIAN_POINT('',(-1.005861900248E1,-1.521881062128E0,-4.E-2)); +#5764=LINE('',#5763,#5762); +#5766=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5767=PRESENTATION_STYLE_ASSIGNMENT((#5766)); +#5768=STYLED_ITEM('',(#5767),#5765); +#5770=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#5771=VECTOR('',#5770,1.512220046714E-1); +#5772=CARTESIAN_POINT('',(-9.975285659217E0,-1.394221502878E0,-4.E-2)); +#5773=LINE('',#5772,#5771); +#5775=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5776=PRESENTATION_STYLE_ASSIGNMENT((#5775)); +#5777=STYLED_ITEM('',(#5776),#5774); +#5779=DIRECTION('',(9.797707111493E-1,2.001233458994E-1,0.E0)); +#5780=VECTOR('',#5779,2.126347939336E-1); +#5781=CARTESIAN_POINT('',(-9.850285659217E0,-1.309115130045E0,-4.E-2)); +#5782=LINE('',#5781,#5780); +#5784=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5785=PRESENTATION_STYLE_ASSIGNMENT((#5784)); +#5786=STYLED_ITEM('',(#5785),#5783); +#5788=DIRECTION('',(1.E0,0.E0,0.E0)); +#5789=VECTOR('',#5788,1.666666269302E-1); +#5790=CARTESIAN_POINT('',(-9.641952315950E0,-1.266561943628E0,-4.E-2)); +#5791=LINE('',#5790,#5789); +#5793=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5794=PRESENTATION_STYLE_ASSIGNMENT((#5793)); +#5795=STYLED_ITEM('',(#5794),#5792); +#5797=DIRECTION('',(9.797707055361E-1,-2.001233733807E-1,0.E0)); +#5798=VECTOR('',#5797,2.126347647342E-1); +#5799=CARTESIAN_POINT('',(-9.475285689019E0,-1.266561943628E0,-4.E-2)); +#5800=LINE('',#5799,#5798); +#5802=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5803=PRESENTATION_STYLE_ASSIGNMENT((#5802)); +#5804=STYLED_ITEM('',(#5803),#5801); +#5806=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#5807=VECTOR('',#5806,1.512220046714E-1); +#5808=CARTESIAN_POINT('',(-9.266952375554E0,-1.309115130045E0,-4.E-2)); +#5809=LINE('',#5808,#5807); +#5811=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5812=PRESENTATION_STYLE_ASSIGNMENT((#5811)); +#5813=STYLED_ITEM('',(#5812),#5810); +#5815=DIRECTION('',(5.466227293958E-1,-8.373790012342E-1,0.E0)); +#5816=VECTOR('',#5815,1.524513500598E-1); +#5817=CARTESIAN_POINT('',(-9.141952375554E0,-1.394221502878E0,-4.E-2)); +#5818=LINE('',#5817,#5816); +#5820=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5821=PRESENTATION_STYLE_ASSIGNMENT((#5820)); +#5822=STYLED_ITEM('',(#5821),#5819); +#5824=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5825=VECTOR('',#5824,8.510649204254E-2); +#5826=CARTESIAN_POINT('',(-9.058619002485E0,-1.521881062128E0,-4.E-2)); +#5827=LINE('',#5826,#5825); +#5829=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5830=PRESENTATION_STYLE_ASSIGNMENT((#5829)); +#5831=STYLED_ITEM('',(#5830),#5828); +#5833=DIRECTION('',(-4.397136649566E-1,-8.981380143666E-1,0.E0)); +#5834=VECTOR('',#5833,1.895173602985E-1); +#5835=CARTESIAN_POINT('',(-9.058619002485E0,-1.606987554170E0,-4.E-2)); +#5836=LINE('',#5835,#5834); +#5838=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5839=PRESENTATION_STYLE_ASSIGNMENT((#5838)); +#5840=STYLED_ITEM('',(#5839),#5837); +#5842=DIRECTION('',(-7.389229549020E-1,-6.737899277363E-1,0.E0)); +#5843=VECTOR('',#5842,1.578874521614E0); +#5844=CARTESIAN_POINT('',(-9.141952375554E0,-1.777200299837E0,-4.E-2)); +#5845=LINE('',#5844,#5843); +#5847=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5848=PRESENTATION_STYLE_ASSIGNMENT((#5847)); +#5849=STYLED_ITEM('',(#5848),#5846); +#5852=DIRECTION('',(-6.565244392656E-1,-7.543047531648E-1,0.E0)); +#5853=VECTOR('',#5852,1.523172361884E0); +#5854=CARTESIAN_POINT('',(-7.475285748624E0,-1.053796011545E0,-4.E-2)); +#5855=LINE('',#5854,#5853); +#5857=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5858=PRESENTATION_STYLE_ASSIGNMENT((#5857)); +#5859=STYLED_ITEM('',(#5858),#5856); +#5861=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5862=VECTOR('',#5861,2.553191781044E-1); +#5863=CARTESIAN_POINT('',(-8.475285629415E0,-2.202732164003E0,-4.E-2)); +#5864=LINE('',#5863,#5862); +#5866=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5867=PRESENTATION_STYLE_ASSIGNMENT((#5866)); +#5868=STYLED_ITEM('',(#5867),#5865); +#5870=DIRECTION('',(1.E0,0.E0,0.E0)); +#5871=VECTOR('',#5870,9.999998807907E-1); +#5872=CARTESIAN_POINT('',(-8.475285629415E0,-2.458051342107E0,-4.E-2)); +#5873=LINE('',#5872,#5871); +#5875=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5876=PRESENTATION_STYLE_ASSIGNMENT((#5875)); +#5877=STYLED_ITEM('',(#5876),#5874); +#5879=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5880=VECTOR('',#5879,5.957446694374E-1); +#5881=CARTESIAN_POINT('',(-7.475285748624E0,-2.458051342107E0,-4.E-2)); +#5882=LINE('',#5881,#5880); +#5884=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5885=PRESENTATION_STYLE_ASSIGNMENT((#5884)); +#5886=STYLED_ITEM('',(#5885),#5883); +#5888=DIRECTION('',(1.E0,0.E0,0.E0)); +#5889=VECTOR('',#5888,2.5E-1); +#5890=CARTESIAN_POINT('',(-7.475285748624E0,-3.053796011545E0,-4.E-2)); +#5891=LINE('',#5890,#5889); +#5893=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5894=PRESENTATION_STYLE_ASSIGNMENT((#5893)); +#5895=STYLED_ITEM('',(#5894),#5892); +#5897=DIRECTION('',(0.E0,1.E0,0.E0)); +#5898=VECTOR('',#5897,5.957446694374E-1); +#5899=CARTESIAN_POINT('',(-7.225285748624E0,-3.053796011545E0,-4.E-2)); +#5900=LINE('',#5899,#5898); +#5902=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5903=PRESENTATION_STYLE_ASSIGNMENT((#5902)); +#5904=STYLED_ITEM('',(#5903),#5901); +#5906=DIRECTION('',(1.E0,0.E0,0.E0)); +#5907=VECTOR('',#5906,4.166667461395E-1); +#5908=CARTESIAN_POINT('',(-7.225285748624E0,-2.458051342107E0,-4.E-2)); +#5909=LINE('',#5908,#5907); +#5911=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5912=PRESENTATION_STYLE_ASSIGNMENT((#5911)); +#5913=STYLED_ITEM('',(#5912),#5910); +#5915=DIRECTION('',(0.E0,1.E0,0.E0)); +#5916=VECTOR('',#5915,2.553191781044E-1); +#5917=CARTESIAN_POINT('',(-6.808619002485E0,-2.458051342107E0,-4.E-2)); +#5918=LINE('',#5917,#5916); +#5920=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5921=PRESENTATION_STYLE_ASSIGNMENT((#5920)); +#5922=STYLED_ITEM('',(#5921),#5919); +#5924=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5925=VECTOR('',#5924,4.166667461395E-1); +#5926=CARTESIAN_POINT('',(-6.808619002485E0,-2.202732164003E0,-4.E-2)); +#5927=LINE('',#5926,#5925); +#5929=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5930=PRESENTATION_STYLE_ASSIGNMENT((#5929)); +#5931=STYLED_ITEM('',(#5930),#5928); +#5933=DIRECTION('',(0.E0,1.E0,0.E0)); +#5934=VECTOR('',#5933,1.148936152458E0); +#5935=CARTESIAN_POINT('',(-7.225285748624E0,-2.202732164003E0,-4.E-2)); +#5936=LINE('',#5935,#5934); +#5938=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5939=PRESENTATION_STYLE_ASSIGNMENT((#5938)); +#5940=STYLED_ITEM('',(#5939),#5937); +#5942=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5943=VECTOR('',#5942,2.5E-1); +#5944=CARTESIAN_POINT('',(-7.225285748624E0,-1.053796011545E0,-4.E-2)); +#5945=LINE('',#5944,#5943); +#5947=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5948=PRESENTATION_STYLE_ASSIGNMENT((#5947)); +#5949=STYLED_ITEM('',(#5948),#5946); +#5952=DIRECTION('',(6.589715411217E-1,7.521678722145E-1,0.E0)); +#5953=VECTOR('',#5952,1.074907199565E0); +#5954=CARTESIAN_POINT('',(-8.183619002485E0,-2.202732164003E0,-4.E-2)); +#5955=LINE('',#5954,#5953); +#5957=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5958=PRESENTATION_STYLE_ASSIGNMENT((#5957)); +#5959=STYLED_ITEM('',(#5958),#5956); +#5961=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5962=VECTOR('',#5961,8.085106611252E-1); +#5963=CARTESIAN_POINT('',(-7.475285748624E0,-1.394221502878E0,-4.E-2)); +#5964=LINE('',#5963,#5962); +#5966=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5967=PRESENTATION_STYLE_ASSIGNMENT((#5966)); +#5968=STYLED_ITEM('',(#5967),#5965); +#5970=DIRECTION('',(-1.E0,0.E0,0.E0)); +#5971=VECTOR('',#5970,7.083332538605E-1); +#5972=CARTESIAN_POINT('',(-7.475285748624E0,-2.202732164003E0,-4.E-2)); +#5973=LINE('',#5972,#5971); +#5975=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5976=PRESENTATION_STYLE_ASSIGNMENT((#5975)); +#5977=STYLED_ITEM('',(#5976),#5974); +#5980=DIRECTION('',(0.E0,-1.E0,0.E0)); +#5981=VECTOR('',#5980,3.829786777496E-1); +#5982=CARTESIAN_POINT('',(-6.475285748624E0,-1.862306672670E0,-4.E-2)); +#5983=LINE('',#5982,#5981); +#5985=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5986=PRESENTATION_STYLE_ASSIGNMENT((#5985)); +#5987=STYLED_ITEM('',(#5986),#5984); +#5989=DIRECTION('',(1.921831545859E-1,-9.813590755139E-1,0.E0)); +#5990=VECTOR('',#5989,2.168074836179E-1); +#5991=CARTESIAN_POINT('',(-6.475285748624E0,-2.245285350420E0,-4.E-2)); +#5992=LINE('',#5991,#5990); +#5994=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#5995=PRESENTATION_STYLE_ASSIGNMENT((#5994)); +#5996=STYLED_ITEM('',(#5995),#5993); +#5998=DIRECTION('',(3.102805998049E-1,-9.506450175458E-1,0.E0)); +#5999=VECTOR('',#5998,1.342873069271E-1); +#6000=CARTESIAN_POINT('',(-6.433619002485E0,-2.458051342107E0,-4.E-2)); +#6001=LINE('',#6000,#5999); +#6003=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6004=PRESENTATION_STYLE_ASSIGNMENT((#6003)); +#6005=STYLED_ITEM('',(#6004),#6002); +#6007=DIRECTION('',(4.397130954570E-1,-8.981382931841E-1,0.E0)); +#6008=VECTOR('',#6007,1.895173346472E-1); +#6009=CARTESIAN_POINT('',(-6.391952256345E0,-2.585710901357E0,-4.E-2)); +#6010=LINE('',#6009,#6008); +#6012=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6013=PRESENTATION_STYLE_ASSIGNMENT((#6012)); +#6014=STYLED_ITEM('',(#6013),#6011); +#6016=DIRECTION('',(6.996247934953E-1,-7.145104256249E-1,0.E0)); +#6017=VECTOR('',#6016,1.786671958487E-1); +#6018=CARTESIAN_POINT('',(-6.308619002485E0,-2.755923676826E0,-4.E-2)); +#6019=LINE('',#6018,#6017); +#6021=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6022=PRESENTATION_STYLE_ASSIGNMENT((#6021)); +#6023=STYLED_ITEM('',(#6022),#6020); +#6025=DIRECTION('',(8.526535798146E-1,-5.224766720432E-1,0.E0)); +#6026=VECTOR('',#6025,2.443354454975E-1); +#6027=CARTESIAN_POINT('',(-6.183619002485E0,-2.883583250977E0,-4.E-2)); +#6028=LINE('',#6027,#6026); +#6030=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6031=PRESENTATION_STYLE_ASSIGNMENT((#6030)); +#6032=STYLED_ITEM('',(#6031),#6029); +#6034=DIRECTION('',(9.858211706631E-1,-1.677993428846E-1,0.E0)); +#6035=VECTOR('',#6034,2.535956900092E-1); +#6036=CARTESIAN_POINT('',(-5.975285510205E0,-3.011242821403E0,-4.E-2)); +#6037=LINE('',#6036,#6035); +#6039=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6040=PRESENTATION_STYLE_ASSIGNMENT((#6039)); +#6041=STYLED_ITEM('',(#6040),#6038); +#6043=DIRECTION('',(9.858211706631E-1,1.677993428846E-1,0.E0)); +#6044=VECTOR('',#6043,2.535956900092E-1); +#6045=CARTESIAN_POINT('',(-5.725285510205E0,-3.053796011545E0,-4.E-2)); +#6046=LINE('',#6045,#6044); +#6048=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6049=PRESENTATION_STYLE_ASSIGNMENT((#6048)); +#6050=STYLED_ITEM('',(#6049),#6047); +#6052=DIRECTION('',(8.526530470706E-1,5.224775414514E-1,0.E0)); +#6053=VECTOR('',#6052,2.443350389207E-1); +#6054=CARTESIAN_POINT('',(-5.475285510205E0,-3.011242821403E0,-4.E-2)); +#6055=LINE('',#6054,#6053); +#6057=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6058=PRESENTATION_STYLE_ASSIGNMENT((#6057)); +#6059=STYLED_ITEM('',(#6058),#6056); +#6061=DIRECTION('',(6.996247934953E-1,7.145104256249E-1,0.E0)); +#6062=VECTOR('',#6061,1.786671958487E-1); +#6063=CARTESIAN_POINT('',(-5.266952494764E0,-2.883583250977E0,-4.E-2)); +#6064=LINE('',#6063,#6062); +#6066=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6067=PRESENTATION_STYLE_ASSIGNMENT((#6066)); +#6068=STYLED_ITEM('',(#6067),#6065); +#6070=DIRECTION('',(4.397141102494E-1,8.981377963584E-1,0.E0)); +#6071=VECTOR('',#6070,1.895174394831E-1); +#6072=CARTESIAN_POINT('',(-5.141952494764E0,-2.755923676826E0,-4.E-2)); +#6073=LINE('',#6072,#6071); +#6075=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6076=PRESENTATION_STYLE_ASSIGNMENT((#6075)); +#6077=STYLED_ITEM('',(#6076),#6074); +#6079=DIRECTION('',(3.102789952956E-1,9.506455412394E-1,0.E0)); +#6080=VECTOR('',#6079,1.342872329506E-1); +#6081=CARTESIAN_POINT('',(-5.058619002485E0,-2.585710901357E0,-4.E-2)); +#6082=LINE('',#6081,#6080); +#6084=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6085=PRESENTATION_STYLE_ASSIGNMENT((#6084)); +#6086=STYLED_ITEM('',(#6085),#6083); +#6088=DIRECTION('',(1.921842136484E-1,9.813588681132E-1,0.E0)); +#6089=VECTOR('',#6088,2.168075294381E-1); +#6090=CARTESIAN_POINT('',(-5.016952494764E0,-2.458051342107E0,-4.E-2)); +#6091=LINE('',#6090,#6089); +#6093=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6094=PRESENTATION_STYLE_ASSIGNMENT((#6093)); +#6095=STYLED_ITEM('',(#6094),#6092); +#6097=DIRECTION('',(0.E0,1.E0,0.E0)); +#6098=VECTOR('',#6097,3.829786777496E-1); +#6099=CARTESIAN_POINT('',(-4.975285510205E0,-2.245285350420E0,-4.E-2)); +#6100=LINE('',#6099,#6098); +#6102=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6103=PRESENTATION_STYLE_ASSIGNMENT((#6102)); +#6104=STYLED_ITEM('',(#6103),#6101); +#6106=DIRECTION('',(-1.921842654987E-1,9.813588579591E-1,0.E0)); +#6107=VECTOR('',#6106,2.168074709445E-1); +#6108=CARTESIAN_POINT('',(-4.975285510205E0,-1.862306672670E0,-4.E-2)); +#6109=LINE('',#6108,#6107); +#6111=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6112=PRESENTATION_STYLE_ASSIGNMENT((#6111)); +#6113=STYLED_ITEM('',(#6112),#6110); +#6115=DIRECTION('',(-3.102787334496E-1,9.506456267027E-1,0.E0)); +#6116=VECTOR('',#6115,1.342873462764E-1); +#6117=CARTESIAN_POINT('',(-5.016952494764E0,-1.649540740587E0,-4.E-2)); +#6118=LINE('',#6117,#6116); +#6120=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6121=PRESENTATION_STYLE_ASSIGNMENT((#6120)); +#6122=STYLED_ITEM('',(#6121),#6119); +#6124=DIRECTION('',(-4.397141723527E-1,8.981377659536E-1,0.E0)); +#6125=VECTOR('',#6124,1.895174127165E-1); +#6126=CARTESIAN_POINT('',(-5.058619002485E0,-1.521881062128E0,-4.E-2)); +#6127=LINE('',#6126,#6125); +#6129=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6130=PRESENTATION_STYLE_ASSIGNMENT((#6129)); +#6131=STYLED_ITEM('',(#6130),#6128); +#6133=DIRECTION('',(-6.996248351869E-1,7.145103848018E-1,0.E0)); +#6134=VECTOR('',#6133,1.786671852016E-1); +#6135=CARTESIAN_POINT('',(-5.141952494764E0,-1.351668316461E0,-4.E-2)); +#6136=LINE('',#6135,#6134); +#6138=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6139=PRESENTATION_STYLE_ASSIGNMENT((#6138)); +#6140=STYLED_ITEM('',(#6139),#6137); +#6142=DIRECTION('',(-8.526530674474E-1,5.224775081977E-1,0.E0)); +#6143=VECTOR('',#6142,2.443350330816E-1); +#6144=CARTESIAN_POINT('',(-5.266952494764E0,-1.224008757211E0,-4.E-2)); +#6145=LINE('',#6144,#6143); +#6147=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6148=PRESENTATION_STYLE_ASSIGNMENT((#6147)); +#6149=STYLED_ITEM('',(#6148),#6146); +#6151=DIRECTION('',(-9.858211730931E-1,1.677993286083E-1,0.E0)); +#6152=VECTOR('',#6151,2.535956893841E-1); +#6153=CARTESIAN_POINT('',(-5.475285510205E0,-1.096349197962E0,-4.E-2)); +#6154=LINE('',#6153,#6152); +#6156=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6157=PRESENTATION_STYLE_ASSIGNMENT((#6156)); +#6158=STYLED_ITEM('',(#6157),#6155); +#6160=DIRECTION('',(-9.858211730931E-1,-1.677993286083E-1,0.E0)); +#6161=VECTOR('',#6160,2.535956893841E-1); +#6162=CARTESIAN_POINT('',(-5.725285510205E0,-1.053796011545E0,-4.E-2)); +#6163=LINE('',#6162,#6161); +#6165=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6166=PRESENTATION_STYLE_ASSIGNMENT((#6165)); +#6167=STYLED_ITEM('',(#6166),#6164); +#6169=DIRECTION('',(-8.526536001913E-1,-5.224766387895E-1,0.E0)); +#6170=VECTOR('',#6169,2.443354396584E-1); +#6171=CARTESIAN_POINT('',(-5.975285510205E0,-1.096349197962E0,-4.E-2)); +#6172=LINE('',#6171,#6170); +#6174=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6175=PRESENTATION_STYLE_ASSIGNMENT((#6174)); +#6176=STYLED_ITEM('',(#6175),#6173); +#6178=DIRECTION('',(-6.996248351869E-1,-7.145103848018E-1,0.E0)); +#6179=VECTOR('',#6178,1.786671852016E-1); +#6180=CARTESIAN_POINT('',(-6.183619002485E0,-1.224008757211E0,-4.E-2)); +#6181=LINE('',#6180,#6179); +#6183=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6184=PRESENTATION_STYLE_ASSIGNMENT((#6183)); +#6185=STYLED_ITEM('',(#6184),#6182); +#6187=DIRECTION('',(-4.397131575602E-1,-8.981382627794E-1,0.E0)); +#6188=VECTOR('',#6187,1.895173078806E-1); +#6189=CARTESIAN_POINT('',(-6.308619002485E0,-1.351668316461E0,-4.E-2)); +#6190=LINE('',#6189,#6188); +#6192=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6193=PRESENTATION_STYLE_ASSIGNMENT((#6192)); +#6194=STYLED_ITEM('',(#6193),#6191); +#6196=DIRECTION('',(-3.102803379578E-1,-9.506451030099E-1,0.E0)); +#6197=VECTOR('',#6196,1.342874202528E-1); +#6198=CARTESIAN_POINT('',(-6.391952256345E0,-1.521881062128E0,-4.E-2)); +#6199=LINE('',#6198,#6197); +#6201=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6202=PRESENTATION_STYLE_ASSIGNMENT((#6201)); +#6203=STYLED_ITEM('',(#6202),#6200); +#6205=DIRECTION('',(-1.921832064360E-1,-9.813590653599E-1,0.E0)); +#6206=VECTOR('',#6205,2.168074251244E-1); +#6207=CARTESIAN_POINT('',(-6.433619002485E0,-1.649540740587E0,-4.E-2)); +#6208=LINE('',#6207,#6206); +#6210=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6211=PRESENTATION_STYLE_ASSIGNMENT((#6210)); +#6212=STYLED_ITEM('',(#6211),#6209); +#6215=DIRECTION('',(1.610649934498E-1,9.869438017866E-1,0.E0)); +#6216=VECTOR('',#6215,2.586967140759E-1); +#6217=CARTESIAN_POINT('',(-6.266952494764E0,-1.904859859087E0,-4.E-2)); +#6218=LINE('',#6217,#6216); +#6220=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6221=PRESENTATION_STYLE_ASSIGNMENT((#6220)); +#6222=STYLED_ITEM('',(#6221),#6219); +#6224=DIRECTION('',(5.466220021285E-1,8.373794759779E-1,0.E0)); +#6225=VECTOR('',#6224,3.049026696181E-1); +#6226=CARTESIAN_POINT('',(-6.225285510205E0,-1.649540740587E0,-4.E-2)); +#6227=LINE('',#6226,#6225); +#6229=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6230=PRESENTATION_STYLE_ASSIGNMENT((#6229)); +#6231=STYLED_ITEM('',(#6230),#6228); +#6233=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#6234=VECTOR('',#6233,1.512220046714E-1); +#6235=CARTESIAN_POINT('',(-6.058619002485E0,-1.394221502878E0,-4.E-2)); +#6236=LINE('',#6235,#6234); +#6238=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6239=PRESENTATION_STYLE_ASSIGNMENT((#6238)); +#6240=STYLED_ITEM('',(#6239),#6237); +#6242=DIRECTION('',(9.797707392153E-1,2.001232084928E-1,0.E0)); +#6243=VECTOR('',#6242,2.126349399308E-1); +#6244=CARTESIAN_POINT('',(-5.933619002485E0,-1.309115130045E0,-4.E-2)); +#6245=LINE('',#6244,#6243); +#6247=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6248=PRESENTATION_STYLE_ASSIGNMENT((#6247)); +#6249=STYLED_ITEM('',(#6248),#6246); +#6251=DIRECTION('',(9.797706494039E-1,-2.001236481946E-1,0.E0)); +#6252=VECTOR('',#6251,2.126344727398E-1); +#6253=CARTESIAN_POINT('',(-5.725285510205E0,-1.266561943628E0,-4.E-2)); +#6254=LINE('',#6253,#6252); +#6256=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6257=PRESENTATION_STYLE_ASSIGNMENT((#6256)); +#6258=STYLED_ITEM('',(#6257),#6255); +#6260=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#6261=VECTOR('',#6260,1.512220046714E-1); +#6262=CARTESIAN_POINT('',(-5.516952494764E0,-1.309115130045E0,-4.E-2)); +#6263=LINE('',#6262,#6261); +#6265=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6266=PRESENTATION_STYLE_ASSIGNMENT((#6265)); +#6267=STYLED_ITEM('',(#6266),#6264); +#6269=DIRECTION('',(5.466230987403E-1,-8.373787601340E-1,0.E0)); +#6270=VECTOR('',#6269,3.049029302680E-1); +#6271=CARTESIAN_POINT('',(-5.391952494764E0,-1.394221502878E0,-4.E-2)); +#6272=LINE('',#6271,#6270); +#6274=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6275=PRESENTATION_STYLE_ASSIGNMENT((#6274)); +#6276=STYLED_ITEM('',(#6275),#6273); +#6278=DIRECTION('',(1.610631980374E-1,-9.869440947885E-1,0.E0)); +#6279=VECTOR('',#6278,2.586966372745E-1); +#6280=CARTESIAN_POINT('',(-5.225285510205E0,-1.649540740587E0,-4.E-2)); +#6281=LINE('',#6280,#6279); +#6283=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6284=PRESENTATION_STYLE_ASSIGNMENT((#6283)); +#6285=STYLED_ITEM('',(#6284),#6282); +#6287=DIRECTION('',(0.E0,-1.E0,0.E0)); +#6288=VECTOR('',#6287,2.978723049164E-1); +#6289=CARTESIAN_POINT('',(-5.183619002485E0,-1.904859859087E0,-4.E-2)); +#6290=LINE('',#6289,#6288); +#6292=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6293=PRESENTATION_STYLE_ASSIGNMENT((#6292)); +#6294=STYLED_ITEM('',(#6293),#6291); +#6296=DIRECTION('',(-1.610631614123E-1,-9.869441007655E-1,0.E0)); +#6297=VECTOR('',#6296,2.586966961010E-1); +#6298=CARTESIAN_POINT('',(-5.183619002485E0,-2.202732164003E0,-4.E-2)); +#6299=LINE('',#6298,#6297); +#6301=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6302=PRESENTATION_STYLE_ASSIGNMENT((#6301)); +#6303=STYLED_ITEM('',(#6302),#6300); +#6305=DIRECTION('',(-5.466232329611E-1,-8.373786725175E-1,0.E0)); +#6306=VECTOR('',#6305,3.049028554005E-1); +#6307=CARTESIAN_POINT('',(-5.225285510205E0,-2.458051342107E0,-4.E-2)); +#6308=LINE('',#6307,#6306); +#6310=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6311=PRESENTATION_STYLE_ASSIGNMENT((#6310)); +#6312=STYLED_ITEM('',(#6311),#6309); +#6314=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#6315=VECTOR('',#6314,1.512220046714E-1); +#6316=CARTESIAN_POINT('',(-5.391952494764E0,-2.713370490410E0,-4.E-2)); +#6317=LINE('',#6316,#6315); +#6319=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6320=PRESENTATION_STYLE_ASSIGNMENT((#6319)); +#6321=STYLED_ITEM('',(#6320),#6318); +#6323=DIRECTION('',(-9.797706494039E-1,-2.001236481946E-1,0.E0)); +#6324=VECTOR('',#6323,2.126344727398E-1); +#6325=CARTESIAN_POINT('',(-5.516952494764E0,-2.798476863243E0,-4.E-2)); +#6326=LINE('',#6325,#6324); +#6328=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6329=PRESENTATION_STYLE_ASSIGNMENT((#6328)); +#6330=STYLED_ITEM('',(#6329),#6327); +#6332=DIRECTION('',(-9.797707392153E-1,2.001232084928E-1,0.E0)); +#6333=VECTOR('',#6332,2.126349399308E-1); +#6334=CARTESIAN_POINT('',(-5.725285510205E0,-2.841030049659E0,-4.E-2)); +#6335=LINE('',#6334,#6333); +#6337=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6338=PRESENTATION_STYLE_ASSIGNMENT((#6337)); +#6339=STYLED_ITEM('',(#6338),#6336); +#6341=DIRECTION('',(-8.265992787996E-1,5.627909312417E-1,0.E0)); +#6342=VECTOR('',#6341,1.512220046714E-1); +#6343=CARTESIAN_POINT('',(-5.933619002485E0,-2.798476863243E0,-4.E-2)); +#6344=LINE('',#6343,#6342); +#6346=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6347=PRESENTATION_STYLE_ASSIGNMENT((#6346)); +#6348=STYLED_ITEM('',(#6347),#6345); +#6350=DIRECTION('',(-5.466221363492E-1,8.373793883617E-1,0.E0)); +#6351=VECTOR('',#6350,3.049025947505E-1); +#6352=CARTESIAN_POINT('',(-6.058619002485E0,-2.713370490410E0,-4.E-2)); +#6353=LINE('',#6352,#6351); +#6355=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6356=PRESENTATION_STYLE_ASSIGNMENT((#6355)); +#6357=STYLED_ITEM('',(#6356),#6354); +#6359=DIRECTION('',(-1.610649568243E-1,9.869438077637E-1,0.E0)); +#6360=VECTOR('',#6359,2.586967729023E-1); +#6361=CARTESIAN_POINT('',(-6.225285510205E0,-2.458051342107E0,-4.E-2)); +#6362=LINE('',#6361,#6360); +#6364=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6365=PRESENTATION_STYLE_ASSIGNMENT((#6364)); +#6366=STYLED_ITEM('',(#6365),#6363); +#6368=DIRECTION('',(0.E0,1.E0,0.E0)); +#6369=VECTOR('',#6368,2.978723049164E-1); +#6370=CARTESIAN_POINT('',(-6.266952494764E0,-2.202732164003E0,-4.E-2)); +#6371=LINE('',#6370,#6369); +#6373=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6374=PRESENTATION_STYLE_ASSIGNMENT((#6373)); +#6375=STYLED_ITEM('',(#6374),#6372); +#6378=DIRECTION('',(1.E0,0.E0,0.E0)); +#6379=VECTOR('',#6378,2.5E-1); +#6380=CARTESIAN_POINT('',(-3.225285510205E0,-3.053796011545E0,-4.E-2)); +#6381=LINE('',#6380,#6379); +#6383=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6384=PRESENTATION_STYLE_ASSIGNMENT((#6383)); +#6385=STYLED_ITEM('',(#6384),#6382); +#6387=DIRECTION('',(-5.699145823507E-1,8.217039423199E-1,0.E0)); +#6388=VECTOR('',#6387,1.242876589256E0); +#6389=CARTESIAN_POINT('',(-2.975285510205E0,-3.053796011545E0,-4.E-2)); +#6390=LINE('',#6389,#6388); +#6392=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6393=PRESENTATION_STYLE_ASSIGNMENT((#6392)); +#6394=STYLED_ITEM('',(#6393),#6391); +#6396=DIRECTION('',(5.862940913059E-1,8.100982894068E-1,0.E0)); +#6397=VECTOR('',#6396,1.208153898842E0); +#6398=CARTESIAN_POINT('',(-3.683619002485E0,-2.032519418337E0,-4.E-2)); +#6399=LINE('',#6398,#6397); +#6401=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6402=PRESENTATION_STYLE_ASSIGNMENT((#6401)); +#6403=STYLED_ITEM('',(#6402),#6400); +#6405=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6406=VECTOR('',#6405,2.5E-1); +#6407=CARTESIAN_POINT('',(-2.975285510205E0,-1.053796011545E0,-4.E-2)); +#6408=LINE('',#6407,#6406); +#6410=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6411=PRESENTATION_STYLE_ASSIGNMENT((#6410)); +#6412=STYLED_ITEM('',(#6411),#6409); +#6414=DIRECTION('',(-5.851009867210E-1,-8.109604400574E-1,0.E0)); +#6415=VECTOR('',#6414,9.969791634571E-1); +#6416=CARTESIAN_POINT('',(-3.225285510205E0,-1.053796011545E0,-4.E-2)); +#6417=LINE('',#6416,#6415); +#6419=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6420=PRESENTATION_STYLE_ASSIGNMENT((#6419)); +#6421=STYLED_ITEM('',(#6420),#6418); +#6423=DIRECTION('',(-5.851009867210E-1,8.109604400574E-1,0.E0)); +#6424=VECTOR('',#6423,9.969791634571E-1); +#6425=CARTESIAN_POINT('',(-3.808619002485E0,-1.862306672670E0,-4.E-2)); +#6426=LINE('',#6425,#6424); +#6428=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6429=PRESENTATION_STYLE_ASSIGNMENT((#6428)); +#6430=STYLED_ITEM('',(#6429),#6427); +#6432=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6433=VECTOR('',#6432,2.5E-1); +#6434=CARTESIAN_POINT('',(-4.391952494764E0,-1.053796011545E0,-4.E-2)); +#6435=LINE('',#6434,#6433); +#6437=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6438=PRESENTATION_STYLE_ASSIGNMENT((#6437)); +#6439=STYLED_ITEM('',(#6438),#6436); +#6441=DIRECTION('',(5.862940913059E-1,-8.100982894068E-1,0.E0)); +#6442=VECTOR('',#6441,1.208153898842E0); +#6443=CARTESIAN_POINT('',(-4.641952494764E0,-1.053796011545E0,-4.E-2)); +#6444=LINE('',#6443,#6442); +#6446=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6447=PRESENTATION_STYLE_ASSIGNMENT((#6446)); +#6448=STYLED_ITEM('',(#6447),#6445); +#6450=DIRECTION('',(-5.699145823507E-1,-8.217039423199E-1,0.E0)); +#6451=VECTOR('',#6450,1.242876589256E0); +#6452=CARTESIAN_POINT('',(-3.933619002485E0,-2.032519418337E0,-4.E-2)); +#6453=LINE('',#6452,#6451); +#6455=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6456=PRESENTATION_STYLE_ASSIGNMENT((#6455)); +#6457=STYLED_ITEM('',(#6456),#6454); +#6459=DIRECTION('',(1.E0,0.E0,0.E0)); +#6460=VECTOR('',#6459,2.5E-1); +#6461=CARTESIAN_POINT('',(-4.641952494764E0,-3.053796011545E0,-4.E-2)); +#6462=LINE('',#6461,#6460); +#6464=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6465=PRESENTATION_STYLE_ASSIGNMENT((#6464)); +#6466=STYLED_ITEM('',(#6465),#6463); +#6468=DIRECTION('',(5.851009867210E-1,8.109604400574E-1,0.E0)); +#6469=VECTOR('',#6468,9.969791634571E-1); +#6470=CARTESIAN_POINT('',(-4.391952494764E0,-3.053796011545E0,-4.E-2)); +#6471=LINE('',#6470,#6469); +#6473=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6474=PRESENTATION_STYLE_ASSIGNMENT((#6473)); +#6475=STYLED_ITEM('',(#6474),#6472); +#6477=DIRECTION('',(5.851009867210E-1,-8.109604400574E-1,0.E0)); +#6478=VECTOR('',#6477,9.969791634571E-1); +#6479=CARTESIAN_POINT('',(-3.808619002485E0,-2.245285350420E0,-4.E-2)); +#6480=LINE('',#6479,#6478); +#6482=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6483=PRESENTATION_STYLE_ASSIGNMENT((#6482)); +#6484=STYLED_ITEM('',(#6483),#6481); +#6487=DIRECTION('',(1.E0,0.E0,0.E0)); +#6488=VECTOR('',#6487,7.083334922791E-1); +#6489=CARTESIAN_POINT('',(-2.391952494764E0,-2.160178977586E0,-4.E-2)); +#6490=LINE('',#6489,#6488); +#6492=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6493=PRESENTATION_STYLE_ASSIGNMENT((#6492)); +#6494=STYLED_ITEM('',(#6493),#6491); +#6496=DIRECTION('',(3.494927993883E-1,-9.369390498724E-1,0.E0)); +#6497=VECTOR('',#6496,9.537621834421E-1); +#6498=CARTESIAN_POINT('',(-1.683619002485E0,-2.160178977586E0,-4.E-2)); +#6499=LINE('',#6498,#6497); +#6501=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6502=PRESENTATION_STYLE_ASSIGNMENT((#6501)); +#6503=STYLED_ITEM('',(#6502),#6500); +#6505=DIRECTION('',(1.E0,0.E0,0.E0)); +#6506=VECTOR('',#6505,2.916669845581E-1); +#6507=CARTESIAN_POINT('',(-1.350285987043E0,-3.053796011545E0,-4.E-2)); +#6508=LINE('',#6507,#6506); +#6510=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6511=PRESENTATION_STYLE_ASSIGNMENT((#6510)); +#6512=STYLED_ITEM('',(#6511),#6509); +#6514=DIRECTION('',(-3.577885126009E-1,9.338026452366E-1,0.E0)); +#6515=VECTOR('',#6514,1.048105198442E0); +#6516=CARTESIAN_POINT('',(-1.058619002485E0,-3.053796011545E0,-4.E-2)); +#6517=LINE('',#6516,#6515); +#6519=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6520=PRESENTATION_STYLE_ASSIGNMENT((#6519)); +#6521=STYLED_ITEM('',(#6520),#6518); +#6523=DIRECTION('',(8.906056381928E-1,4.547764255314E-1,0.E0)); +#6524=VECTOR('',#6523,1.871389281751E-1); +#6525=CARTESIAN_POINT('',(-1.433619002485E0,-2.075072604753E0,-4.E-2)); +#6526=LINE('',#6525,#6524); +#6528=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6529=PRESENTATION_STYLE_ASSIGNMENT((#6528)); +#6530=STYLED_ITEM('',(#6529),#6527); +#6532=DIRECTION('',(5.919095487496E-1,8.060043958311E-1,0.E0)); +#6533=VECTOR('',#6532,2.111809148274E-1); +#6534=CARTESIAN_POINT('',(-1.266952017926E0,-1.989966231920E0,-4.E-2)); +#6535=LINE('',#6534,#6533); +#6537=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6538=PRESENTATION_STYLE_ASSIGNMENT((#6537)); +#6539=STYLED_ITEM('',(#6538),#6536); +#6541=DIRECTION('',(3.102757862690E-1,9.506465886201E-1,0.E0)); +#6542=VECTOR('',#6541,1.342870849988E-1); +#6543=CARTESIAN_POINT('',(-1.141952017926E0,-1.819753486253E0,-4.E-2)); +#6544=LINE('',#6543,#6542); +#6546=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6547=PRESENTATION_STYLE_ASSIGNMENT((#6546)); +#6548=STYLED_ITEM('',(#6547),#6545); +#6550=DIRECTION('',(0.E0,1.E0,0.E0)); +#6551=VECTOR('',#6550,1.702128648758E-1); +#6552=CARTESIAN_POINT('',(-1.100285987043E0,-1.692093927004E0,-4.E-2)); +#6553=LINE('',#6552,#6551); +#6555=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6556=PRESENTATION_STYLE_ASSIGNMENT((#6555)); +#6557=STYLED_ITEM('',(#6556),#6554); +#6559=DIRECTION('',(-3.102757862690E-1,9.506465886201E-1,0.E0)); +#6560=VECTOR('',#6559,1.342870849988E-1); +#6561=CARTESIAN_POINT('',(-1.100285987043E0,-1.521881062128E0,-4.E-2)); +#6562=LINE('',#6561,#6560); +#6564=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6565=PRESENTATION_STYLE_ASSIGNMENT((#6564)); +#6566=STYLED_ITEM('',(#6565),#6563); +#6568=DIRECTION('',(-5.919095487496E-1,8.060043958311E-1,0.E0)); +#6569=VECTOR('',#6568,2.111809148274E-1); +#6570=CARTESIAN_POINT('',(-1.141952017926E0,-1.394221502878E0,-4.E-2)); +#6571=LINE('',#6570,#6569); +#6573=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6574=PRESENTATION_STYLE_ASSIGNMENT((#6573)); +#6575=STYLED_ITEM('',(#6574),#6572); +#6577=DIRECTION('',(-7.938787408812E-1,6.080761011394E-1,0.E0)); +#6578=VECTOR('',#6577,2.099401029093E-1); +#6579=CARTESIAN_POINT('',(-1.266952017926E0,-1.224008757211E0,-4.E-2)); +#6580=LINE('',#6579,#6578); +#6582=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6583=PRESENTATION_STYLE_ASSIGNMENT((#6582)); +#6584=STYLED_ITEM('',(#6583),#6581); +#6586=DIRECTION('',(-9.797706494039E-1,2.001236481946E-1,0.E0)); +#6587=VECTOR('',#6586,2.126344727398E-1); +#6588=CARTESIAN_POINT('',(-1.433619002485E0,-1.096349197962E0,-4.E-2)); +#6589=LINE('',#6588,#6587); +#6591=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6592=PRESENTATION_STYLE_ASSIGNMENT((#6591)); +#6593=STYLED_ITEM('',(#6592),#6590); +#6595=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6596=VECTOR('',#6595,1.000000476837E0); +#6597=CARTESIAN_POINT('',(-1.641952017926E0,-1.053796011545E0,-4.E-2)); +#6598=LINE('',#6597,#6596); +#6600=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6601=PRESENTATION_STYLE_ASSIGNMENT((#6600)); +#6602=STYLED_ITEM('',(#6601),#6599); +#6604=DIRECTION('',(0.E0,-1.E0,0.E0)); +#6605=VECTOR('',#6604,2.E0); +#6606=CARTESIAN_POINT('',(-2.641952494764E0,-1.053796011545E0,-4.E-2)); +#6607=LINE('',#6606,#6605); +#6609=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6610=PRESENTATION_STYLE_ASSIGNMENT((#6609)); +#6611=STYLED_ITEM('',(#6610),#6608); +#6613=DIRECTION('',(1.E0,0.E0,0.E0)); +#6614=VECTOR('',#6613,2.5E-1); +#6615=CARTESIAN_POINT('',(-2.641952494764E0,-3.053796011545E0,-4.E-2)); +#6616=LINE('',#6615,#6614); +#6618=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6619=PRESENTATION_STYLE_ASSIGNMENT((#6618)); +#6620=STYLED_ITEM('',(#6619),#6617); +#6622=DIRECTION('',(0.E0,1.E0,0.E0)); +#6623=VECTOR('',#6622,8.936170339584E-1); +#6624=CARTESIAN_POINT('',(-2.391952494764E0,-3.053796011545E0,-4.E-2)); +#6625=LINE('',#6624,#6623); +#6627=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6628=PRESENTATION_STYLE_ASSIGNMENT((#6627)); +#6629=STYLED_ITEM('',(#6628),#6626); +#6632=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6633=VECTOR('',#6632,7.916665077209E-1); +#6634=CARTESIAN_POINT('',(-1.600285987043E0,-1.904859859087E0,-4.E-2)); +#6635=LINE('',#6634,#6633); +#6637=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6638=PRESENTATION_STYLE_ASSIGNMENT((#6637)); +#6639=STYLED_ITEM('',(#6638),#6636); +#6641=DIRECTION('',(0.E0,1.E0,0.E0)); +#6642=VECTOR('',#6641,6.382979154587E-1); +#6643=CARTESIAN_POINT('',(-2.391952494764E0,-1.904859859087E0,-4.E-2)); +#6644=LINE('',#6643,#6642); +#6646=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6647=PRESENTATION_STYLE_ASSIGNMENT((#6646)); +#6648=STYLED_ITEM('',(#6647),#6645); +#6650=DIRECTION('',(1.E0,0.E0,0.E0)); +#6651=VECTOR('',#6650,7.916665077209E-1); +#6652=CARTESIAN_POINT('',(-2.391952494764E0,-1.266561943628E0,-4.E-2)); +#6653=LINE('',#6652,#6651); +#6655=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6656=PRESENTATION_STYLE_ASSIGNMENT((#6655)); +#6657=STYLED_ITEM('',(#6656),#6654); +#6659=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#6660=VECTOR('',#6659,1.320445897196E-1); +#6661=CARTESIAN_POINT('',(-1.600285987043E0,-1.266561943628E0,-4.E-2)); +#6662=LINE('',#6661,#6660); +#6664=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6665=PRESENTATION_STYLE_ASSIGNMENT((#6664)); +#6666=STYLED_ITEM('',(#6665),#6663); +#6668=DIRECTION('',(6.996275602085E-1,-7.145077165410E-1,0.E0)); +#6669=VECTOR('',#6668,1.191119016114E-1); +#6670=CARTESIAN_POINT('',(-1.475285987043E0,-1.309115130045E0,-4.E-2)); +#6671=LINE('',#6670,#6669); +#6673=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6674=PRESENTATION_STYLE_ASSIGNMENT((#6673)); +#6675=STYLED_ITEM('',(#6674),#6672); +#6677=DIRECTION('',(3.102757862690E-1,-9.506465886201E-1,0.E0)); +#6678=VECTOR('',#6677,1.342870849988E-1); +#6679=CARTESIAN_POINT('',(-1.391952017926E0,-1.394221502878E0,-4.E-2)); +#6680=LINE('',#6679,#6678); +#6682=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6683=PRESENTATION_STYLE_ASSIGNMENT((#6682)); +#6684=STYLED_ITEM('',(#6683),#6681); +#6686=DIRECTION('',(0.E0,-1.E0,0.E0)); +#6687=VECTOR('',#6686,1.276596784592E-1); +#6688=CARTESIAN_POINT('',(-1.350285987043E0,-1.521881062128E0,-4.E-2)); +#6689=LINE('',#6688,#6687); +#6691=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6692=PRESENTATION_STYLE_ASSIGNMENT((#6691)); +#6693=STYLED_ITEM('',(#6692),#6690); +#6695=DIRECTION('',(-3.102757862690E-1,-9.506465886201E-1,0.E0)); +#6696=VECTOR('',#6695,1.342870849988E-1); +#6697=CARTESIAN_POINT('',(-1.350285987043E0,-1.649540740587E0,-4.E-2)); +#6698=LINE('',#6697,#6696); +#6700=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6701=PRESENTATION_STYLE_ASSIGNMENT((#6700)); +#6702=STYLED_ITEM('',(#6701),#6699); +#6704=DIRECTION('',(-6.996275602085E-1,-7.145077165410E-1,0.E0)); +#6705=VECTOR('',#6704,1.191119016114E-1); +#6706=CARTESIAN_POINT('',(-1.391952017926E0,-1.777200299837E0,-4.E-2)); +#6707=LINE('',#6706,#6705); +#6709=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6710=PRESENTATION_STYLE_ASSIGNMENT((#6709)); +#6711=STYLED_ITEM('',(#6710),#6708); +#6713=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#6714=VECTOR('',#6713,1.320445897196E-1); +#6715=CARTESIAN_POINT('',(-1.475285987043E0,-1.862306672670E0,-4.E-2)); +#6716=LINE('',#6715,#6714); +#6718=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6719=PRESENTATION_STYLE_ASSIGNMENT((#6718)); +#6720=STYLED_ITEM('',(#6719),#6717); +#6723=DIRECTION('',(0.E0,1.E0,0.E0)); +#6724=VECTOR('',#6723,6.382978558540E-1); +#6725=CARTESIAN_POINT('',(8.997140129574E-1,-2.585710901357E0,-4.E-2)); +#6726=LINE('',#6725,#6724); +#6728=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6729=PRESENTATION_STYLE_ASSIGNMENT((#6728)); +#6730=STYLED_ITEM('',(#6729),#6727); +#6732=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6733=VECTOR('',#6732,6.25E-1); +#6734=CARTESIAN_POINT('',(8.997140129574E-1,-1.947413045503E0,-4.E-2)); +#6735=LINE('',#6734,#6733); +#6737=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6738=PRESENTATION_STYLE_ASSIGNMENT((#6737)); +#6739=STYLED_ITEM('',(#6738),#6736); +#6741=DIRECTION('',(0.E0,-1.E0,0.E0)); +#6742=VECTOR('',#6741,2.553191184998E-1); +#6743=CARTESIAN_POINT('',(2.747140129574E-1,-1.947413045503E0,-4.E-2)); +#6744=LINE('',#6743,#6742); +#6746=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6747=PRESENTATION_STYLE_ASSIGNMENT((#6746)); +#6748=STYLED_ITEM('',(#6747),#6745); +#6750=DIRECTION('',(1.E0,0.E0,0.E0)); +#6751=VECTOR('',#6750,3.75E-1); +#6752=CARTESIAN_POINT('',(2.747140129574E-1,-2.202732164003E0,-4.E-2)); +#6753=LINE('',#6752,#6751); +#6755=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6756=PRESENTATION_STYLE_ASSIGNMENT((#6755)); +#6757=STYLED_ITEM('',(#6756),#6754); +#6759=DIRECTION('',(0.E0,-1.E0,0.E0)); +#6760=VECTOR('',#6759,3.404255509377E-1); +#6761=CARTESIAN_POINT('',(6.497140129574E-1,-2.202732164003E0,-4.E-2)); +#6762=LINE('',#6761,#6760); +#6764=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6765=PRESENTATION_STYLE_ASSIGNMENT((#6764)); +#6766=STYLED_ITEM('',(#6765),#6763); +#6768=DIRECTION('',(-3.102757862690E-1,-9.506465886201E-1,0.E0)); +#6769=VECTOR('',#6768,1.342870849988E-1); +#6770=CARTESIAN_POINT('',(6.497140129574E-1,-2.543157714941E0,-4.E-2)); +#6771=LINE('',#6770,#6769); +#6773=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6774=PRESENTATION_STYLE_ASSIGNMENT((#6773)); +#6775=STYLED_ITEM('',(#6774),#6772); +#6777=DIRECTION('',(-8.265991871191E-1,-5.627910658975E-1,0.E0)); +#6778=VECTOR('',#6777,1.512220214439E-1); +#6779=CARTESIAN_POINT('',(6.080479820736E-1,-2.670817274191E0,-4.E-2)); +#6780=LINE('',#6779,#6778); +#6782=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6783=PRESENTATION_STYLE_ASSIGNMENT((#6782)); +#6784=STYLED_ITEM('',(#6783),#6781); +#6786=DIRECTION('',(-9.689178307915E-1,-2.473827746112E-1,0.E0)); +#6787=VECTOR('',#6786,1.720135384669E-1); +#6788=CARTESIAN_POINT('',(4.830479820736E-1,-2.755923676826E0,-4.E-2)); +#6789=LINE('',#6788,#6787); +#6791=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6792=PRESENTATION_STYLE_ASSIGNMENT((#6791)); +#6793=STYLED_ITEM('',(#6792),#6790); +#6795=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6796=VECTOR('',#6795,3.75E-1); +#6797=CARTESIAN_POINT('',(3.163809975155E-1,-2.798476863243E0,-4.E-2)); +#6798=LINE('',#6797,#6796); +#6800=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6801=PRESENTATION_STYLE_ASSIGNMENT((#6800)); +#6802=STYLED_ITEM('',(#6801),#6799); +#6804=DIRECTION('',(-9.689178307915E-1,2.473827746112E-1,0.E0)); +#6805=VECTOR('',#6804,1.720135384669E-1); +#6806=CARTESIAN_POINT('',(-5.861900248454E-2,-2.798476863243E0,-4.E-2)); +#6807=LINE('',#6806,#6805); +#6809=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6810=PRESENTATION_STYLE_ASSIGNMENT((#6809)); +#6811=STYLED_ITEM('',(#6810),#6808); +#6813=DIRECTION('',(-8.265991871191E-1,5.627910658975E-1,0.E0)); +#6814=VECTOR('',#6813,1.512220214439E-1); +#6815=CARTESIAN_POINT('',(-2.252859870426E-1,-2.755923676826E0,-4.E-2)); +#6816=LINE('',#6815,#6814); +#6818=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6819=PRESENTATION_STYLE_ASSIGNMENT((#6818)); +#6820=STYLED_ITEM('',(#6819),#6817); +#6822=DIRECTION('',(-5.466210844748E-1,8.373800750004E-1,0.E0)); +#6823=VECTOR('',#6822,1.524511545726E-1); +#6824=CARTESIAN_POINT('',(-3.502859870426E-1,-2.670817274191E0,-4.E-2)); +#6825=LINE('',#6824,#6823); +#6827=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6828=PRESENTATION_STYLE_ASSIGNMENT((#6827)); +#6829=STYLED_ITEM('',(#6828),#6826); +#6831=DIRECTION('',(-2.377730639603E-1,9.713207349042E-1,0.E0)); +#6832=VECTOR('',#6831,1.752384557952E-1); +#6833=CARTESIAN_POINT('',(-4.336190024845E-1,-2.543157714941E0,-4.E-2)); +#6834=LINE('',#6833,#6832); +#6836=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6837=PRESENTATION_STYLE_ASSIGNMENT((#6836)); +#6838=STYLED_ITEM('',(#6837),#6835); +#6840=DIRECTION('',(0.E0,1.E0,0.E0)); +#6841=VECTOR('',#6840,6.382978558540E-1); +#6842=CARTESIAN_POINT('',(-4.752859870426E-1,-2.372944969274E0,-4.E-2)); +#6843=LINE('',#6842,#6841); +#6845=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6846=PRESENTATION_STYLE_ASSIGNMENT((#6845)); +#6847=STYLED_ITEM('',(#6846),#6844); +#6849=DIRECTION('',(2.377730639603E-1,9.713207349042E-1,0.E0)); +#6850=VECTOR('',#6849,1.752384557952E-1); +#6851=CARTESIAN_POINT('',(-4.752859870426E-1,-1.734647113420E0,-4.E-2)); +#6852=LINE('',#6851,#6850); +#6854=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6855=PRESENTATION_STYLE_ASSIGNMENT((#6854)); +#6856=STYLED_ITEM('',(#6855),#6853); +#6858=DIRECTION('',(5.466207265530E-1,8.373803086428E-1,0.E0)); +#6859=VECTOR('',#6858,1.524512543961E-1); +#6860=CARTESIAN_POINT('',(-4.336190024845E-1,-1.564434367754E0,-4.E-2)); +#6861=LINE('',#6860,#6859); +#6863=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6864=PRESENTATION_STYLE_ASSIGNMENT((#6863)); +#6865=STYLED_ITEM('',(#6864),#6862); +#6867=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#6868=VECTOR('',#6867,1.512220046714E-1); +#6869=CARTESIAN_POINT('',(-3.502859870426E-1,-1.436774689295E0,-4.E-2)); +#6870=LINE('',#6869,#6868); +#6872=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6873=PRESENTATION_STYLE_ASSIGNMENT((#6872)); +#6874=STYLED_ITEM('',(#6873),#6871); +#6876=DIRECTION('',(9.689178307915E-1,2.473827746112E-1,0.E0)); +#6877=VECTOR('',#6876,1.720135384669E-1); +#6878=CARTESIAN_POINT('',(-2.252859870426E-1,-1.351668316461E0,-4.E-2)); +#6879=LINE('',#6878,#6877); +#6881=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6882=PRESENTATION_STYLE_ASSIGNMENT((#6881)); +#6883=STYLED_ITEM('',(#6882),#6880); +#6885=DIRECTION('',(1.E0,0.E0,0.E0)); +#6886=VECTOR('',#6885,3.75E-1); +#6887=CARTESIAN_POINT('',(-5.861900248454E-2,-1.309115130045E0,-4.E-2)); +#6888=LINE('',#6887,#6886); +#6890=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6891=PRESENTATION_STYLE_ASSIGNMENT((#6890)); +#6892=STYLED_ITEM('',(#6891),#6889); +#6894=DIRECTION('',(9.689178307915E-1,-2.473827746112E-1,0.E0)); +#6895=VECTOR('',#6894,1.720135384669E-1); +#6896=CARTESIAN_POINT('',(3.163809975155E-1,-1.309115130045E0,-4.E-2)); +#6897=LINE('',#6896,#6895); +#6899=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6900=PRESENTATION_STYLE_ASSIGNMENT((#6899)); +#6901=STYLED_ITEM('',(#6900),#6898); +#6903=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#6904=VECTOR('',#6903,1.512220046714E-1); +#6905=CARTESIAN_POINT('',(4.830479820736E-1,-1.351668316461E0,-4.E-2)); +#6906=LINE('',#6905,#6904); +#6908=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6909=PRESENTATION_STYLE_ASSIGNMENT((#6908)); +#6910=STYLED_ITEM('',(#6909),#6907); +#6912=DIRECTION('',(3.102755244251E-1,-9.506466740818E-1,0.E0)); +#6913=VECTOR('',#6912,1.342871983247E-1); +#6914=CARTESIAN_POINT('',(6.080479820736E-1,-1.436774689295E0,-4.E-2)); +#6915=LINE('',#6914,#6913); +#6917=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6918=PRESENTATION_STYLE_ASSIGNMENT((#6917)); +#6919=STYLED_ITEM('',(#6918),#6916); +#6921=DIRECTION('',(1.E0,0.E0,0.E0)); +#6922=VECTOR('',#6921,2.5E-1); +#6923=CARTESIAN_POINT('',(6.497140129574E-1,-1.564434367754E0,-4.E-2)); +#6924=LINE('',#6923,#6922); +#6926=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6927=PRESENTATION_STYLE_ASSIGNMENT((#6926)); +#6928=STYLED_ITEM('',(#6927),#6925); +#6930=DIRECTION('',(-1.921799255453E-1,9.813597078632E-1,0.E0)); +#6931=VECTOR('',#6930,2.168074046526E-1); +#6932=CARTESIAN_POINT('',(8.997140129574E-1,-1.564434367754E0,-4.E-2)); +#6933=LINE('',#6932,#6931); +#6935=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6936=PRESENTATION_STYLE_ASSIGNMENT((#6935)); +#6937=STYLED_ITEM('',(#6936),#6934); +#6939=DIRECTION('',(-6.996255164452E-1,7.145097177357E-1,0.E0)); +#6940=VECTOR('',#6939,2.382231360070E-1); +#6941=CARTESIAN_POINT('',(8.580479820736E-1,-1.351668316461E0,-4.E-2)); +#6942=LINE('',#6941,#6940); +#6944=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6945=PRESENTATION_STYLE_ASSIGNMENT((#6944)); +#6946=STYLED_ITEM('',(#6945),#6943); +#6948=DIRECTION('',(-8.906056381928E-1,4.547764255314E-1,0.E0)); +#6949=VECTOR('',#6948,1.871389281751E-1); +#6950=CARTESIAN_POINT('',(6.913809975155E-1,-1.181455570795E0,-4.E-2)); +#6951=LINE('',#6950,#6949); +#6953=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6954=PRESENTATION_STYLE_ASSIGNMENT((#6953)); +#6955=STYLED_ITEM('',(#6954),#6952); +#6957=DIRECTION('',(-9.797706494039E-1,2.001236481946E-1,0.E0)); +#6958=VECTOR('',#6957,2.126344727398E-1); +#6959=CARTESIAN_POINT('',(5.247140129574E-1,-1.096349197962E0,-4.E-2)); +#6960=LINE('',#6959,#6958); +#6962=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6963=PRESENTATION_STYLE_ASSIGNMENT((#6962)); +#6964=STYLED_ITEM('',(#6963),#6961); +#6966=DIRECTION('',(-1.E0,0.E0,0.E0)); +#6967=VECTOR('',#6966,3.75E-1); +#6968=CARTESIAN_POINT('',(3.163809975155E-1,-1.053796011545E0,-4.E-2)); +#6969=LINE('',#6968,#6967); +#6971=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6972=PRESENTATION_STYLE_ASSIGNMENT((#6971)); +#6973=STYLED_ITEM('',(#6972),#6970); +#6975=DIRECTION('',(-9.797706494039E-1,-2.001236481946E-1,0.E0)); +#6976=VECTOR('',#6975,2.126344727398E-1); +#6977=CARTESIAN_POINT('',(-5.861900248454E-2,-1.053796011545E0,-4.E-2)); +#6978=LINE('',#6977,#6976); +#6980=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6981=PRESENTATION_STYLE_ASSIGNMENT((#6980)); +#6982=STYLED_ITEM('',(#6981),#6979); +#6984=DIRECTION('',(-8.906056381928E-1,-4.547764255314E-1,0.E0)); +#6985=VECTOR('',#6984,1.871389281751E-1); +#6986=CARTESIAN_POINT('',(-2.669520179264E-1,-1.096349197962E0,-4.E-2)); +#6987=LINE('',#6986,#6985); +#6989=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6990=PRESENTATION_STYLE_ASSIGNMENT((#6989)); +#6991=STYLED_ITEM('',(#6990),#6988); +#6993=DIRECTION('',(-6.996255164452E-1,-7.145097177357E-1,0.E0)); +#6994=VECTOR('',#6993,2.382231360070E-1); +#6995=CARTESIAN_POINT('',(-4.336190024845E-1,-1.181455570795E0,-4.E-2)); +#6996=LINE('',#6995,#6994); +#6998=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#6999=PRESENTATION_STYLE_ASSIGNMENT((#6998)); +#7000=STYLED_ITEM('',(#6999),#6997); +#7002=DIRECTION('',(-4.397121427660E-1,-8.981387596046E-1,0.E0)); +#7003=VECTOR('',#7002,1.895172030449E-1); +#7004=CARTESIAN_POINT('',(-6.002859870426E-1,-1.351668316461E0,-4.E-2)); +#7005=LINE('',#7004,#7003); +#7007=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7008=PRESENTATION_STYLE_ASSIGNMENT((#7007)); +#7009=STYLED_ITEM('',(#7008),#7006); +#7011=DIRECTION('',(-1.921841617981E-1,-9.813588782673E-1,0.E0)); +#7012=VECTOR('',#7011,2.168075879316E-1); +#7013=CARTESIAN_POINT('',(-6.836190024845E-1,-1.521881062128E0,-4.E-2)); +#7014=LINE('',#7013,#7012); +#7016=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7017=PRESENTATION_STYLE_ASSIGNMENT((#7016)); +#7018=STYLED_ITEM('',(#7017),#7015); +#7020=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7021=VECTOR('',#7020,6.382978558540E-1); +#7022=CARTESIAN_POINT('',(-7.252859870426E-1,-1.734647113420E0,-4.E-2)); +#7023=LINE('',#7022,#7021); +#7025=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7026=PRESENTATION_STYLE_ASSIGNMENT((#7025)); +#7027=STYLED_ITEM('',(#7026),#7024); +#7029=DIRECTION('',(1.921842654987E-1,-9.813588579591E-1,0.E0)); +#7030=VECTOR('',#7029,2.168074709445E-1); +#7031=CARTESIAN_POINT('',(-7.252859870426E-1,-2.372944969274E0,-4.E-2)); +#7032=LINE('',#7031,#7030); +#7034=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7035=PRESENTATION_STYLE_ASSIGNMENT((#7034)); +#7036=STYLED_ITEM('',(#7035),#7033); +#7038=DIRECTION('',(4.397120806629E-1,-8.981387900092E-1,0.E0)); +#7039=VECTOR('',#7038,1.895172298115E-1); +#7040=CARTESIAN_POINT('',(-6.836190024845E-1,-2.585710901357E0,-4.E-2)); +#7041=LINE('',#7040,#7039); +#7043=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7044=PRESENTATION_STYLE_ASSIGNMENT((#7043)); +#7045=STYLED_ITEM('',(#7044),#7042); +#7047=DIRECTION('',(6.996254851765E-1,-7.145097483531E-1,0.E0)); +#7048=VECTOR('',#7047,2.382231466541E-1); +#7049=CARTESIAN_POINT('',(-6.002859870426E-1,-2.755923676826E0,-4.E-2)); +#7050=LINE('',#7049,#7048); +#7052=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7053=PRESENTATION_STYLE_ASSIGNMENT((#7052)); +#7054=STYLED_ITEM('',(#7053),#7051); +#7056=DIRECTION('',(8.906056140048E-1,-4.547764728998E-1,0.E0)); +#7057=VECTOR('',#7056,1.871389332576E-1); +#7058=CARTESIAN_POINT('',(-4.336190024845E-1,-2.926136437394E0,-4.E-2)); +#7059=LINE('',#7058,#7057); +#7061=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7062=PRESENTATION_STYLE_ASSIGNMENT((#7061)); +#7063=STYLED_ITEM('',(#7062),#7060); +#7065=DIRECTION('',(9.797706459687E-1,-2.001236650127E-1,0.E0)); +#7066=VECTOR('',#7065,2.126344734853E-1); +#7067=CARTESIAN_POINT('',(-2.669520179264E-1,-3.011242821403E0,-4.E-2)); +#7068=LINE('',#7067,#7066); +#7070=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7071=PRESENTATION_STYLE_ASSIGNMENT((#7070)); +#7072=STYLED_ITEM('',(#7071),#7069); +#7074=DIRECTION('',(1.E0,0.E0,0.E0)); +#7075=VECTOR('',#7074,3.75E-1); +#7076=CARTESIAN_POINT('',(-5.861900248454E-2,-3.053796011545E0,-4.E-2)); +#7077=LINE('',#7076,#7075); +#7079=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7080=PRESENTATION_STYLE_ASSIGNMENT((#7079)); +#7081=STYLED_ITEM('',(#7080),#7078); +#7083=DIRECTION('',(9.797706459687E-1,2.001236650127E-1,0.E0)); +#7084=VECTOR('',#7083,2.126344734853E-1); +#7085=CARTESIAN_POINT('',(3.163809975155E-1,-3.053796011545E0,-4.E-2)); +#7086=LINE('',#7085,#7084); +#7088=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7089=PRESENTATION_STYLE_ASSIGNMENT((#7088)); +#7090=STYLED_ITEM('',(#7089),#7087); +#7092=DIRECTION('',(8.906056140048E-1,4.547764728998E-1,0.E0)); +#7093=VECTOR('',#7092,1.871389332576E-1); +#7094=CARTESIAN_POINT('',(5.247140129574E-1,-3.011242821403E0,-4.E-2)); +#7095=LINE('',#7094,#7093); +#7097=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7098=PRESENTATION_STYLE_ASSIGNMENT((#7097)); +#7099=STYLED_ITEM('',(#7098),#7096); +#7101=DIRECTION('',(6.996254851765E-1,7.145097483531E-1,0.E0)); +#7102=VECTOR('',#7101,2.382231466541E-1); +#7103=CARTESIAN_POINT('',(6.913809975155E-1,-2.926136437394E0,-4.E-2)); +#7104=LINE('',#7103,#7102); +#7106=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7107=PRESENTATION_STYLE_ASSIGNMENT((#7106)); +#7108=STYLED_ITEM('',(#7107),#7105); +#7110=DIRECTION('',(2.377678901991E-1,9.713220013931E-1,0.E0)); +#7111=VECTOR('',#7110,1.752382579873E-1); +#7112=CARTESIAN_POINT('',(8.580479820736E-1,-2.755923676826E0,-4.E-2)); +#7113=LINE('',#7112,#7111); +#7115=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7116=PRESENTATION_STYLE_ASSIGNMENT((#7115)); +#7117=STYLED_ITEM('',(#7116),#7114); +#7120=DIRECTION('',(8.906066921644E-1,4.547743614938E-1,0.E0)); +#7121=VECTOR('',#7120,9.356988876166E-2); +#7122=CARTESIAN_POINT('',(2.524714012957E0,-2.032519418337E0,-4.E-2)); +#7123=LINE('',#7122,#7121); +#7125=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7126=PRESENTATION_STYLE_ASSIGNMENT((#7125)); +#7127=STYLED_ITEM('',(#7126),#7124); +#7129=DIRECTION('',(5.919095487496E-1,8.060043958311E-1,0.E0)); +#7130=VECTOR('',#7129,2.111809148274E-1); +#7131=CARTESIAN_POINT('',(2.608047982074E0,-1.989966231920E0,-4.E-2)); +#7132=LINE('',#7131,#7130); +#7134=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7135=PRESENTATION_STYLE_ASSIGNMENT((#7134)); +#7136=STYLED_ITEM('',(#7135),#7133); +#7138=DIRECTION('',(3.102757862690E-1,9.506465886201E-1,0.E0)); +#7139=VECTOR('',#7138,1.342870849988E-1); +#7140=CARTESIAN_POINT('',(2.733047982074E0,-1.819753486253E0,-4.E-2)); +#7141=LINE('',#7140,#7139); +#7143=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7144=PRESENTATION_STYLE_ASSIGNMENT((#7143)); +#7145=STYLED_ITEM('',(#7144),#7142); +#7147=DIRECTION('',(0.E0,1.E0,0.E0)); +#7148=VECTOR('',#7147,1.702128648758E-1); +#7149=CARTESIAN_POINT('',(2.774714012957E0,-1.692093927004E0,-4.E-2)); +#7150=LINE('',#7149,#7148); +#7152=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7153=PRESENTATION_STYLE_ASSIGNMENT((#7152)); +#7154=STYLED_ITEM('',(#7153),#7151); +#7156=DIRECTION('',(-3.102757862690E-1,9.506465886201E-1,0.E0)); +#7157=VECTOR('',#7156,1.342870849988E-1); +#7158=CARTESIAN_POINT('',(2.774714012957E0,-1.521881062128E0,-4.E-2)); +#7159=LINE('',#7158,#7157); +#7161=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7162=PRESENTATION_STYLE_ASSIGNMENT((#7161)); +#7163=STYLED_ITEM('',(#7162),#7160); +#7165=DIRECTION('',(-5.919095487496E-1,8.060043958311E-1,0.E0)); +#7166=VECTOR('',#7165,2.111809148274E-1); +#7167=CARTESIAN_POINT('',(2.733047982074E0,-1.394221502878E0,-4.E-2)); +#7168=LINE('',#7167,#7166); +#7170=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7171=PRESENTATION_STYLE_ASSIGNMENT((#7170)); +#7172=STYLED_ITEM('',(#7171),#7169); +#7174=DIRECTION('',(-7.938787408812E-1,6.080761011394E-1,0.E0)); +#7175=VECTOR('',#7174,2.099401029093E-1); +#7176=CARTESIAN_POINT('',(2.608047982074E0,-1.224008757211E0,-4.E-2)); +#7177=LINE('',#7176,#7175); +#7179=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7180=PRESENTATION_STYLE_ASSIGNMENT((#7179)); +#7181=STYLED_ITEM('',(#7180),#7178); +#7183=DIRECTION('',(-9.797706494039E-1,2.001236481946E-1,0.E0)); +#7184=VECTOR('',#7183,2.126344727398E-1); +#7185=CARTESIAN_POINT('',(2.441380997515E0,-1.096349197962E0,-4.E-2)); +#7186=LINE('',#7185,#7184); +#7188=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7189=PRESENTATION_STYLE_ASSIGNMENT((#7188)); +#7190=STYLED_ITEM('',(#7189),#7187); +#7192=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7193=VECTOR('',#7192,1.E0); +#7194=CARTESIAN_POINT('',(2.233047982074E0,-1.053796011545E0,-4.E-2)); +#7195=LINE('',#7194,#7193); +#7197=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7198=PRESENTATION_STYLE_ASSIGNMENT((#7197)); +#7199=STYLED_ITEM('',(#7198),#7196); +#7201=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7202=VECTOR('',#7201,2.E0); +#7203=CARTESIAN_POINT('',(1.233047982074E0,-1.053796011545E0,-4.E-2)); +#7204=LINE('',#7203,#7202); +#7206=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7207=PRESENTATION_STYLE_ASSIGNMENT((#7206)); +#7208=STYLED_ITEM('',(#7207),#7205); +#7210=DIRECTION('',(1.E0,0.E0,0.E0)); +#7211=VECTOR('',#7210,1.E0); +#7212=CARTESIAN_POINT('',(1.233047982074E0,-3.053796011545E0,-4.E-2)); +#7213=LINE('',#7212,#7211); +#7215=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7216=PRESENTATION_STYLE_ASSIGNMENT((#7215)); +#7217=STYLED_ITEM('',(#7216),#7214); +#7219=DIRECTION('',(9.797706459687E-1,2.001236650127E-1,0.E0)); +#7220=VECTOR('',#7219,2.126344734853E-1); +#7221=CARTESIAN_POINT('',(2.233047982074E0,-3.053796011545E0,-4.E-2)); +#7222=LINE('',#7221,#7220); +#7224=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7225=PRESENTATION_STYLE_ASSIGNMENT((#7224)); +#7226=STYLED_ITEM('',(#7225),#7223); +#7228=DIRECTION('',(7.938787151833E-1,6.080761346895E-1,0.E0)); +#7229=VECTOR('',#7228,2.099401097051E-1); +#7230=CARTESIAN_POINT('',(2.441380997515E0,-3.011242821403E0,-4.E-2)); +#7231=LINE('',#7230,#7229); +#7233=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7234=PRESENTATION_STYLE_ASSIGNMENT((#7233)); +#7235=STYLED_ITEM('',(#7234),#7232); +#7237=DIRECTION('',(5.919095150862E-1,8.060044205527E-1,0.E0)); +#7238=VECTOR('',#7237,2.111809268378E-1); +#7239=CARTESIAN_POINT('',(2.608047982074E0,-2.883583250977E0,-4.E-2)); +#7240=LINE('',#7239,#7238); +#7242=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7243=PRESENTATION_STYLE_ASSIGNMENT((#7242)); +#7244=STYLED_ITEM('',(#7243),#7241); +#7246=DIRECTION('',(3.102757208080E-1,9.506466099856E-1,0.E0)); +#7247=VECTOR('',#7246,1.342871133303E-1); +#7248=CARTESIAN_POINT('',(2.733047982074E0,-2.713370490410E0,-4.E-2)); +#7249=LINE('',#7248,#7247); +#7251=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7252=PRESENTATION_STYLE_ASSIGNMENT((#7251)); +#7253=STYLED_ITEM('',(#7252),#7250); +#7255=DIRECTION('',(0.E0,1.E0,0.E0)); +#7256=VECTOR('',#7255,2.127659320831E-1); +#7257=CARTESIAN_POINT('',(2.774714012957E0,-2.585710901357E0,-4.E-2)); +#7258=LINE('',#7257,#7256); +#7260=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7261=PRESENTATION_STYLE_ASSIGNMENT((#7260)); +#7262=STYLED_ITEM('',(#7261),#7259); +#7264=DIRECTION('',(-3.102756553470E-1,9.506466313510E-1,0.E0)); +#7265=VECTOR('',#7264,1.342871416618E-1); +#7266=CARTESIAN_POINT('',(2.774714012957E0,-2.372944969274E0,-4.E-2)); +#7267=LINE('',#7266,#7265); +#7269=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7270=PRESENTATION_STYLE_ASSIGNMENT((#7269)); +#7271=STYLED_ITEM('',(#7270),#7268); +#7273=DIRECTION('',(-5.919095487496E-1,8.060043958311E-1,0.E0)); +#7274=VECTOR('',#7273,2.111809148274E-1); +#7275=CARTESIAN_POINT('',(2.733047982074E0,-2.245285350420E0,-4.E-2)); +#7276=LINE('',#7275,#7274); +#7278=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7279=PRESENTATION_STYLE_ASSIGNMENT((#7278)); +#7280=STYLED_ITEM('',(#7279),#7277); +#7282=DIRECTION('',(-8.906066921644E-1,4.547743614938E-1,0.E0)); +#7283=VECTOR('',#7282,9.356988876166E-2); +#7284=CARTESIAN_POINT('',(2.608047982074E0,-2.075072604753E0,-4.E-2)); +#7285=LINE('',#7284,#7283); +#7287=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7288=PRESENTATION_STYLE_ASSIGNMENT((#7287)); +#7289=STYLED_ITEM('',(#7288),#7286); +#7292=DIRECTION('',(1.E0,0.E0,0.E0)); +#7293=VECTOR('',#7292,7.916660308838E-1); +#7294=CARTESIAN_POINT('',(1.483047982074E0,-1.309115130045E0,-4.E-2)); +#7295=LINE('',#7294,#7293); +#7297=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7298=PRESENTATION_STYLE_ASSIGNMENT((#7297)); +#7299=STYLED_ITEM('',(#7298),#7296); +#7301=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#7302=VECTOR('',#7301,1.320445897196E-1); +#7303=CARTESIAN_POINT('',(2.274714012957E0,-1.309115130045E0,-4.E-2)); +#7304=LINE('',#7303,#7302); +#7306=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7307=PRESENTATION_STYLE_ASSIGNMENT((#7306)); +#7308=STYLED_ITEM('',(#7307),#7305); +#7310=DIRECTION('',(6.996275602085E-1,-7.145077165410E-1,0.E0)); +#7311=VECTOR('',#7310,1.191119016114E-1); +#7312=CARTESIAN_POINT('',(2.399714012957E0,-1.351668316461E0,-4.E-2)); +#7313=LINE('',#7312,#7311); +#7315=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7316=PRESENTATION_STYLE_ASSIGNMENT((#7315)); +#7317=STYLED_ITEM('',(#7316),#7314); +#7319=DIRECTION('',(3.102755244251E-1,-9.506466740818E-1,0.E0)); +#7320=VECTOR('',#7319,1.342871983247E-1); +#7321=CARTESIAN_POINT('',(2.483047982074E0,-1.436774689295E0,-4.E-2)); +#7322=LINE('',#7321,#7320); +#7324=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7325=PRESENTATION_STYLE_ASSIGNMENT((#7324)); +#7326=STYLED_ITEM('',(#7325),#7323); +#7328=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7329=VECTOR('',#7328,8.510637283325E-2); +#7330=CARTESIAN_POINT('',(2.524714012957E0,-1.564434367754E0,-4.E-2)); +#7331=LINE('',#7330,#7329); +#7333=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7334=PRESENTATION_STYLE_ASSIGNMENT((#7333)); +#7335=STYLED_ITEM('',(#7334),#7332); +#7337=DIRECTION('',(-3.102757862690E-1,-9.506465886201E-1,0.E0)); +#7338=VECTOR('',#7337,1.342870849988E-1); +#7339=CARTESIAN_POINT('',(2.524714012957E0,-1.649540740587E0,-4.E-2)); +#7340=LINE('',#7339,#7338); +#7342=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7343=PRESENTATION_STYLE_ASSIGNMENT((#7342)); +#7344=STYLED_ITEM('',(#7343),#7341); +#7346=DIRECTION('',(-6.996275602085E-1,-7.145077165410E-1,0.E0)); +#7347=VECTOR('',#7346,1.191119016114E-1); +#7348=CARTESIAN_POINT('',(2.483047982074E0,-1.777200299837E0,-4.E-2)); +#7349=LINE('',#7348,#7347); +#7351=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7352=PRESENTATION_STYLE_ASSIGNMENT((#7351)); +#7353=STYLED_ITEM('',(#7352),#7350); +#7355=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#7356=VECTOR('',#7355,1.320445897196E-1); +#7357=CARTESIAN_POINT('',(2.399714012957E0,-1.862306672670E0,-4.E-2)); +#7358=LINE('',#7357,#7356); +#7360=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7361=PRESENTATION_STYLE_ASSIGNMENT((#7360)); +#7362=STYLED_ITEM('',(#7361),#7359); +#7364=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7365=VECTOR('',#7364,7.916660308838E-1); +#7366=CARTESIAN_POINT('',(2.274714012957E0,-1.904859859087E0,-4.E-2)); +#7367=LINE('',#7366,#7365); +#7369=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7370=PRESENTATION_STYLE_ASSIGNMENT((#7369)); +#7371=STYLED_ITEM('',(#7370),#7368); +#7373=DIRECTION('',(0.E0,1.E0,0.E0)); +#7374=VECTOR('',#7373,5.957447290421E-1); +#7375=CARTESIAN_POINT('',(1.483047982074E0,-1.904859859087E0,-4.E-2)); +#7376=LINE('',#7375,#7374); +#7378=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7379=PRESENTATION_STYLE_ASSIGNMENT((#7378)); +#7380=STYLED_ITEM('',(#7379),#7377); +#7383=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7384=VECTOR('',#7383,1.276595592499E-1); +#7385=CARTESIAN_POINT('',(2.524714012957E0,-2.415498155691E0,-4.E-2)); +#7386=LINE('',#7385,#7384); +#7388=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7389=PRESENTATION_STYLE_ASSIGNMENT((#7388)); +#7390=STYLED_ITEM('',(#7389),#7387); +#7392=DIRECTION('',(-3.102757862690E-1,-9.506465886201E-1,0.E0)); +#7393=VECTOR('',#7392,1.342870849988E-1); +#7394=CARTESIAN_POINT('',(2.524714012957E0,-2.543157714941E0,-4.E-2)); +#7395=LINE('',#7394,#7393); +#7397=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7398=PRESENTATION_STYLE_ASSIGNMENT((#7397)); +#7399=STYLED_ITEM('',(#7398),#7396); +#7401=DIRECTION('',(-6.996274351340E-1,-7.145078390107E-1,0.E0)); +#7402=VECTOR('',#7401,1.191119229054E-1); +#7403=CARTESIAN_POINT('',(2.483047982074E0,-2.670817274191E0,-4.E-2)); +#7404=LINE('',#7403,#7402); +#7406=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7407=PRESENTATION_STYLE_ASSIGNMENT((#7406)); +#7408=STYLED_ITEM('',(#7407),#7405); +#7410=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#7411=VECTOR('',#7410,1.320445897196E-1); +#7412=CARTESIAN_POINT('',(2.399714012957E0,-2.755923676826E0,-4.E-2)); +#7413=LINE('',#7412,#7411); +#7415=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7416=PRESENTATION_STYLE_ASSIGNMENT((#7415)); +#7417=STYLED_ITEM('',(#7416),#7414); +#7419=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7420=VECTOR('',#7419,7.916660308838E-1); +#7421=CARTESIAN_POINT('',(2.274714012957E0,-2.798476863243E0,-4.E-2)); +#7422=LINE('',#7421,#7420); +#7424=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7425=PRESENTATION_STYLE_ASSIGNMENT((#7424)); +#7426=STYLED_ITEM('',(#7425),#7423); +#7428=DIRECTION('',(0.E0,1.E0,0.E0)); +#7429=VECTOR('',#7428,6.382978856564E-1); +#7430=CARTESIAN_POINT('',(1.483047982074E0,-2.798476863243E0,-4.E-2)); +#7431=LINE('',#7430,#7429); +#7433=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7434=PRESENTATION_STYLE_ASSIGNMENT((#7433)); +#7435=STYLED_ITEM('',(#7434),#7432); +#7437=DIRECTION('',(1.E0,0.E0,0.E0)); +#7438=VECTOR('',#7437,7.916660308838E-1); +#7439=CARTESIAN_POINT('',(1.483047982074E0,-2.160178977586E0,-4.E-2)); +#7440=LINE('',#7439,#7438); +#7442=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7443=PRESENTATION_STYLE_ASSIGNMENT((#7442)); +#7444=STYLED_ITEM('',(#7443),#7441); +#7446=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#7447=VECTOR('',#7446,1.320445897196E-1); +#7448=CARTESIAN_POINT('',(2.274714012957E0,-2.160178977586E0,-4.E-2)); +#7449=LINE('',#7448,#7447); +#7451=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7452=PRESENTATION_STYLE_ASSIGNMENT((#7451)); +#7453=STYLED_ITEM('',(#7452),#7450); +#7455=DIRECTION('',(6.996275602085E-1,-7.145077165410E-1,0.E0)); +#7456=VECTOR('',#7455,1.191119016114E-1); +#7457=CARTESIAN_POINT('',(2.399714012957E0,-2.202732164003E0,-4.E-2)); +#7458=LINE('',#7457,#7456); +#7460=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7461=PRESENTATION_STYLE_ASSIGNMENT((#7460)); +#7462=STYLED_ITEM('',(#7461),#7459); +#7464=DIRECTION('',(3.102756553470E-1,-9.506466313510E-1,0.E0)); +#7465=VECTOR('',#7464,1.342871416618E-1); +#7466=CARTESIAN_POINT('',(2.483047982074E0,-2.287838536836E0,-4.E-2)); +#7467=LINE('',#7466,#7465); +#7469=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7470=PRESENTATION_STYLE_ASSIGNMENT((#7469)); +#7471=STYLED_ITEM('',(#7470),#7468); +#7474=DIRECTION('',(1.E0,0.E0,0.E0)); +#7475=VECTOR('',#7474,2.5E-1); +#7476=CARTESIAN_POINT('',(4.524714012957E0,-3.053796011545E0,-4.E-2)); +#7477=LINE('',#7476,#7475); +#7479=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7480=PRESENTATION_STYLE_ASSIGNMENT((#7479)); +#7481=STYLED_ITEM('',(#7480),#7478); +#7483=DIRECTION('',(-5.699143233071E-1,8.217041219864E-1,0.E0)); +#7484=VECTOR('',#7483,1.242876317499E0); +#7485=CARTESIAN_POINT('',(4.774714012957E0,-3.053796011545E0,-4.E-2)); +#7486=LINE('',#7485,#7484); +#7488=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7489=PRESENTATION_STYLE_ASSIGNMENT((#7488)); +#7490=STYLED_ITEM('',(#7489),#7487); +#7492=DIRECTION('',(5.862938322918E-1,8.100984768635E-1,0.E0)); +#7493=VECTOR('',#7492,1.208153619275E0); +#7494=CARTESIAN_POINT('',(4.066380997515E0,-2.032519418337E0,-4.E-2)); +#7495=LINE('',#7494,#7493); +#7497=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7498=PRESENTATION_STYLE_ASSIGNMENT((#7497)); +#7499=STYLED_ITEM('',(#7498),#7496); +#7501=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7502=VECTOR('',#7501,2.5E-1); +#7503=CARTESIAN_POINT('',(4.774714012957E0,-1.053796011545E0,-4.E-2)); +#7504=LINE('',#7503,#7502); +#7506=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7507=PRESENTATION_STYLE_ASSIGNMENT((#7506)); +#7508=STYLED_ITEM('',(#7507),#7505); +#7510=DIRECTION('',(-5.851006721755E-1,-8.109606669992E-1,0.E0)); +#7511=VECTOR('',#7510,9.969788844593E-1); +#7512=CARTESIAN_POINT('',(4.524714012957E0,-1.053796011545E0,-4.E-2)); +#7513=LINE('',#7512,#7511); +#7515=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7516=PRESENTATION_STYLE_ASSIGNMENT((#7515)); +#7517=STYLED_ITEM('',(#7516),#7514); +#7519=DIRECTION('',(-5.851006721755E-1,8.109606669992E-1,0.E0)); +#7520=VECTOR('',#7519,9.969788844593E-1); +#7521=CARTESIAN_POINT('',(3.941380997515E0,-1.862306672670E0,-4.E-2)); +#7522=LINE('',#7521,#7520); +#7524=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7525=PRESENTATION_STYLE_ASSIGNMENT((#7524)); +#7526=STYLED_ITEM('',(#7525),#7523); +#7528=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7529=VECTOR('',#7528,2.5E-1); +#7530=CARTESIAN_POINT('',(3.358047982074E0,-1.053796011545E0,-4.E-2)); +#7531=LINE('',#7530,#7529); +#7533=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7534=PRESENTATION_STYLE_ASSIGNMENT((#7533)); +#7535=STYLED_ITEM('',(#7534),#7532); +#7537=DIRECTION('',(5.862938322918E-1,-8.100984768635E-1,0.E0)); +#7538=VECTOR('',#7537,1.208153619275E0); +#7539=CARTESIAN_POINT('',(3.108047982074E0,-1.053796011545E0,-4.E-2)); +#7540=LINE('',#7539,#7538); +#7542=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7543=PRESENTATION_STYLE_ASSIGNMENT((#7542)); +#7544=STYLED_ITEM('',(#7543),#7541); +#7546=DIRECTION('',(-5.699143233071E-1,-8.217041219864E-1,0.E0)); +#7547=VECTOR('',#7546,1.242876317499E0); +#7548=CARTESIAN_POINT('',(3.816380997515E0,-2.032519418337E0,-4.E-2)); +#7549=LINE('',#7548,#7547); +#7551=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7552=PRESENTATION_STYLE_ASSIGNMENT((#7551)); +#7553=STYLED_ITEM('',(#7552),#7550); +#7555=DIRECTION('',(1.E0,0.E0,0.E0)); +#7556=VECTOR('',#7555,2.5E-1); +#7557=CARTESIAN_POINT('',(3.108047982074E0,-3.053796011545E0,-4.E-2)); +#7558=LINE('',#7557,#7556); +#7560=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7561=PRESENTATION_STYLE_ASSIGNMENT((#7560)); +#7562=STYLED_ITEM('',(#7561),#7559); +#7564=DIRECTION('',(5.851006721755E-1,8.109606669992E-1,0.E0)); +#7565=VECTOR('',#7564,9.969788844593E-1); +#7566=CARTESIAN_POINT('',(3.358047982074E0,-3.053796011545E0,-4.E-2)); +#7567=LINE('',#7566,#7565); +#7569=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7570=PRESENTATION_STYLE_ASSIGNMENT((#7569)); +#7571=STYLED_ITEM('',(#7570),#7568); +#7573=DIRECTION('',(5.851006721755E-1,-8.109606669992E-1,0.E0)); +#7574=VECTOR('',#7573,9.969788844593E-1); +#7575=CARTESIAN_POINT('',(3.941380997515E0,-2.245285350420E0,-4.E-2)); +#7576=LINE('',#7575,#7574); +#7578=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7579=PRESENTATION_STYLE_ASSIGNMENT((#7578)); +#7580=STYLED_ITEM('',(#7579),#7577); +#7583=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7584=VECTOR('',#7583,2.127659618855E-1); +#7585=CARTESIAN_POINT('',(5.108047982074E0,-2.841030049659E0,-4.E-2)); +#7586=LINE('',#7585,#7584); +#7588=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7589=PRESENTATION_STYLE_ASSIGNMENT((#7588)); +#7590=STYLED_ITEM('',(#7589),#7587); +#7592=DIRECTION('',(1.E0,0.E0,0.E0)); +#7593=VECTOR('',#7592,1.499999046326E0); +#7594=CARTESIAN_POINT('',(5.108047982074E0,-3.053796011545E0,-4.E-2)); +#7595=LINE('',#7594,#7593); +#7597=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7598=PRESENTATION_STYLE_ASSIGNMENT((#7597)); +#7599=STYLED_ITEM('',(#7598),#7596); +#7601=DIRECTION('',(0.E0,1.E0,0.E0)); +#7602=VECTOR('',#7601,2.127659618855E-1); +#7603=CARTESIAN_POINT('',(6.608047028399E0,-3.053796011545E0,-4.E-2)); +#7604=LINE('',#7603,#7602); +#7606=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7607=PRESENTATION_STYLE_ASSIGNMENT((#7606)); +#7608=STYLED_ITEM('',(#7607),#7605); +#7610=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7611=VECTOR('',#7610,1.166666030884E0); +#7612=CARTESIAN_POINT('',(6.608047028399E0,-2.841030049659E0,-4.E-2)); +#7613=LINE('',#7612,#7611); +#7615=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7616=PRESENTATION_STYLE_ASSIGNMENT((#7615)); +#7617=STYLED_ITEM('',(#7616),#7614); +#7619=DIRECTION('',(7.437658875915E-1,6.684402026025E-1,0.E0)); +#7620=VECTOR('',#7619,1.400529451891E0); +#7621=CARTESIAN_POINT('',(5.441380997515E0,-2.841030049659E0,-4.E-2)); +#7622=LINE('',#7621,#7620); +#7624=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7625=PRESENTATION_STYLE_ASSIGNMENT((#7624)); +#7626=STYLED_ITEM('',(#7625),#7623); +#7628=DIRECTION('',(5.466254709167E-1,8.373772116227E-1,0.E0)); +#7629=VECTOR('',#7628,1.524516758732E-1); +#7630=CARTESIAN_POINT('',(6.483047028399E0,-1.904859859087E0,-4.E-2)); +#7631=LINE('',#7630,#7629); +#7633=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7634=PRESENTATION_STYLE_ASSIGNMENT((#7633)); +#7635=STYLED_ITEM('',(#7634),#7632); +#7637=DIRECTION('',(2.377679294760E-1,9.713219917786E-1,0.E0)); +#7638=VECTOR('',#7637,1.752382290396E-1); +#7639=CARTESIAN_POINT('',(6.566380997515E0,-1.777200299837E0,-4.E-2)); +#7640=LINE('',#7639,#7638); +#7642=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7643=PRESENTATION_STYLE_ASSIGNMENT((#7642)); +#7644=STYLED_ITEM('',(#7643),#7641); +#7646=DIRECTION('',(0.E0,1.E0,0.E0)); +#7647=VECTOR('',#7646,8.510649204254E-2); +#7648=CARTESIAN_POINT('',(6.608047028399E0,-1.606987554170E0,-4.E-2)); +#7649=LINE('',#7648,#7647); +#7651=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7652=PRESENTATION_STYLE_ASSIGNMENT((#7651)); +#7653=STYLED_ITEM('',(#7652),#7650); +#7655=DIRECTION('',(-2.377679294760E-1,9.713219917786E-1,0.E0)); +#7656=VECTOR('',#7655,1.752382290396E-1); +#7657=CARTESIAN_POINT('',(6.608047028399E0,-1.521881062128E0,-4.E-2)); +#7658=LINE('',#7657,#7656); +#7660=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7661=PRESENTATION_STYLE_ASSIGNMENT((#7660)); +#7662=STYLED_ITEM('',(#7661),#7659); +#7664=DIRECTION('',(-6.996234726647E-1,7.145117189358E-1,0.E0)); +#7665=VECTOR('',#7664,2.382224687931E-1); +#7666=CARTESIAN_POINT('',(6.566380997515E0,-1.351668316461E0,-4.E-2)); +#7667=LINE('',#7666,#7665); +#7669=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7670=PRESENTATION_STYLE_ASSIGNMENT((#7669)); +#7671=STYLED_ITEM('',(#7670),#7668); +#7673=DIRECTION('',(-8.906066921644E-1,4.547743614938E-1,0.E0)); +#7674=VECTOR('',#7673,1.871397775233E-1); +#7675=CARTESIAN_POINT('',(6.399714966632E0,-1.181455570795E0,-4.E-2)); +#7676=LINE('',#7675,#7674); +#7678=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7679=PRESENTATION_STYLE_ASSIGNMENT((#7678)); +#7680=STYLED_ITEM('',(#7679),#7677); +#7682=DIRECTION('',(-9.858211730931E-1,1.677993286083E-1,0.E0)); +#7683=VECTOR('',#7682,2.535956893841E-1); +#7684=CARTESIAN_POINT('',(6.233047028399E0,-1.096349197962E0,-4.E-2)); +#7685=LINE('',#7684,#7683); +#7687=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7688=PRESENTATION_STYLE_ASSIGNMENT((#7687)); +#7689=STYLED_ITEM('',(#7688),#7686); +#7691=DIRECTION('',(-1.E0,0.E0,0.E0)); +#7692=VECTOR('',#7691,1.666660308838E-1); +#7693=CARTESIAN_POINT('',(5.983047028399E0,-1.053796011545E0,-4.E-2)); +#7694=LINE('',#7693,#7692); +#7696=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7697=PRESENTATION_STYLE_ASSIGNMENT((#7696)); +#7698=STYLED_ITEM('',(#7697),#7695); +#7700=DIRECTION('',(-9.895240564979E-1,-1.443680768452E-1,0.E0)); +#7701=VECTOR('',#7700,2.947548193930E-1); +#7702=CARTESIAN_POINT('',(5.816380997515E0,-1.053796011545E0,-4.E-2)); +#7703=LINE('',#7702,#7701); +#7705=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7706=PRESENTATION_STYLE_ASSIGNMENT((#7705)); +#7707=STYLED_ITEM('',(#7706),#7704); +#7709=DIRECTION('',(-8.906045842070E-1,-4.547784895854E-1,0.E0)); +#7710=VECTOR('',#7709,1.871380788279E-1); +#7711=CARTESIAN_POINT('',(5.524714012957E0,-1.096349197962E0,-4.E-2)); +#7712=LINE('',#7711,#7710); +#7714=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7715=PRESENTATION_STYLE_ASSIGNMENT((#7714)); +#7716=STYLED_ITEM('',(#7715),#7713); +#7718=DIRECTION('',(-6.996255164452E-1,-7.145097177357E-1,0.E0)); +#7719=VECTOR('',#7718,2.382231360070E-1); +#7720=CARTESIAN_POINT('',(5.358047982074E0,-1.181455570795E0,-4.E-2)); +#7721=LINE('',#7720,#7719); +#7723=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7724=PRESENTATION_STYLE_ASSIGNMENT((#7723)); +#7725=STYLED_ITEM('',(#7724),#7722); +#7727=DIRECTION('',(-2.377730639603E-1,-9.713207349042E-1,0.E0)); +#7728=VECTOR('',#7727,1.752384557952E-1); +#7729=CARTESIAN_POINT('',(5.191380997515E0,-1.351668316461E0,-4.E-2)); +#7730=LINE('',#7729,#7728); +#7732=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7733=PRESENTATION_STYLE_ASSIGNMENT((#7732)); +#7734=STYLED_ITEM('',(#7733),#7731); +#7736=DIRECTION('',(1.E0,0.E0,0.E0)); +#7737=VECTOR('',#7736,2.083339691162E-1); +#7738=CARTESIAN_POINT('',(5.149714012957E0,-1.521881062128E0,-4.E-2)); +#7739=LINE('',#7738,#7737); +#7741=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7742=PRESENTATION_STYLE_ASSIGNMENT((#7741)); +#7743=STYLED_ITEM('',(#7742),#7740); +#7745=DIRECTION('',(5.466210844748E-1,8.373800750004E-1,0.E0)); +#7746=VECTOR('',#7745,1.524511545726E-1); +#7747=CARTESIAN_POINT('',(5.358047982074E0,-1.521881062128E0,-4.E-2)); +#7748=LINE('',#7747,#7746); +#7750=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7751=PRESENTATION_STYLE_ASSIGNMENT((#7750)); +#7752=STYLED_ITEM('',(#7751),#7749); +#7754=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#7755=VECTOR('',#7754,1.512220046714E-1); +#7756=CARTESIAN_POINT('',(5.441380997515E0,-1.394221502878E0,-4.E-2)); +#7757=LINE('',#7756,#7755); +#7759=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7760=PRESENTATION_STYLE_ASSIGNMENT((#7759)); +#7761=STYLED_ITEM('',(#7760),#7758); +#7763=DIRECTION('',(9.797708290262E-1,2.001227687928E-1,0.E0)); +#7764=VECTOR('',#7763,2.126354071220E-1); +#7765=CARTESIAN_POINT('',(5.566380997515E0,-1.309115130045E0,-4.E-2)); +#7766=LINE('',#7765,#7764); +#7768=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7769=PRESENTATION_STYLE_ASSIGNMENT((#7768)); +#7770=STYLED_ITEM('',(#7769),#7767); +#7772=DIRECTION('',(1.E0,0.E0,0.E0)); +#7773=VECTOR('',#7772,1.666660308838E-1); +#7774=CARTESIAN_POINT('',(5.774714966632E0,-1.266561943628E0,-4.E-2)); +#7775=LINE('',#7774,#7773); +#7777=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7778=PRESENTATION_STYLE_ASSIGNMENT((#7777)); +#7779=STYLED_ITEM('',(#7778),#7776); +#7781=DIRECTION('',(9.797708290262E-1,-2.001227687928E-1,0.E0)); +#7782=VECTOR('',#7781,2.126354071220E-1); +#7783=CARTESIAN_POINT('',(5.941380997515E0,-1.266561943628E0,-4.E-2)); +#7784=LINE('',#7783,#7782); +#7786=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7787=PRESENTATION_STYLE_ASSIGNMENT((#7786)); +#7788=STYLED_ITEM('',(#7787),#7785); +#7790=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#7791=VECTOR('',#7790,1.512220046714E-1); +#7792=CARTESIAN_POINT('',(6.149714966632E0,-1.309115130045E0,-4.E-2)); +#7793=LINE('',#7792,#7791); +#7795=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7796=PRESENTATION_STYLE_ASSIGNMENT((#7795)); +#7797=STYLED_ITEM('',(#7796),#7794); +#7799=DIRECTION('',(5.466166979878E-1,-8.373829383746E-1,0.E0)); +#7800=VECTOR('',#7799,1.524506332762E-1); +#7801=CARTESIAN_POINT('',(6.274714966632E0,-1.394221502878E0,-4.E-2)); +#7802=LINE('',#7801,#7800); +#7804=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7805=PRESENTATION_STYLE_ASSIGNMENT((#7804)); +#7806=STYLED_ITEM('',(#7805),#7803); +#7808=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7809=VECTOR('',#7808,8.510649204254E-2); +#7810=CARTESIAN_POINT('',(6.358047028399E0,-1.521881062128E0,-4.E-2)); +#7811=LINE('',#7810,#7809); +#7813=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7814=PRESENTATION_STYLE_ASSIGNMENT((#7813)); +#7815=STYLED_ITEM('',(#7814),#7812); +#7817=DIRECTION('',(-4.397080835723E-1,-8.981407468995E-1,0.E0)); +#7818=VECTOR('',#7817,1.895167837047E-1); +#7819=CARTESIAN_POINT('',(6.358047028399E0,-1.606987554170E0,-4.E-2)); +#7820=LINE('',#7819,#7818); +#7822=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7823=PRESENTATION_STYLE_ASSIGNMENT((#7822)); +#7824=STYLED_ITEM('',(#7823),#7821); +#7826=DIRECTION('',(-7.389230577351E-1,-6.737898149627E-1,0.E0)); +#7827=VECTOR('',#7826,1.578874785873E0); +#7828=CARTESIAN_POINT('',(6.274714966632E0,-1.777200299837E0,-4.E-2)); +#7829=LINE('',#7828,#7827); +#7831=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7832=PRESENTATION_STYLE_ASSIGNMENT((#7831)); +#7833=STYLED_ITEM('',(#7832),#7830); +#7836=DIRECTION('',(-8.906066921644E-1,-4.547743614938E-1,0.E0)); +#7837=VECTOR('',#7836,9.356988876166E-2); +#7838=CARTESIAN_POINT('',(7.274714966632E0,-2.032519418337E0,-4.E-2)); +#7839=LINE('',#7838,#7837); +#7841=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7842=PRESENTATION_STYLE_ASSIGNMENT((#7841)); +#7843=STYLED_ITEM('',(#7842),#7840); +#7845=DIRECTION('',(-7.938770612153E-1,-6.080782940346E-1,0.E0)); +#7846=VECTOR('',#7845,2.099393458083E-1); +#7847=CARTESIAN_POINT('',(7.191380997515E0,-2.075072604753E0,-4.E-2)); +#7848=LINE('',#7847,#7846); +#7850=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7851=PRESENTATION_STYLE_ASSIGNMENT((#7850)); +#7852=STYLED_ITEM('',(#7851),#7849); +#7854=DIRECTION('',(-3.646942596495E-1,-9.311273258683E-1,0.E0)); +#7855=VECTOR('',#7854,2.285036490465E-1); +#7856=CARTESIAN_POINT('',(7.024714966632E0,-2.202732164003E0,-4.E-2)); +#7857=LINE('',#7856,#7855); +#7859=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7860=PRESENTATION_STYLE_ASSIGNMENT((#7859)); +#7861=STYLED_ITEM('',(#7860),#7858); +#7863=DIRECTION('',(0.E0,-1.E0,0.E0)); +#7864=VECTOR('',#7863,1.276595592499E-1); +#7865=CARTESIAN_POINT('',(6.941380997515E0,-2.415498155691E0,-4.E-2)); +#7866=LINE('',#7865,#7864); +#7868=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7869=PRESENTATION_STYLE_ASSIGNMENT((#7868)); +#7870=STYLED_ITEM('',(#7869),#7867); +#7872=DIRECTION('',(3.646943039384E-1,-9.311273085217E-1,0.E0)); +#7873=VECTOR('',#7872,2.285036212967E-1); +#7874=CARTESIAN_POINT('',(6.941380997515E0,-2.543157714941E0,-4.E-2)); +#7875=LINE('',#7874,#7873); +#7877=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7878=PRESENTATION_STYLE_ASSIGNMENT((#7877)); +#7879=STYLED_ITEM('',(#7878),#7876); +#7881=DIRECTION('',(6.996247934953E-1,-7.145104256249E-1,0.E0)); +#7882=VECTOR('',#7881,1.786671958487E-1); +#7883=CARTESIAN_POINT('',(7.024714966632E0,-2.755923676826E0,-4.E-2)); +#7884=LINE('',#7883,#7882); +#7886=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7887=PRESENTATION_STYLE_ASSIGNMENT((#7886)); +#7888=STYLED_ITEM('',(#7887),#7885); +#7890=DIRECTION('',(8.526519815748E-1,-5.224792802749E-1,0.E0)); +#7891=VECTOR('',#7890,2.443342257679E-1); +#7892=CARTESIAN_POINT('',(7.149714966632E0,-2.883583250977E0,-4.E-2)); +#7893=LINE('',#7892,#7891); +#7895=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7896=PRESENTATION_STYLE_ASSIGNMENT((#7895)); +#7897=STYLED_ITEM('',(#7896),#7894); +#7899=DIRECTION('',(9.797708255911E-1,-2.001227856107E-1,0.E0)); +#7900=VECTOR('',#7899,2.126354078675E-1); +#7901=CARTESIAN_POINT('',(7.358047028399E0,-3.011242821403E0,-4.E-2)); +#7902=LINE('',#7901,#7900); +#7904=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7905=PRESENTATION_STYLE_ASSIGNMENT((#7904)); +#7906=STYLED_ITEM('',(#7905),#7903); +#7908=DIRECTION('',(1.E0,0.E0,0.E0)); +#7909=VECTOR('',#7908,2.5E-1); +#7910=CARTESIAN_POINT('',(7.566380997515E0,-3.053796011545E0,-4.E-2)); +#7911=LINE('',#7910,#7909); +#7913=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7914=PRESENTATION_STYLE_ASSIGNMENT((#7913)); +#7915=STYLED_ITEM('',(#7914),#7912); +#7917=DIRECTION('',(9.797708255911E-1,2.001227856107E-1,0.E0)); +#7918=VECTOR('',#7917,2.126354078675E-1); +#7919=CARTESIAN_POINT('',(7.816380997515E0,-3.053796011545E0,-4.E-2)); +#7920=LINE('',#7919,#7918); +#7922=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7923=PRESENTATION_STYLE_ASSIGNMENT((#7922)); +#7924=STYLED_ITEM('',(#7923),#7921); +#7926=DIRECTION('',(8.526519815748E-1,5.224792802749E-1,0.E0)); +#7927=VECTOR('',#7926,2.443342257679E-1); +#7928=CARTESIAN_POINT('',(8.024714966632E0,-3.011242821403E0,-4.E-2)); +#7929=LINE('',#7928,#7927); +#7931=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7932=PRESENTATION_STYLE_ASSIGNMENT((#7931)); +#7933=STYLED_ITEM('',(#7932),#7930); +#7935=DIRECTION('',(6.996247934953E-1,7.145104256249E-1,0.E0)); +#7936=VECTOR('',#7935,1.786671958487E-1); +#7937=CARTESIAN_POINT('',(8.233047028399E0,-2.883583250977E0,-4.E-2)); +#7938=LINE('',#7937,#7936); +#7940=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7941=PRESENTATION_STYLE_ASSIGNMENT((#7940)); +#7942=STYLED_ITEM('',(#7941),#7939); +#7944=DIRECTION('',(3.646943039384E-1,9.311273085217E-1,0.E0)); +#7945=VECTOR('',#7944,2.285036212967E-1); +#7946=CARTESIAN_POINT('',(8.358047028399E0,-2.755923676826E0,-4.E-2)); +#7947=LINE('',#7946,#7945); +#7949=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7950=PRESENTATION_STYLE_ASSIGNMENT((#7949)); +#7951=STYLED_ITEM('',(#7950),#7948); +#7953=DIRECTION('',(0.E0,1.E0,0.E0)); +#7954=VECTOR('',#7953,1.276595592499E-1); +#7955=CARTESIAN_POINT('',(8.441380997515E0,-2.543157714941E0,-4.E-2)); +#7956=LINE('',#7955,#7954); +#7958=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7959=PRESENTATION_STYLE_ASSIGNMENT((#7958)); +#7960=STYLED_ITEM('',(#7959),#7957); +#7962=DIRECTION('',(-3.646942596495E-1,9.311273258683E-1,0.E0)); +#7963=VECTOR('',#7962,2.285036490465E-1); +#7964=CARTESIAN_POINT('',(8.441380997515E0,-2.415498155691E0,-4.E-2)); +#7965=LINE('',#7964,#7963); +#7967=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7968=PRESENTATION_STYLE_ASSIGNMENT((#7967)); +#7969=STYLED_ITEM('',(#7968),#7966); +#7971=DIRECTION('',(-7.938770612153E-1,6.080782940346E-1,0.E0)); +#7972=VECTOR('',#7971,2.099393458083E-1); +#7973=CARTESIAN_POINT('',(8.358047028399E0,-2.202732164003E0,-4.E-2)); +#7974=LINE('',#7973,#7972); +#7976=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7977=PRESENTATION_STYLE_ASSIGNMENT((#7976)); +#7978=STYLED_ITEM('',(#7977),#7975); +#7980=DIRECTION('',(-8.906066921644E-1,4.547743614938E-1,0.E0)); +#7981=VECTOR('',#7980,9.356988876166E-2); +#7982=CARTESIAN_POINT('',(8.191380997515E0,-2.075072604753E0,-4.E-2)); +#7983=LINE('',#7982,#7981); +#7985=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7986=PRESENTATION_STYLE_ASSIGNMENT((#7985)); +#7987=STYLED_ITEM('',(#7986),#7984); +#7989=DIRECTION('',(8.906066921644E-1,4.547743614938E-1,0.E0)); +#7990=VECTOR('',#7989,9.356988876166E-2); +#7991=CARTESIAN_POINT('',(8.108047028399E0,-2.032519418337E0,-4.E-2)); +#7992=LINE('',#7991,#7990); +#7994=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#7995=PRESENTATION_STYLE_ASSIGNMENT((#7994)); +#7996=STYLED_ITEM('',(#7995),#7993); +#7998=DIRECTION('',(6.996248351869E-1,7.145103848018E-1,0.E0)); +#7999=VECTOR('',#7998,1.786671852016E-1); +#8000=CARTESIAN_POINT('',(8.191380997515E0,-1.989966231920E0,-4.E-2)); +#8001=LINE('',#8000,#7999); +#8003=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8004=PRESENTATION_STYLE_ASSIGNMENT((#8003)); +#8005=STYLED_ITEM('',(#8004),#8002); +#8007=DIRECTION('',(4.397162019326E-1,8.981367723003E-1,0.E0)); +#8008=VECTOR('',#8007,1.895176223890E-1); +#8009=CARTESIAN_POINT('',(8.316380997515E0,-1.862306672670E0,-4.E-2)); +#8010=LINE('',#8009,#8008); +#8012=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8013=PRESENTATION_STYLE_ASSIGNMENT((#8012)); +#8014=STYLED_ITEM('',(#8013),#8011); +#8016=DIRECTION('',(0.E0,1.E0,0.E0)); +#8017=VECTOR('',#8016,1.276595592499E-1); +#8018=CARTESIAN_POINT('',(8.399714966632E0,-1.692093927004E0,-4.E-2)); +#8019=LINE('',#8018,#8017); +#8021=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8022=PRESENTATION_STYLE_ASSIGNMENT((#8021)); +#8023=STYLED_ITEM('',(#8022),#8020); +#8025=DIRECTION('',(-3.646941710717E-1,9.311273605615E-1,0.E0)); +#8026=VECTOR('',#8025,2.285037045460E-1); +#8027=CARTESIAN_POINT('',(8.399714966632E0,-1.564434367754E0,-4.E-2)); +#8028=LINE('',#8027,#8026); +#8030=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8031=PRESENTATION_STYLE_ASSIGNMENT((#8030)); +#8032=STYLED_ITEM('',(#8031),#8029); +#8034=DIRECTION('',(-6.996248351869E-1,7.145103848018E-1,0.E0)); +#8035=VECTOR('',#8034,1.786671852016E-1); +#8036=CARTESIAN_POINT('',(8.316380997515E0,-1.351668316461E0,-4.E-2)); +#8037=LINE('',#8036,#8035); +#8039=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8040=PRESENTATION_STYLE_ASSIGNMENT((#8039)); +#8041=STYLED_ITEM('',(#8040),#8038); +#8043=DIRECTION('',(-8.526541329325E-1,5.224757693837E-1,0.E0)); +#8044=VECTOR('',#8043,2.443358462354E-1); +#8045=CARTESIAN_POINT('',(8.191380997515E0,-1.224008757211E0,-4.E-2)); +#8046=LINE('',#8045,#8044); +#8048=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8049=PRESENTATION_STYLE_ASSIGNMENT((#8048)); +#8050=STYLED_ITEM('',(#8049),#8047); +#8052=DIRECTION('',(-9.797704697791E-1,2.001245276041E-1,0.E0)); +#8053=VECTOR('',#8052,2.126335383578E-1); +#8054=CARTESIAN_POINT('',(7.983047028399E0,-1.096349197962E0,-4.E-2)); +#8055=LINE('',#8054,#8053); +#8057=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8058=PRESENTATION_STYLE_ASSIGNMENT((#8057)); +#8059=STYLED_ITEM('',(#8058),#8056); +#8061=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8062=VECTOR('',#8061,1.666679382324E-1); +#8063=CARTESIAN_POINT('',(7.774714966632E0,-1.053796011545E0,-4.E-2)); +#8064=LINE('',#8063,#8062); +#8066=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8067=PRESENTATION_STYLE_ASSIGNMENT((#8066)); +#8068=STYLED_ITEM('',(#8067),#8065); +#8070=DIRECTION('',(-9.797704697791E-1,-2.001245276041E-1,0.E0)); +#8071=VECTOR('',#8070,2.126335383578E-1); +#8072=CARTESIAN_POINT('',(7.608047028399E0,-1.053796011545E0,-4.E-2)); +#8073=LINE('',#8072,#8071); +#8075=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8076=PRESENTATION_STYLE_ASSIGNMENT((#8075)); +#8077=STYLED_ITEM('',(#8076),#8074); +#8079=DIRECTION('',(-8.526541329325E-1,-5.224757693837E-1,0.E0)); +#8080=VECTOR('',#8079,2.443358462354E-1); +#8081=CARTESIAN_POINT('',(7.399714966632E0,-1.096349197962E0,-4.E-2)); +#8082=LINE('',#8081,#8080); +#8084=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8085=PRESENTATION_STYLE_ASSIGNMENT((#8084)); +#8086=STYLED_ITEM('',(#8085),#8083); +#8088=DIRECTION('',(-6.996248351869E-1,-7.145103848018E-1,0.E0)); +#8089=VECTOR('',#8088,1.786671852016E-1); +#8090=CARTESIAN_POINT('',(7.191380997515E0,-1.224008757211E0,-4.E-2)); +#8091=LINE('',#8090,#8089); +#8093=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8094=PRESENTATION_STYLE_ASSIGNMENT((#8093)); +#8095=STYLED_ITEM('',(#8094),#8092); +#8097=DIRECTION('',(-3.646941710717E-1,-9.311273605615E-1,0.E0)); +#8098=VECTOR('',#8097,2.285037045460E-1); +#8099=CARTESIAN_POINT('',(7.066380997515E0,-1.351668316461E0,-4.E-2)); +#8100=LINE('',#8099,#8098); +#8102=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8103=PRESENTATION_STYLE_ASSIGNMENT((#8102)); +#8104=STYLED_ITEM('',(#8103),#8101); +#8106=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8107=VECTOR('',#8106,1.276595592499E-1); +#8108=CARTESIAN_POINT('',(6.983047028399E0,-1.564434367754E0,-4.E-2)); +#8109=LINE('',#8108,#8107); +#8111=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8112=PRESENTATION_STYLE_ASSIGNMENT((#8111)); +#8113=STYLED_ITEM('',(#8112),#8110); +#8115=DIRECTION('',(4.397162019326E-1,-8.981367723003E-1,0.E0)); +#8116=VECTOR('',#8115,1.895176223890E-1); +#8117=CARTESIAN_POINT('',(6.983047028399E0,-1.692093927004E0,-4.E-2)); +#8118=LINE('',#8117,#8116); +#8120=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8121=PRESENTATION_STYLE_ASSIGNMENT((#8120)); +#8122=STYLED_ITEM('',(#8121),#8119); +#8124=DIRECTION('',(6.996248351869E-1,-7.145103848018E-1,0.E0)); +#8125=VECTOR('',#8124,1.786671852016E-1); +#8126=CARTESIAN_POINT('',(7.066380997515E0,-1.862306672670E0,-4.E-2)); +#8127=LINE('',#8126,#8125); +#8129=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8130=PRESENTATION_STYLE_ASSIGNMENT((#8129)); +#8131=STYLED_ITEM('',(#8130),#8128); +#8133=DIRECTION('',(8.906066921644E-1,-4.547743614938E-1,0.E0)); +#8134=VECTOR('',#8133,9.356988876166E-2); +#8135=CARTESIAN_POINT('',(7.191380997515E0,-1.989966231920E0,-4.E-2)); +#8136=LINE('',#8135,#8134); +#8138=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8139=PRESENTATION_STYLE_ASSIGNMENT((#8138)); +#8140=STYLED_ITEM('',(#8139),#8137); +#8143=DIRECTION('',(-9.689174914946E-1,2.473841035229E-1,0.E0)); +#8144=VECTOR('',#8143,1.720126144350E-1); +#8145=CARTESIAN_POINT('',(7.608047028399E0,-2.841030049659E0,-4.E-2)); +#8146=LINE('',#8145,#8144); +#8148=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8149=PRESENTATION_STYLE_ASSIGNMENT((#8148)); +#8150=STYLED_ITEM('',(#8149),#8147); +#8152=DIRECTION('',(-8.906045842070E-1,4.547784895854E-1,0.E0)); +#8153=VECTOR('',#8152,1.871380788279E-1); +#8154=CARTESIAN_POINT('',(7.441380997515E0,-2.798476863243E0,-4.E-2)); +#8155=LINE('',#8154,#8153); +#8157=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8158=PRESENTATION_STYLE_ASSIGNMENT((#8157)); +#8159=STYLED_ITEM('',(#8158),#8156); +#8161=DIRECTION('',(-5.919094814228E-1,8.060044452742E-1,0.E0)); +#8162=VECTOR('',#8161,2.111809388482E-1); +#8163=CARTESIAN_POINT('',(7.274714966632E0,-2.713370490410E0,-4.E-2)); +#8164=LINE('',#8163,#8162); +#8166=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8167=PRESENTATION_STYLE_ASSIGNMENT((#8166)); +#8168=STYLED_ITEM('',(#8167),#8165); +#8170=DIRECTION('',(0.E0,1.E0,0.E0)); +#8171=VECTOR('',#8170,1.276595592499E-1); +#8172=CARTESIAN_POINT('',(7.149714966632E0,-2.543157714941E0,-4.E-2)); +#8173=LINE('',#8172,#8171); +#8175=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8176=PRESENTATION_STYLE_ASSIGNMENT((#8175)); +#8177=STYLED_ITEM('',(#8176),#8174); +#8179=DIRECTION('',(5.919094140959E-1,8.060044947174E-1,0.E0)); +#8180=VECTOR('',#8179,2.111809628690E-1); +#8181=CARTESIAN_POINT('',(7.149714966632E0,-2.415498155691E0,-4.E-2)); +#8182=LINE('',#8181,#8180); +#8184=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8185=PRESENTATION_STYLE_ASSIGNMENT((#8184)); +#8186=STYLED_ITEM('',(#8185),#8183); +#8188=DIRECTION('',(8.906045842070E-1,4.547784895854E-1,0.E0)); +#8189=VECTOR('',#8188,1.871380788279E-1); +#8190=CARTESIAN_POINT('',(7.274714966632E0,-2.245285350420E0,-4.E-2)); +#8191=LINE('',#8190,#8189); +#8193=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8194=PRESENTATION_STYLE_ASSIGNMENT((#8193)); +#8195=STYLED_ITEM('',(#8194),#8192); +#8197=DIRECTION('',(9.689174914946E-1,2.473841035229E-1,0.E0)); +#8198=VECTOR('',#8197,1.720126144350E-1); +#8199=CARTESIAN_POINT('',(7.441380997515E0,-2.160178977586E0,-4.E-2)); +#8200=LINE('',#8199,#8198); +#8202=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8203=PRESENTATION_STYLE_ASSIGNMENT((#8202)); +#8204=STYLED_ITEM('',(#8203),#8201); +#8206=DIRECTION('',(1.E0,0.E0,0.E0)); +#8207=VECTOR('',#8206,1.666679382324E-1); +#8208=CARTESIAN_POINT('',(7.608047028399E0,-2.117625791170E0,-4.E-2)); +#8209=LINE('',#8208,#8207); +#8211=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8212=PRESENTATION_STYLE_ASSIGNMENT((#8211)); +#8213=STYLED_ITEM('',(#8212),#8210); +#8215=DIRECTION('',(9.689174914946E-1,-2.473841035229E-1,0.E0)); +#8216=VECTOR('',#8215,1.720126144350E-1); +#8217=CARTESIAN_POINT('',(7.774714966632E0,-2.117625791170E0,-4.E-2)); +#8218=LINE('',#8217,#8216); +#8220=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8221=PRESENTATION_STYLE_ASSIGNMENT((#8220)); +#8222=STYLED_ITEM('',(#8221),#8219); +#8224=DIRECTION('',(8.906045842070E-1,-4.547784895854E-1,0.E0)); +#8225=VECTOR('',#8224,1.871380788279E-1); +#8226=CARTESIAN_POINT('',(7.941380997515E0,-2.160178977586E0,-4.E-2)); +#8227=LINE('',#8226,#8225); +#8229=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8230=PRESENTATION_STYLE_ASSIGNMENT((#8229)); +#8231=STYLED_ITEM('',(#8230),#8228); +#8233=DIRECTION('',(5.919094140959E-1,-8.060044947174E-1,0.E0)); +#8234=VECTOR('',#8233,2.111809628690E-1); +#8235=CARTESIAN_POINT('',(8.108047028399E0,-2.245285350420E0,-4.E-2)); +#8236=LINE('',#8235,#8234); +#8238=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8239=PRESENTATION_STYLE_ASSIGNMENT((#8238)); +#8240=STYLED_ITEM('',(#8239),#8237); +#8242=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8243=VECTOR('',#8242,1.276595592499E-1); +#8244=CARTESIAN_POINT('',(8.233047028399E0,-2.415498155691E0,-4.E-2)); +#8245=LINE('',#8244,#8243); +#8247=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8248=PRESENTATION_STYLE_ASSIGNMENT((#8247)); +#8249=STYLED_ITEM('',(#8248),#8246); +#8251=DIRECTION('',(-5.919094814228E-1,-8.060044452742E-1,0.E0)); +#8252=VECTOR('',#8251,2.111809388482E-1); +#8253=CARTESIAN_POINT('',(8.233047028399E0,-2.543157714941E0,-4.E-2)); +#8254=LINE('',#8253,#8252); +#8256=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8257=PRESENTATION_STYLE_ASSIGNMENT((#8256)); +#8258=STYLED_ITEM('',(#8257),#8255); +#8260=DIRECTION('',(-8.906045842070E-1,-4.547784895854E-1,0.E0)); +#8261=VECTOR('',#8260,1.871380788279E-1); +#8262=CARTESIAN_POINT('',(8.108047028399E0,-2.713370490410E0,-4.E-2)); +#8263=LINE('',#8262,#8261); +#8265=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8266=PRESENTATION_STYLE_ASSIGNMENT((#8265)); +#8267=STYLED_ITEM('',(#8266),#8264); +#8269=DIRECTION('',(-9.689174914946E-1,-2.473841035229E-1,0.E0)); +#8270=VECTOR('',#8269,1.720126144350E-1); +#8271=CARTESIAN_POINT('',(7.941380997515E0,-2.798476863243E0,-4.E-2)); +#8272=LINE('',#8271,#8270); +#8274=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8275=PRESENTATION_STYLE_ASSIGNMENT((#8274)); +#8276=STYLED_ITEM('',(#8275),#8273); +#8278=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8279=VECTOR('',#8278,1.666679382324E-1); +#8280=CARTESIAN_POINT('',(7.774714966632E0,-2.841030049659E0,-4.E-2)); +#8281=LINE('',#8280,#8279); +#8283=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8284=PRESENTATION_STYLE_ASSIGNMENT((#8283)); +#8285=STYLED_ITEM('',(#8284),#8282); +#8288=DIRECTION('',(9.689174914946E-1,-2.473841035229E-1,0.E0)); +#8289=VECTOR('',#8288,1.720126144350E-1); +#8290=CARTESIAN_POINT('',(7.774714966632E0,-1.266561943628E0,-4.E-2)); +#8291=LINE('',#8290,#8289); +#8293=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8294=PRESENTATION_STYLE_ASSIGNMENT((#8293)); +#8295=STYLED_ITEM('',(#8294),#8292); +#8297=DIRECTION('',(7.938770612153E-1,-6.080782940346E-1,0.E0)); +#8298=VECTOR('',#8297,2.099393458083E-1); +#8299=CARTESIAN_POINT('',(7.941380997515E0,-1.309115130045E0,-4.E-2)); +#8300=LINE('',#8299,#8298); +#8302=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8303=PRESENTATION_STYLE_ASSIGNMENT((#8302)); +#8304=STYLED_ITEM('',(#8303),#8301); +#8306=DIRECTION('',(5.466251129945E-1,-8.373774452681E-1,0.E0)); +#8307=VECTOR('',#8306,1.524517756963E-1); +#8308=CARTESIAN_POINT('',(8.108047028399E0,-1.436774689295E0,-4.E-2)); +#8309=LINE('',#8308,#8307); +#8311=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8312=PRESENTATION_STYLE_ASSIGNMENT((#8311)); +#8313=STYLED_ITEM('',(#8312),#8310); +#8315=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8316=VECTOR('',#8315,8.510637283325E-2); +#8317=CARTESIAN_POINT('',(8.191380997515E0,-1.564434367754E0,-4.E-2)); +#8318=LINE('',#8317,#8316); +#8320=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8321=PRESENTATION_STYLE_ASSIGNMENT((#8320)); +#8322=STYLED_ITEM('',(#8321),#8319); +#8324=DIRECTION('',(-5.466254709167E-1,-8.373772116227E-1,0.E0)); +#8325=VECTOR('',#8324,1.524516758732E-1); +#8326=CARTESIAN_POINT('',(8.191380997515E0,-1.649540740587E0,-4.E-2)); +#8327=LINE('',#8326,#8325); +#8329=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8330=PRESENTATION_STYLE_ASSIGNMENT((#8329)); +#8331=STYLED_ITEM('',(#8330),#8328); +#8333=DIRECTION('',(-7.938770612153E-1,-6.080782940346E-1,0.E0)); +#8334=VECTOR('',#8333,2.099393458083E-1); +#8335=CARTESIAN_POINT('',(8.108047028399E0,-1.777200299837E0,-4.E-2)); +#8336=LINE('',#8335,#8334); +#8338=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8339=PRESENTATION_STYLE_ASSIGNMENT((#8338)); +#8340=STYLED_ITEM('',(#8339),#8337); +#8342=DIRECTION('',(-9.689174914946E-1,-2.473841035229E-1,0.E0)); +#8343=VECTOR('',#8342,1.720126144350E-1); +#8344=CARTESIAN_POINT('',(7.941380997515E0,-1.904859859087E0,-4.E-2)); +#8345=LINE('',#8344,#8343); +#8347=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8348=PRESENTATION_STYLE_ASSIGNMENT((#8347)); +#8349=STYLED_ITEM('',(#8348),#8346); +#8351=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8352=VECTOR('',#8351,1.666679382324E-1); +#8353=CARTESIAN_POINT('',(7.774714966632E0,-1.947413045503E0,-4.E-2)); +#8354=LINE('',#8353,#8352); +#8356=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8357=PRESENTATION_STYLE_ASSIGNMENT((#8356)); +#8358=STYLED_ITEM('',(#8357),#8355); +#8360=DIRECTION('',(-9.689174914946E-1,2.473841035229E-1,0.E0)); +#8361=VECTOR('',#8360,1.720126144350E-1); +#8362=CARTESIAN_POINT('',(7.608047028399E0,-1.947413045503E0,-4.E-2)); +#8363=LINE('',#8362,#8361); +#8365=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8366=PRESENTATION_STYLE_ASSIGNMENT((#8365)); +#8367=STYLED_ITEM('',(#8366),#8364); +#8369=DIRECTION('',(-7.938770612153E-1,6.080782940346E-1,0.E0)); +#8370=VECTOR('',#8369,2.099393458083E-1); +#8371=CARTESIAN_POINT('',(7.441380997515E0,-1.904859859087E0,-4.E-2)); +#8372=LINE('',#8371,#8370); +#8374=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8375=PRESENTATION_STYLE_ASSIGNMENT((#8374)); +#8376=STYLED_ITEM('',(#8375),#8373); +#8378=DIRECTION('',(-5.466254709167E-1,8.373772116227E-1,0.E0)); +#8379=VECTOR('',#8378,1.524516758732E-1); +#8380=CARTESIAN_POINT('',(7.274714966632E0,-1.777200299837E0,-4.E-2)); +#8381=LINE('',#8380,#8379); +#8383=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8384=PRESENTATION_STYLE_ASSIGNMENT((#8383)); +#8385=STYLED_ITEM('',(#8384),#8382); +#8387=DIRECTION('',(0.E0,1.E0,0.E0)); +#8388=VECTOR('',#8387,8.510637283325E-2); +#8389=CARTESIAN_POINT('',(7.191380997515E0,-1.649540740587E0,-4.E-2)); +#8390=LINE('',#8389,#8388); +#8392=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8393=PRESENTATION_STYLE_ASSIGNMENT((#8392)); +#8394=STYLED_ITEM('',(#8393),#8391); +#8396=DIRECTION('',(5.466251129945E-1,8.373774452681E-1,0.E0)); +#8397=VECTOR('',#8396,1.524517756963E-1); +#8398=CARTESIAN_POINT('',(7.191380997515E0,-1.564434367754E0,-4.E-2)); +#8399=LINE('',#8398,#8397); +#8401=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8402=PRESENTATION_STYLE_ASSIGNMENT((#8401)); +#8403=STYLED_ITEM('',(#8402),#8400); +#8405=DIRECTION('',(7.938770612153E-1,6.080782940346E-1,0.E0)); +#8406=VECTOR('',#8405,2.099393458083E-1); +#8407=CARTESIAN_POINT('',(7.274714966632E0,-1.436774689295E0,-4.E-2)); +#8408=LINE('',#8407,#8406); +#8410=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8411=PRESENTATION_STYLE_ASSIGNMENT((#8410)); +#8412=STYLED_ITEM('',(#8411),#8409); +#8414=DIRECTION('',(9.689174914946E-1,2.473841035229E-1,0.E0)); +#8415=VECTOR('',#8414,1.720126144350E-1); +#8416=CARTESIAN_POINT('',(7.441380997515E0,-1.309115130045E0,-4.E-2)); +#8417=LINE('',#8416,#8415); +#8419=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8420=PRESENTATION_STYLE_ASSIGNMENT((#8419)); +#8421=STYLED_ITEM('',(#8420),#8418); +#8423=DIRECTION('',(1.E0,0.E0,0.E0)); +#8424=VECTOR('',#8423,1.666679382324E-1); +#8425=CARTESIAN_POINT('',(7.608047028399E0,-1.266561943628E0,-4.E-2)); +#8426=LINE('',#8425,#8424); +#8428=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8429=PRESENTATION_STYLE_ASSIGNMENT((#8428)); +#8430=STYLED_ITEM('',(#8429),#8427); +#8433=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8434=VECTOR('',#8433,3.829786777496E-1); +#8435=CARTESIAN_POINT('',(8.774714966632E0,-1.862306672670E0,-4.E-2)); +#8436=LINE('',#8435,#8434); +#8438=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8439=PRESENTATION_STYLE_ASSIGNMENT((#8438)); +#8440=STYLED_ITEM('',(#8439),#8437); +#8442=DIRECTION('',(1.921799773945E-1,-9.813596977096E-1,0.E0)); +#8443=VECTOR('',#8442,2.168073461590E-1); +#8444=CARTESIAN_POINT('',(8.774714966632E0,-2.245285350420E0,-4.E-2)); +#8445=LINE('',#8444,#8443); +#8447=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8448=PRESENTATION_STYLE_ASSIGNMENT((#8447)); +#8449=STYLED_ITEM('',(#8448),#8446); +#8451=DIRECTION('',(3.102757862690E-1,-9.506465886201E-1,0.E0)); +#8452=VECTOR('',#8451,1.342870849988E-1); +#8453=CARTESIAN_POINT('',(8.816380997515E0,-2.458051342107E0,-4.E-2)); +#8454=LINE('',#8453,#8452); +#8456=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8457=PRESENTATION_STYLE_ASSIGNMENT((#8456)); +#8458=STYLED_ITEM('',(#8457),#8455); +#8460=DIRECTION('',(4.397161398292E-1,-8.981368027053E-1,0.E0)); +#8461=VECTOR('',#8460,1.895176491556E-1); +#8462=CARTESIAN_POINT('',(8.858047028399E0,-2.585710901357E0,-4.E-2)); +#8463=LINE('',#8462,#8461); +#8465=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8466=PRESENTATION_STYLE_ASSIGNMENT((#8465)); +#8467=STYLED_ITEM('',(#8466),#8464); +#8469=DIRECTION('',(6.996247934953E-1,-7.145104256249E-1,0.E0)); +#8470=VECTOR('',#8469,1.786671958487E-1); +#8471=CARTESIAN_POINT('',(8.941380997515E0,-2.755923676826E0,-4.E-2)); +#8472=LINE('',#8471,#8470); +#8474=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8475=PRESENTATION_STYLE_ASSIGNMENT((#8474)); +#8476=STYLED_ITEM('',(#8475),#8473); +#8478=DIRECTION('',(8.526541125558E-1,-5.224758026374E-1,0.E0)); +#8479=VECTOR('',#8478,2.443358520746E-1); +#8480=CARTESIAN_POINT('',(9.066380997515E0,-2.883583250977E0,-4.E-2)); +#8481=LINE('',#8480,#8479); +#8483=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8484=PRESENTATION_STYLE_ASSIGNMENT((#8483)); +#8485=STYLED_ITEM('',(#8484),#8482); +#8487=DIRECTION('',(9.858211706631E-1,-1.677993428846E-1,0.E0)); +#8488=VECTOR('',#8487,2.535956900092E-1); +#8489=CARTESIAN_POINT('',(9.274714966632E0,-3.011242821403E0,-4.E-2)); +#8490=LINE('',#8489,#8488); +#8492=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8493=PRESENTATION_STYLE_ASSIGNMENT((#8492)); +#8494=STYLED_ITEM('',(#8493),#8491); +#8496=DIRECTION('',(9.858211706631E-1,1.677993428846E-1,0.E0)); +#8497=VECTOR('',#8496,2.535956900092E-1); +#8498=CARTESIAN_POINT('',(9.524714966632E0,-3.053796011545E0,-4.E-2)); +#8499=LINE('',#8498,#8497); +#8501=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8502=PRESENTATION_STYLE_ASSIGNMENT((#8501)); +#8503=STYLED_ITEM('',(#8502),#8500); +#8505=DIRECTION('',(8.526519815748E-1,5.224792802749E-1,0.E0)); +#8506=VECTOR('',#8505,2.443342257679E-1); +#8507=CARTESIAN_POINT('',(9.774714966632E0,-3.011242821403E0,-4.E-2)); +#8508=LINE('',#8507,#8506); +#8510=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8511=PRESENTATION_STYLE_ASSIGNMENT((#8510)); +#8512=STYLED_ITEM('',(#8511),#8509); +#8514=DIRECTION('',(6.996247934953E-1,7.145104256249E-1,0.E0)); +#8515=VECTOR('',#8514,1.786671958487E-1); +#8516=CARTESIAN_POINT('',(9.983047028399E0,-2.883583250977E0,-4.E-2)); +#8517=LINE('',#8516,#8515); +#8519=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8520=PRESENTATION_STYLE_ASSIGNMENT((#8519)); +#8521=STYLED_ITEM('',(#8520),#8518); +#8523=DIRECTION('',(4.397161398292E-1,8.981368027053E-1,0.E0)); +#8524=VECTOR('',#8523,1.895176491556E-1); +#8525=CARTESIAN_POINT('',(1.010804702840E1,-2.755923676826E0,-4.E-2)); +#8526=LINE('',#8525,#8524); +#8528=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8529=PRESENTATION_STYLE_ASSIGNMENT((#8528)); +#8530=STYLED_ITEM('',(#8529),#8527); +#8532=DIRECTION('',(3.102757862690E-1,9.506465886201E-1,0.E0)); +#8533=VECTOR('',#8532,1.342870849988E-1); +#8534=CARTESIAN_POINT('',(1.019138099752E1,-2.585710901357E0,-4.E-2)); +#8535=LINE('',#8534,#8533); +#8537=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8538=PRESENTATION_STYLE_ASSIGNMENT((#8537)); +#8539=STYLED_ITEM('',(#8538),#8536); +#8541=DIRECTION('',(1.921884498915E-1,9.813580384999E-1,0.E0)); +#8542=VECTOR('',#8541,2.168077127213E-1); +#8543=CARTESIAN_POINT('',(1.023304702840E1,-2.458051342107E0,-4.E-2)); +#8544=LINE('',#8543,#8542); +#8546=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8547=PRESENTATION_STYLE_ASSIGNMENT((#8546)); +#8548=STYLED_ITEM('',(#8547),#8545); +#8550=DIRECTION('',(0.E0,1.E0,0.E0)); +#8551=VECTOR('',#8550,3.829786777496E-1); +#8552=CARTESIAN_POINT('',(1.027471496663E1,-2.245285350420E0,-4.E-2)); +#8553=LINE('',#8552,#8551); +#8555=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8556=PRESENTATION_STYLE_ASSIGNMENT((#8555)); +#8557=STYLED_ITEM('',(#8556),#8554); +#8559=DIRECTION('',(-1.921885017429E-1,9.813580283453E-1,0.E0)); +#8560=VECTOR('',#8559,2.168076542278E-1); +#8561=CARTESIAN_POINT('',(1.027471496663E1,-1.862306672670E0,-4.E-2)); +#8562=LINE('',#8561,#8560); +#8564=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8565=PRESENTATION_STYLE_ASSIGNMENT((#8564)); +#8566=STYLED_ITEM('',(#8565),#8563); +#8568=DIRECTION('',(-3.102755244251E-1,9.506466740818E-1,0.E0)); +#8569=VECTOR('',#8568,1.342871983247E-1); +#8570=CARTESIAN_POINT('',(1.023304702840E1,-1.649540740587E0,-4.E-2)); +#8571=LINE('',#8570,#8569); +#8573=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8574=PRESENTATION_STYLE_ASSIGNMENT((#8573)); +#8575=STYLED_ITEM('',(#8574),#8572); +#8577=DIRECTION('',(-4.397162019326E-1,8.981367723003E-1,0.E0)); +#8578=VECTOR('',#8577,1.895176223890E-1); +#8579=CARTESIAN_POINT('',(1.019138099752E1,-1.521881062128E0,-4.E-2)); +#8580=LINE('',#8579,#8578); +#8582=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8583=PRESENTATION_STYLE_ASSIGNMENT((#8582)); +#8584=STYLED_ITEM('',(#8583),#8581); +#8586=DIRECTION('',(-6.996248351869E-1,7.145103848018E-1,0.E0)); +#8587=VECTOR('',#8586,1.786671852016E-1); +#8588=CARTESIAN_POINT('',(1.010804702840E1,-1.351668316461E0,-4.E-2)); +#8589=LINE('',#8588,#8587); +#8591=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8592=PRESENTATION_STYLE_ASSIGNMENT((#8591)); +#8593=STYLED_ITEM('',(#8592),#8590); +#8595=DIRECTION('',(-8.526520019517E-1,5.224792470211E-1,0.E0)); +#8596=VECTOR('',#8595,2.443342199288E-1); +#8597=CARTESIAN_POINT('',(9.983047028399E0,-1.224008757211E0,-4.E-2)); +#8598=LINE('',#8597,#8596); +#8600=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8601=PRESENTATION_STYLE_ASSIGNMENT((#8600)); +#8602=STYLED_ITEM('',(#8601),#8599); +#8604=DIRECTION('',(-9.858211730931E-1,1.677993286083E-1,0.E0)); +#8605=VECTOR('',#8604,2.535956893841E-1); +#8606=CARTESIAN_POINT('',(9.774714966632E0,-1.096349197962E0,-4.E-2)); +#8607=LINE('',#8606,#8605); +#8609=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8610=PRESENTATION_STYLE_ASSIGNMENT((#8609)); +#8611=STYLED_ITEM('',(#8610),#8608); +#8613=DIRECTION('',(-9.858211730931E-1,-1.677993286083E-1,0.E0)); +#8614=VECTOR('',#8613,2.535956893841E-1); +#8615=CARTESIAN_POINT('',(9.524714966632E0,-1.053796011545E0,-4.E-2)); +#8616=LINE('',#8615,#8614); +#8618=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8619=PRESENTATION_STYLE_ASSIGNMENT((#8618)); +#8620=STYLED_ITEM('',(#8619),#8617); +#8622=DIRECTION('',(-8.526541329325E-1,-5.224757693837E-1,0.E0)); +#8623=VECTOR('',#8622,2.443358462354E-1); +#8624=CARTESIAN_POINT('',(9.274714966632E0,-1.096349197962E0,-4.E-2)); +#8625=LINE('',#8624,#8623); +#8627=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8628=PRESENTATION_STYLE_ASSIGNMENT((#8627)); +#8629=STYLED_ITEM('',(#8628),#8626); +#8631=DIRECTION('',(-6.996248351869E-1,-7.145103848018E-1,0.E0)); +#8632=VECTOR('',#8631,1.786671852016E-1); +#8633=CARTESIAN_POINT('',(9.066380997515E0,-1.224008757211E0,-4.E-2)); +#8634=LINE('',#8633,#8632); +#8636=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8637=PRESENTATION_STYLE_ASSIGNMENT((#8636)); +#8638=STYLED_ITEM('',(#8637),#8635); +#8640=DIRECTION('',(-4.397162019326E-1,-8.981367723003E-1,0.E0)); +#8641=VECTOR('',#8640,1.895176223890E-1); +#8642=CARTESIAN_POINT('',(8.941380997515E0,-1.351668316461E0,-4.E-2)); +#8643=LINE('',#8642,#8641); +#8645=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8646=PRESENTATION_STYLE_ASSIGNMENT((#8645)); +#8647=STYLED_ITEM('',(#8646),#8644); +#8649=DIRECTION('',(-3.102755244251E-1,-9.506466740818E-1,0.E0)); +#8650=VECTOR('',#8649,1.342871983247E-1); +#8651=CARTESIAN_POINT('',(8.858047028399E0,-1.521881062128E0,-4.E-2)); +#8652=LINE('',#8651,#8650); +#8654=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8655=PRESENTATION_STYLE_ASSIGNMENT((#8654)); +#8656=STYLED_ITEM('',(#8655),#8653); +#8658=DIRECTION('',(-1.921800292438E-1,-9.813596875559E-1,0.E0)); +#8659=VECTOR('',#8658,2.168072876654E-1); +#8660=CARTESIAN_POINT('',(8.816380997515E0,-1.649540740587E0,-4.E-2)); +#8661=LINE('',#8660,#8659); +#8663=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8664=PRESENTATION_STYLE_ASSIGNMENT((#8663)); +#8665=STYLED_ITEM('',(#8664),#8662); +#8668=DIRECTION('',(1.610685842698E-1,9.869432157735E-1,0.E0)); +#8669=VECTOR('',#8668,2.586968676811E-1); +#8670=CARTESIAN_POINT('',(8.983047028399E0,-1.904859859087E0,-4.E-2)); +#8671=LINE('',#8670,#8669); +#8673=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8674=PRESENTATION_STYLE_ASSIGNMENT((#8673)); +#8675=STYLED_ITEM('',(#8674),#8672); +#8677=DIRECTION('',(5.466209055138E-1,8.373801918216E-1,0.E0)); +#8678=VECTOR('',#8677,3.049024089686E-1); +#8679=CARTESIAN_POINT('',(9.024714966632E0,-1.649540740587E0,-4.E-2)); +#8680=LINE('',#8679,#8678); +#8682=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8683=PRESENTATION_STYLE_ASSIGNMENT((#8682)); +#8684=STYLED_ITEM('',(#8683),#8681); +#8686=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#8687=VECTOR('',#8686,1.512220046714E-1); +#8688=CARTESIAN_POINT('',(9.191380997515E0,-1.394221502878E0,-4.E-2)); +#8689=LINE('',#8688,#8687); +#8691=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8692=PRESENTATION_STYLE_ASSIGNMENT((#8691)); +#8693=STYLED_ITEM('',(#8692),#8690); +#8695=DIRECTION('',(9.797708290262E-1,2.001227687928E-1,0.E0)); +#8696=VECTOR('',#8695,2.126354071220E-1); +#8697=CARTESIAN_POINT('',(9.316380997515E0,-1.309115130045E0,-4.E-2)); +#8698=LINE('',#8697,#8696); +#8700=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8701=PRESENTATION_STYLE_ASSIGNMENT((#8700)); +#8702=STYLED_ITEM('',(#8701),#8699); +#8704=DIRECTION('',(9.797704697791E-1,-2.001245276041E-1,0.E0)); +#8705=VECTOR('',#8704,2.126335383578E-1); +#8706=CARTESIAN_POINT('',(9.524714966632E0,-1.266561943628E0,-4.E-2)); +#8707=LINE('',#8706,#8705); +#8709=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8710=PRESENTATION_STYLE_ASSIGNMENT((#8709)); +#8711=STYLED_ITEM('',(#8710),#8708); +#8713=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#8714=VECTOR('',#8713,1.512220046714E-1); +#8715=CARTESIAN_POINT('',(9.733047028399E0,-1.309115130045E0,-4.E-2)); +#8716=LINE('',#8715,#8714); +#8718=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8719=PRESENTATION_STYLE_ASSIGNMENT((#8718)); +#8720=STYLED_ITEM('',(#8719),#8717); +#8722=DIRECTION('',(5.466252919556E-1,-8.373773284455E-1,0.E0)); +#8723=VECTOR('',#8722,3.049034515695E-1); +#8724=CARTESIAN_POINT('',(9.858047028399E0,-1.394221502878E0,-4.E-2)); +#8725=LINE('',#8724,#8723); +#8727=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8728=PRESENTATION_STYLE_ASSIGNMENT((#8727)); +#8729=STYLED_ITEM('',(#8728),#8726); +#8731=DIRECTION('',(1.610614026234E-1,-9.869443877874E-1,0.E0)); +#8732=VECTOR('',#8731,2.586965604740E-1); +#8733=CARTESIAN_POINT('',(1.002471496663E1,-1.649540740587E0,-4.E-2)); +#8734=LINE('',#8733,#8732); +#8736=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8737=PRESENTATION_STYLE_ASSIGNMENT((#8736)); +#8738=STYLED_ITEM('',(#8737),#8735); +#8740=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8741=VECTOR('',#8740,2.978723049164E-1); +#8742=CARTESIAN_POINT('',(1.006638099752E1,-1.904859859087E0,-4.E-2)); +#8743=LINE('',#8742,#8741); +#8745=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8746=PRESENTATION_STYLE_ASSIGNMENT((#8745)); +#8747=STYLED_ITEM('',(#8746),#8744); +#8749=DIRECTION('',(-1.610613659987E-1,-9.869443937642E-1,0.E0)); +#8750=VECTOR('',#8749,2.586966193005E-1); +#8751=CARTESIAN_POINT('',(1.006638099752E1,-2.202732164003E0,-4.E-2)); +#8752=LINE('',#8751,#8750); +#8754=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8755=PRESENTATION_STYLE_ASSIGNMENT((#8754)); +#8756=STYLED_ITEM('',(#8755),#8753); +#8758=DIRECTION('',(-5.466254261764E-1,-8.373772408284E-1,0.E0)); +#8759=VECTOR('',#8758,3.049033767021E-1); +#8760=CARTESIAN_POINT('',(1.002471496663E1,-2.458051342107E0,-4.E-2)); +#8761=LINE('',#8760,#8759); +#8763=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8764=PRESENTATION_STYLE_ASSIGNMENT((#8763)); +#8765=STYLED_ITEM('',(#8764),#8762); +#8767=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#8768=VECTOR('',#8767,1.512220046714E-1); +#8769=CARTESIAN_POINT('',(9.858047028399E0,-2.713370490410E0,-4.E-2)); +#8770=LINE('',#8769,#8768); +#8772=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8773=PRESENTATION_STYLE_ASSIGNMENT((#8772)); +#8774=STYLED_ITEM('',(#8773),#8771); +#8776=DIRECTION('',(-9.797704697791E-1,-2.001245276041E-1,0.E0)); +#8777=VECTOR('',#8776,2.126335383578E-1); +#8778=CARTESIAN_POINT('',(9.733047028399E0,-2.798476863243E0,-4.E-2)); +#8779=LINE('',#8778,#8777); +#8781=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8782=PRESENTATION_STYLE_ASSIGNMENT((#8781)); +#8783=STYLED_ITEM('',(#8782),#8780); +#8785=DIRECTION('',(-9.797708290262E-1,2.001227687928E-1,0.E0)); +#8786=VECTOR('',#8785,2.126354071220E-1); +#8787=CARTESIAN_POINT('',(9.524714966632E0,-2.841030049659E0,-4.E-2)); +#8788=LINE('',#8787,#8786); +#8790=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8791=PRESENTATION_STYLE_ASSIGNMENT((#8790)); +#8792=STYLED_ITEM('',(#8791),#8789); +#8794=DIRECTION('',(-8.265992787996E-1,5.627909312417E-1,0.E0)); +#8795=VECTOR('',#8794,1.512220046714E-1); +#8796=CARTESIAN_POINT('',(9.316380997515E0,-2.798476863243E0,-4.E-2)); +#8797=LINE('',#8796,#8795); +#8799=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8800=PRESENTATION_STYLE_ASSIGNMENT((#8799)); +#8801=STYLED_ITEM('',(#8800),#8798); +#8803=DIRECTION('',(-5.466210397345E-1,8.373801042057E-1,0.E0)); +#8804=VECTOR('',#8803,3.049023341010E-1); +#8805=CARTESIAN_POINT('',(9.191380997515E0,-2.713370490410E0,-4.E-2)); +#8806=LINE('',#8805,#8804); +#8808=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8809=PRESENTATION_STYLE_ASSIGNMENT((#8808)); +#8810=STYLED_ITEM('',(#8809),#8807); +#8812=DIRECTION('',(-1.610685476436E-1,9.869432217509E-1,0.E0)); +#8813=VECTOR('',#8812,2.586969265075E-1); +#8814=CARTESIAN_POINT('',(9.024714966632E0,-2.458051342107E0,-4.E-2)); +#8815=LINE('',#8814,#8813); +#8817=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8818=PRESENTATION_STYLE_ASSIGNMENT((#8817)); +#8819=STYLED_ITEM('',(#8818),#8816); +#8821=DIRECTION('',(0.E0,1.E0,0.E0)); +#8822=VECTOR('',#8821,2.978723049164E-1); +#8823=CARTESIAN_POINT('',(8.983047028399E0,-2.202732164003E0,-4.E-2)); +#8824=LINE('',#8823,#8822); +#8826=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8827=PRESENTATION_STYLE_ASSIGNMENT((#8826)); +#8828=STYLED_ITEM('',(#8827),#8825); +#8831=DIRECTION('',(0.E0,1.E0,0.E0)); +#8832=VECTOR('',#8831,2.E0); +#8833=CARTESIAN_POINT('',(-2.412772000033E0,2.500214774731E0,-4.E-2)); +#8834=LINE('',#8833,#8832); +#8836=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8837=PRESENTATION_STYLE_ASSIGNMENT((#8836)); +#8838=STYLED_ITEM('',(#8837),#8835); +#8840=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8841=VECTOR('',#8840,2.5E-1); +#8842=CARTESIAN_POINT('',(-2.412772000033E0,4.500214774731E0,-4.E-2)); +#8843=LINE('',#8842,#8841); +#8845=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8846=PRESENTATION_STYLE_ASSIGNMENT((#8845)); +#8847=STYLED_ITEM('',(#8846),#8844); +#8849=DIRECTION('',(-6.428712937139E-1,-7.659742160926E-1,0.E0)); +#8850=VECTOR('',#8849,3.888803286825E-1); +#8851=CARTESIAN_POINT('',(-2.662772000033E0,4.500214774731E0,-4.E-2)); +#8852=LINE('',#8851,#8850); +#8854=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8855=PRESENTATION_STYLE_ASSIGNMENT((#8854)); +#8856=STYLED_ITEM('',(#8855),#8853); +#8858=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8859=VECTOR('',#8858,3.404256105423E-1); +#8860=CARTESIAN_POINT('',(-2.912772000033E0,4.202342469814E0,-4.E-2)); +#8861=LINE('',#8860,#8859); +#8863=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8864=PRESENTATION_STYLE_ASSIGNMENT((#8863)); +#8865=STYLED_ITEM('',(#8864),#8862); +#8867=DIRECTION('',(6.428711427642E-1,7.659743427825E-1,0.E0)); +#8868=VECTOR('',#8867,3.888804199937E-1); +#8869=CARTESIAN_POINT('',(-2.912772000033E0,3.861916859272E0,-4.E-2)); +#8870=LINE('',#8869,#8868); +#8872=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8873=PRESENTATION_STYLE_ASSIGNMENT((#8872)); +#8874=STYLED_ITEM('',(#8873),#8871); +#8876=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8877=VECTOR('',#8876,1.659574508667E0); +#8878=CARTESIAN_POINT('',(-2.662772000033E0,4.159789283398E0,-4.E-2)); +#8879=LINE('',#8878,#8877); +#8881=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8882=PRESENTATION_STYLE_ASSIGNMENT((#8881)); +#8883=STYLED_ITEM('',(#8882),#8880); +#8885=DIRECTION('',(1.E0,0.E0,0.E0)); +#8886=VECTOR('',#8885,2.5E-1); +#8887=CARTESIAN_POINT('',(-2.662772000033E0,2.500214774731E0,-4.E-2)); +#8888=LINE('',#8887,#8886); +#8890=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8891=PRESENTATION_STYLE_ASSIGNMENT((#8890)); +#8892=STYLED_ITEM('',(#8891),#8889); +#8895=DIRECTION('',(0.E0,1.E0,0.E0)); +#8896=VECTOR('',#8895,2.127659618855E-1); +#8897=CARTESIAN_POINT('',(-1.871105373103E0,2.500214774731E0,-4.E-2)); +#8898=LINE('',#8897,#8896); +#8900=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8901=PRESENTATION_STYLE_ASSIGNMENT((#8900)); +#8902=STYLED_ITEM('',(#8901),#8899); +#8904=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8905=VECTOR('',#8904,2.083333134651E-1); +#8906=CARTESIAN_POINT('',(-1.871105373103E0,2.712980736616E0,-4.E-2)); +#8907=LINE('',#8906,#8905); +#8909=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8910=PRESENTATION_STYLE_ASSIGNMENT((#8909)); +#8911=STYLED_ITEM('',(#8910),#8908); +#8913=DIRECTION('',(0.E0,-1.E0,0.E0)); +#8914=VECTOR('',#8913,2.127659618855E-1); +#8915=CARTESIAN_POINT('',(-2.079438686568E0,2.712980736616E0,-4.E-2)); +#8916=LINE('',#8915,#8914); +#8918=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8919=PRESENTATION_STYLE_ASSIGNMENT((#8918)); +#8920=STYLED_ITEM('',(#8919),#8917); +#8922=DIRECTION('',(1.E0,0.E0,0.E0)); +#8923=VECTOR('',#8922,2.083333134651E-1); +#8924=CARTESIAN_POINT('',(-2.079438686568E0,2.500214774731E0,-4.E-2)); +#8925=LINE('',#8924,#8923); +#8927=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8928=PRESENTATION_STYLE_ASSIGNMENT((#8927)); +#8929=STYLED_ITEM('',(#8928),#8926); +#8932=DIRECTION('',(-6.996248351869E-1,7.145103848018E-1,0.E0)); +#8933=VECTOR('',#8932,1.786671852016E-1); +#8934=CARTESIAN_POINT('',(-1.211052538936E-1,3.478938181522E0,-4.E-2)); +#8935=LINE('',#8934,#8933); +#8937=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8938=PRESENTATION_STYLE_ASSIGNMENT((#8937)); +#8939=STYLED_ITEM('',(#8938),#8936); +#8941=DIRECTION('',(-8.526536001913E-1,5.224766387895E-1,0.E0)); +#8942=VECTOR('',#8941,2.443354396584E-1); +#8943=CARTESIAN_POINT('',(-2.461052538936E-1,3.606597740772E0,-4.E-2)); +#8944=LINE('',#8943,#8942); +#8946=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8947=PRESENTATION_STYLE_ASSIGNMENT((#8946)); +#8948=STYLED_ITEM('',(#8947),#8945); +#8950=DIRECTION('',(-9.797706943097E-1,2.001234283435E-1,0.E0)); +#8951=VECTOR('',#8950,2.126347063353E-1); +#8952=CARTESIAN_POINT('',(-4.544387461726E-1,3.734257300022E0,-4.E-2)); +#8953=LINE('',#8952,#8951); +#8955=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8956=PRESENTATION_STYLE_ASSIGNMENT((#8955)); +#8957=STYLED_ITEM('',(#8956),#8954); +#8959=DIRECTION('',(-1.E0,0.E0,0.E0)); +#8960=VECTOR('',#8959,2.083332538605E-1); +#8961=CARTESIAN_POINT('',(-6.627720000331E-1,3.776810486439E0,-4.E-2)); +#8962=LINE('',#8961,#8960); +#8964=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8965=PRESENTATION_STYLE_ASSIGNMENT((#8964)); +#8966=STYLED_ITEM('',(#8965),#8963); +#8968=DIRECTION('',(-9.797707167625E-1,-2.001233184181E-1,0.E0)); +#8969=VECTOR('',#8968,2.126348231331E-1); +#8970=CARTESIAN_POINT('',(-8.711052538936E-1,3.776810486439E0,-4.E-2)); +#8971=LINE('',#8970,#8969); +#8973=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8974=PRESENTATION_STYLE_ASSIGNMENT((#8973)); +#8975=STYLED_ITEM('',(#8974),#8972); +#8977=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#8978=VECTOR('',#8977,3.024440093428E-1); +#8979=CARTESIAN_POINT('',(-1.079438626963E0,3.734257300022E0,-4.E-2)); +#8980=LINE('',#8979,#8978); +#8982=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8983=PRESENTATION_STYLE_ASSIGNMENT((#8982)); +#8984=STYLED_ITEM('',(#8983),#8981); +#8986=DIRECTION('',(0.E0,1.E0,0.E0)); +#8987=VECTOR('',#8986,8.510637283325E-2); +#8988=CARTESIAN_POINT('',(-1.329438626963E0,3.564044554356E0,-4.E-2)); +#8989=LINE('',#8988,#8987); +#8991=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#8992=PRESENTATION_STYLE_ASSIGNMENT((#8991)); +#8993=STYLED_ITEM('',(#8992),#8990); +#8995=DIRECTION('',(1.610636468906E-1,9.869440215384E-1,0.E0)); +#8996=VECTOR('',#8995,2.586966564748E-1); +#8997=CARTESIAN_POINT('',(-1.329438626963E0,3.649150927189E0,-4.E-2)); +#8998=LINE('',#8997,#8996); +#9000=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9001=PRESENTATION_STYLE_ASSIGNMENT((#9000)); +#9002=STYLED_ITEM('',(#9001),#8999); +#9004=DIRECTION('',(3.102795357040E-1,9.506453648566E-1,0.E0)); +#9005=VECTOR('',#9004,1.342873832646E-1); +#9006=CARTESIAN_POINT('',(-1.287772000033E0,3.904470045689E0,-4.E-2)); +#9007=LINE('',#9006,#9005); +#9009=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9010=PRESENTATION_STYLE_ASSIGNMENT((#9009)); +#9011=STYLED_ITEM('',(#9010),#9008); +#9013=DIRECTION('',(5.466227293958E-1,8.373790012342E-1,0.E0)); +#9014=VECTOR('',#9013,1.524513500598E-1); +#9015=CARTESIAN_POINT('',(-1.246105373103E0,4.032129724148E0,-4.E-2)); +#9016=LINE('',#9015,#9014); +#9018=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9019=PRESENTATION_STYLE_ASSIGNMENT((#9018)); +#9020=STYLED_ITEM('',(#9019),#9017); +#9022=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#9023=VECTOR('',#9022,1.512220046714E-1); +#9024=CARTESIAN_POINT('',(-1.162772000033E0,4.159789283398E0,-4.E-2)); +#9025=LINE('',#9024,#9023); +#9027=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9028=PRESENTATION_STYLE_ASSIGNMENT((#9027)); +#9029=STYLED_ITEM('',(#9028),#9026); +#9031=DIRECTION('',(9.466499177700E-1,3.222637633772E-1,0.E0)); +#9032=VECTOR('',#9031,1.320445897196E-1); +#9033=CARTESIAN_POINT('',(-1.037772000033E0,4.244895656231E0,-4.E-2)); +#9034=LINE('',#9033,#9032); +#9036=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9037=PRESENTATION_STYLE_ASSIGNMENT((#9036)); +#9038=STYLED_ITEM('',(#9037),#9035); +#9040=DIRECTION('',(1.E0,0.E0,0.E0)); +#9041=VECTOR('',#9040,2.5E-1); +#9042=CARTESIAN_POINT('',(-9.127720000331E-1,4.287448842648E0,-4.E-2)); +#9043=LINE('',#9042,#9041); +#9045=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9046=PRESENTATION_STYLE_ASSIGNMENT((#9045)); +#9047=STYLED_ITEM('',(#9046),#9044); +#9049=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9050=VECTOR('',#9049,1.320445897196E-1); +#9051=CARTESIAN_POINT('',(-6.627720000331E-1,4.287448842648E0,-4.E-2)); +#9052=LINE('',#9051,#9050); +#9054=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9055=PRESENTATION_STYLE_ASSIGNMENT((#9054)); +#9056=STYLED_ITEM('',(#9055),#9053); +#9058=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9059=VECTOR('',#9058,1.512220046714E-1); +#9060=CARTESIAN_POINT('',(-5.377720000331E-1,4.244895656231E0,-4.E-2)); +#9061=LINE('',#9060,#9059); +#9063=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9064=PRESENTATION_STYLE_ASSIGNMENT((#9063)); +#9065=STYLED_ITEM('',(#9064),#9062); +#9067=DIRECTION('',(5.466221810895E-1,-8.373793591563E-1,0.E0)); +#9068=VECTOR('',#9067,1.524512848973E-1); +#9069=CARTESIAN_POINT('',(-4.127720000331E-1,4.159789283398E0,-4.E-2)); +#9070=LINE('',#9069,#9068); +#9072=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9073=PRESENTATION_STYLE_ASSIGNMENT((#9072)); +#9074=STYLED_ITEM('',(#9073),#9071); +#9076=DIRECTION('',(1.E0,0.E0,0.E0)); +#9077=VECTOR('',#9076,2.083334922791E-1); +#9078=CARTESIAN_POINT('',(-3.294387461726E-1,4.032129724148E0,-4.E-2)); +#9079=LINE('',#9078,#9077); +#9081=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9082=PRESENTATION_STYLE_ASSIGNMENT((#9081)); +#9083=STYLED_ITEM('',(#9082),#9080); +#9085=DIRECTION('',(-3.102805998049E-1,9.506450175458E-1,0.E0)); +#9086=VECTOR('',#9085,1.342873069271E-1); +#9087=CARTESIAN_POINT('',(-1.211052538936E-1,4.032129724148E0,-4.E-2)); +#9088=LINE('',#9087,#9086); +#9090=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9091=PRESENTATION_STYLE_ASSIGNMENT((#9090)); +#9092=STYLED_ITEM('',(#9091),#9089); +#9094=DIRECTION('',(-5.919095487496E-1,8.060043958311E-1,0.E0)); +#9095=VECTOR('',#9094,2.111809148274E-1); +#9096=CARTESIAN_POINT('',(-1.627720000331E-1,4.159789283398E0,-4.E-2)); +#9097=LINE('',#9096,#9095); +#9099=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9100=PRESENTATION_STYLE_ASSIGNMENT((#9099)); +#9101=STYLED_ITEM('',(#9100),#9098); +#9103=DIRECTION('',(-8.526533338197E-1,5.224770734933E-1,0.E0)); +#9104=VECTOR('',#9103,2.443352363700E-1); +#9105=CARTESIAN_POINT('',(-2.877720000331E-1,4.330002029064E0,-4.E-2)); +#9106=LINE('',#9105,#9104); +#9108=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9109=PRESENTATION_STYLE_ASSIGNMENT((#9108)); +#9110=STYLED_ITEM('',(#9109),#9107); +#9112=DIRECTION('',(-9.797707392153E-1,2.001232084928E-1,0.E0)); +#9113=VECTOR('',#9112,2.126349399308E-1); +#9114=CARTESIAN_POINT('',(-4.961052538936E-1,4.457661588314E0,-4.E-2)); +#9115=LINE('',#9114,#9113); +#9117=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9118=PRESENTATION_STYLE_ASSIGNMENT((#9117)); +#9119=STYLED_ITEM('',(#9118),#9116); +#9121=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9122=VECTOR('',#9121,1.666665077209E-1); +#9123=CARTESIAN_POINT('',(-7.044387461726E-1,4.500214774731E0,-4.E-2)); +#9124=LINE('',#9123,#9122); +#9126=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9127=PRESENTATION_STYLE_ASSIGNMENT((#9126)); +#9128=STYLED_ITEM('',(#9127),#9125); +#9130=DIRECTION('',(-9.797707167625E-1,-2.001233184181E-1,0.E0)); +#9131=VECTOR('',#9130,2.126348231331E-1); +#9132=CARTESIAN_POINT('',(-8.711052538936E-1,4.500214774731E0,-4.E-2)); +#9133=LINE('',#9132,#9131); +#9135=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9136=PRESENTATION_STYLE_ASSIGNMENT((#9135)); +#9137=STYLED_ITEM('',(#9136),#9134); +#9139=DIRECTION('',(-8.526534670056E-1,-5.224768561414E-1,0.E0)); +#9140=VECTOR('',#9139,2.443353380142E-1); +#9141=CARTESIAN_POINT('',(-1.079438626963E0,4.457661588314E0,-4.E-2)); +#9142=LINE('',#9141,#9140); +#9144=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9145=PRESENTATION_STYLE_ASSIGNMENT((#9144)); +#9146=STYLED_ITEM('',(#9145),#9143); +#9148=DIRECTION('',(-5.919095487496E-1,-8.060043958311E-1,0.E0)); +#9149=VECTOR('',#9148,2.111809148274E-1); +#9150=CARTESIAN_POINT('',(-1.287772000033E0,4.330002029064E0,-4.E-2)); +#9151=LINE('',#9150,#9149); +#9153=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9154=PRESENTATION_STYLE_ASSIGNMENT((#9153)); +#9155=STYLED_ITEM('',(#9154),#9152); +#9157=DIRECTION('',(-3.646919095245E-1,-9.311282463374E-1,0.E0)); +#9158=VECTOR('',#9157,2.285034871720E-1); +#9159=CARTESIAN_POINT('',(-1.412772000033E0,4.159789283398E0,-4.E-2)); +#9160=LINE('',#9159,#9158); +#9162=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9163=PRESENTATION_STYLE_ASSIGNMENT((#9162)); +#9164=STYLED_ITEM('',(#9163),#9161); +#9166=DIRECTION('',(-1.385320968676E-1,-9.903579444511E-1,0.E0)); +#9167=VECTOR('',#9166,3.007723688040E-1); +#9168=CARTESIAN_POINT('',(-1.496105373103E0,3.947023232105E0,-4.E-2)); +#9169=LINE('',#9168,#9167); +#9171=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9172=PRESENTATION_STYLE_ASSIGNMENT((#9171)); +#9173=STYLED_ITEM('',(#9172),#9170); +#9175=DIRECTION('',(0.E0,-1.E0,0.E0)); +#9176=VECTOR('',#9175,2.978723049164E-1); +#9177=CARTESIAN_POINT('',(-1.537772000033E0,3.649150927189E0,-4.E-2)); +#9178=LINE('',#9177,#9176); +#9180=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9181=PRESENTATION_STYLE_ASSIGNMENT((#9180)); +#9182=STYLED_ITEM('',(#9181),#9179); +#9184=DIRECTION('',(1.385320696791E-1,-9.903579482543E-1,0.E0)); +#9185=VECTOR('',#9184,3.007724278339E-1); +#9186=CARTESIAN_POINT('',(-1.537772000033E0,3.351278622273E0,-4.E-2)); +#9187=LINE('',#9186,#9185); +#9189=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9190=PRESENTATION_STYLE_ASSIGNMENT((#9189)); +#9191=STYLED_ITEM('',(#9190),#9188); +#9193=DIRECTION('',(3.646920423907E-1,-9.311281942981E-1,0.E0)); +#9194=VECTOR('',#9193,2.285034039226E-1); +#9195=CARTESIAN_POINT('',(-1.496105373103E0,3.053406257751E0,-4.E-2)); +#9196=LINE('',#9195,#9194); +#9198=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9199=PRESENTATION_STYLE_ASSIGNMENT((#9198)); +#9200=STYLED_ITEM('',(#9199),#9197); +#9202=DIRECTION('',(5.919095150862E-1,-8.060044205527E-1,0.E0)); +#9203=VECTOR('',#9202,2.111809268378E-1); +#9204=CARTESIAN_POINT('',(-1.412772000033E0,2.840640295866E0,-4.E-2)); +#9205=LINE('',#9204,#9203); +#9207=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9208=PRESENTATION_STYLE_ASSIGNMENT((#9207)); +#9209=STYLED_ITEM('',(#9208),#9206); +#9211=DIRECTION('',(8.526534466288E-1,-5.224768893951E-1,0.E0)); +#9212=VECTOR('',#9211,2.443353438533E-1); +#9213=CARTESIAN_POINT('',(-1.287772000033E0,2.670427535298E0,-4.E-2)); +#9214=LINE('',#9213,#9212); +#9216=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9217=PRESENTATION_STYLE_ASSIGNMENT((#9216)); +#9218=STYLED_ITEM('',(#9217),#9215); +#9220=DIRECTION('',(9.797707133274E-1,-2.001233352361E-1,0.E0)); +#9221=VECTOR('',#9220,2.126348238786E-1); +#9222=CARTESIAN_POINT('',(-1.079438626963E0,2.542767964873E0,-4.E-2)); +#9223=LINE('',#9222,#9221); +#9225=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9226=PRESENTATION_STYLE_ASSIGNMENT((#9225)); +#9227=STYLED_ITEM('',(#9226),#9224); +#9229=DIRECTION('',(1.E0,0.E0,0.E0)); +#9230=VECTOR('',#9229,2.083332538605E-1); +#9231=CARTESIAN_POINT('',(-8.711052538936E-1,2.500214774731E0,-4.E-2)); +#9232=LINE('',#9231,#9230); +#9234=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9235=PRESENTATION_STYLE_ASSIGNMENT((#9234)); +#9236=STYLED_ITEM('',(#9235),#9233); +#9238=DIRECTION('',(9.797706908745E-1,2.001234451615E-1,0.E0)); +#9239=VECTOR('',#9238,2.126347070808E-1); +#9240=CARTESIAN_POINT('',(-6.627720000331E-1,2.500214774731E0,-4.E-2)); +#9241=LINE('',#9240,#9239); +#9243=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9244=PRESENTATION_STYLE_ASSIGNMENT((#9243)); +#9245=STYLED_ITEM('',(#9244),#9242); +#9247=DIRECTION('',(8.526535798146E-1,5.224766720432E-1,0.E0)); +#9248=VECTOR('',#9247,2.443354454975E-1); +#9249=CARTESIAN_POINT('',(-4.544387461726E-1,2.542767964873E0,-4.E-2)); +#9250=LINE('',#9249,#9248); +#9252=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9253=PRESENTATION_STYLE_ASSIGNMENT((#9252)); +#9254=STYLED_ITEM('',(#9253),#9251); +#9256=DIRECTION('',(5.919095150862E-1,8.060044205527E-1,0.E0)); +#9257=VECTOR('',#9256,2.111809268378E-1); +#9258=CARTESIAN_POINT('',(-2.461052538936E-1,2.670427535298E0,-4.E-2)); +#9259=LINE('',#9258,#9257); +#9261=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9262=PRESENTATION_STYLE_ASSIGNMENT((#9261)); +#9263=STYLED_ITEM('',(#9262),#9260); +#9265=DIRECTION('',(3.646915900803E-1,9.311283714530E-1,0.E0)); +#9266=VECTOR('',#9265,2.285033604480E-1); +#9267=CARTESIAN_POINT('',(-1.211052538936E-1,2.840640295866E0,-4.E-2)); +#9268=LINE('',#9267,#9266); +#9270=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9271=PRESENTATION_STYLE_ASSIGNMENT((#9270)); +#9272=STYLED_ITEM('',(#9271),#9269); +#9274=DIRECTION('',(0.E0,1.E0,0.E0)); +#9275=VECTOR('',#9274,2.127659916878E-1); +#9276=CARTESIAN_POINT('',(-3.777200003308E-2,3.053406257751E0,-4.E-2)); +#9277=LINE('',#9276,#9275); +#9279=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9280=PRESENTATION_STYLE_ASSIGNMENT((#9279)); +#9281=STYLED_ITEM('',(#9280),#9278); +#9283=DIRECTION('',(-3.646916343690E-1,9.311283541066E-1,0.E0)); +#9284=VECTOR('',#9283,2.285033326982E-1); +#9285=CARTESIAN_POINT('',(-3.777200003308E-2,3.266172249439E0,-4.E-2)); +#9286=LINE('',#9285,#9284); +#9288=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9289=PRESENTATION_STYLE_ASSIGNMENT((#9288)); +#9290=STYLED_ITEM('',(#9289),#9287); +#9293=DIRECTION('',(3.102804688813E-1,-9.506450602779E-1,0.E0)); +#9294=VECTOR('',#9293,1.342873635899E-1); +#9295=CARTESIAN_POINT('',(-2.877720000331E-1,3.351278622273E0,-4.E-2)); +#9296=LINE('',#9295,#9294); +#9298=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9299=PRESENTATION_STYLE_ASSIGNMENT((#9298)); +#9300=STYLED_ITEM('',(#9299),#9297); +#9302=DIRECTION('',(0.E0,-1.E0,0.E0)); +#9303=VECTOR('',#9302,1.276595592499E-1); +#9304=CARTESIAN_POINT('',(-2.461052538936E-1,3.223619003418E0,-4.E-2)); +#9305=LINE('',#9304,#9303); +#9307=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9308=PRESENTATION_STYLE_ASSIGNMENT((#9307)); +#9309=STYLED_ITEM('',(#9308),#9306); +#9311=DIRECTION('',(-3.102805998049E-1,-9.506450175458E-1,0.E0)); +#9312=VECTOR('',#9311,1.342873069271E-1); +#9313=CARTESIAN_POINT('',(-2.461052538936E-1,3.095959444168E0,-4.E-2)); +#9314=LINE('',#9313,#9312); +#9316=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9317=PRESENTATION_STYLE_ASSIGNMENT((#9316)); +#9318=STYLED_ITEM('',(#9317),#9315); +#9320=DIRECTION('',(-5.466220916090E-1,-8.373794175671E-1,0.E0)); +#9321=VECTOR('',#9320,1.524513098532E-1); +#9322=CARTESIAN_POINT('',(-2.877720000331E-1,2.968299884918E0,-4.E-2)); +#9323=LINE('',#9322,#9321); +#9325=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9326=PRESENTATION_STYLE_ASSIGNMENT((#9325)); +#9327=STYLED_ITEM('',(#9326),#9324); +#9329=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9330=VECTOR('',#9329,1.512220046714E-1); +#9331=CARTESIAN_POINT('',(-3.711052538936E-1,2.840640295866E0,-4.E-2)); +#9332=LINE('',#9331,#9330); +#9334=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9335=PRESENTATION_STYLE_ASSIGNMENT((#9334)); +#9336=STYLED_ITEM('',(#9335),#9333); +#9338=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9339=VECTOR('',#9338,1.320445897196E-1); +#9340=CARTESIAN_POINT('',(-4.961052538936E-1,2.755533923033E0,-4.E-2)); +#9341=LINE('',#9340,#9339); +#9343=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9344=PRESENTATION_STYLE_ASSIGNMENT((#9343)); +#9345=STYLED_ITEM('',(#9344),#9342); +#9347=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9348=VECTOR('',#9347,2.916667461395E-1); +#9349=CARTESIAN_POINT('',(-6.211052538936E-1,2.712980736616E0,-4.E-2)); +#9350=LINE('',#9349,#9348); +#9352=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9353=PRESENTATION_STYLE_ASSIGNMENT((#9352)); +#9354=STYLED_ITEM('',(#9353),#9351); +#9356=DIRECTION('',(-9.466499177700E-1,3.222637633772E-1,0.E0)); +#9357=VECTOR('',#9356,1.320445897196E-1); +#9358=CARTESIAN_POINT('',(-9.127720000331E-1,2.712980736616E0,-4.E-2)); +#9359=LINE('',#9358,#9357); +#9361=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9362=PRESENTATION_STYLE_ASSIGNMENT((#9361)); +#9363=STYLED_ITEM('',(#9362),#9360); +#9365=DIRECTION('',(-8.265992787996E-1,5.627909312417E-1,0.E0)); +#9366=VECTOR('',#9365,1.512220046714E-1); +#9367=CARTESIAN_POINT('',(-1.037772000033E0,2.755533923033E0,-4.E-2)); +#9368=LINE('',#9367,#9366); +#9370=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9371=PRESENTATION_STYLE_ASSIGNMENT((#9370)); +#9372=STYLED_ITEM('',(#9371),#9369); +#9374=DIRECTION('',(-5.466226399153E-1,8.373790596451E-1,0.E0)); +#9375=VECTOR('',#9374,1.524513750156E-1); +#9376=CARTESIAN_POINT('',(-1.162772000033E0,2.840640295866E0,-4.E-2)); +#9377=LINE('',#9376,#9375); +#9379=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9380=PRESENTATION_STYLE_ASSIGNMENT((#9379)); +#9381=STYLED_ITEM('',(#9380),#9378); +#9383=DIRECTION('',(-3.102797975506E-1,9.506452793929E-1,0.E0)); +#9384=VECTOR('',#9383,1.342872699388E-1); +#9385=CARTESIAN_POINT('',(-1.246105373103E0,2.968299884918E0,-4.E-2)); +#9386=LINE('',#9385,#9384); +#9388=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9389=PRESENTATION_STYLE_ASSIGNMENT((#9388)); +#9390=STYLED_ITEM('',(#9389),#9387); +#9392=DIRECTION('',(0.E0,1.E0,0.E0)); +#9393=VECTOR('',#9392,1.276595592499E-1); +#9394=CARTESIAN_POINT('',(-1.287772000033E0,3.095959444168E0,-4.E-2)); +#9395=LINE('',#9394,#9393); +#9397=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9398=PRESENTATION_STYLE_ASSIGNMENT((#9397)); +#9399=STYLED_ITEM('',(#9398),#9396); +#9401=DIRECTION('',(3.102796666273E-1,9.506453221247E-1,0.E0)); +#9402=VECTOR('',#9401,1.342873266017E-1); +#9403=CARTESIAN_POINT('',(-1.287772000033E0,3.223619003418E0,-4.E-2)); +#9404=LINE('',#9403,#9402); +#9406=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9407=PRESENTATION_STYLE_ASSIGNMENT((#9406)); +#9408=STYLED_ITEM('',(#9407),#9405); +#9410=DIRECTION('',(6.996250055017E-1,7.145102180353E-1,0.E0)); +#9411=VECTOR('',#9410,1.191114846017E-1); +#9412=CARTESIAN_POINT('',(-1.246105373103E0,3.351278622273E0,-4.E-2)); +#9413=LINE('',#9412,#9411); +#9415=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9416=PRESENTATION_STYLE_ASSIGNMENT((#9415)); +#9417=STYLED_ITEM('',(#9416),#9414); +#9419=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#9420=VECTOR('',#9419,1.512220046714E-1); +#9421=CARTESIAN_POINT('',(-1.162772000033E0,3.436384995106E0,-4.E-2)); +#9422=LINE('',#9421,#9420); +#9424=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9425=PRESENTATION_STYLE_ASSIGNMENT((#9424)); +#9426=STYLED_ITEM('',(#9425),#9423); +#9428=DIRECTION('',(9.466499177700E-1,3.222637633772E-1,0.E0)); +#9429=VECTOR('',#9428,1.320445897196E-1); +#9430=CARTESIAN_POINT('',(-1.037772000033E0,3.521491367939E0,-4.E-2)); +#9431=LINE('',#9430,#9429); +#9433=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9434=PRESENTATION_STYLE_ASSIGNMENT((#9433)); +#9435=STYLED_ITEM('',(#9434),#9432); +#9437=DIRECTION('',(1.E0,0.E0,0.E0)); +#9438=VECTOR('',#9437,2.916667461395E-1); +#9439=CARTESIAN_POINT('',(-9.127720000331E-1,3.564044554356E0,-4.E-2)); +#9440=LINE('',#9439,#9438); +#9442=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9443=PRESENTATION_STYLE_ASSIGNMENT((#9442)); +#9444=STYLED_ITEM('',(#9443),#9441); +#9446=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9447=VECTOR('',#9446,1.320445897196E-1); +#9448=CARTESIAN_POINT('',(-6.211052538936E-1,3.564044554356E0,-4.E-2)); +#9449=LINE('',#9448,#9447); +#9451=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9452=PRESENTATION_STYLE_ASSIGNMENT((#9451)); +#9453=STYLED_ITEM('',(#9452),#9450); +#9455=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9456=VECTOR('',#9455,1.512220046714E-1); +#9457=CARTESIAN_POINT('',(-4.961052538936E-1,3.521491367939E0,-4.E-2)); +#9458=LINE('',#9457,#9456); +#9460=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9461=PRESENTATION_STYLE_ASSIGNMENT((#9460)); +#9462=STYLED_ITEM('',(#9461),#9459); +#9464=DIRECTION('',(6.996244945571E-1,-7.145107183351E-1,0.E0)); +#9465=VECTOR('',#9464,1.191114011999E-1); +#9466=CARTESIAN_POINT('',(-3.711052538936E-1,3.436384995106E0,-4.E-2)); +#9467=LINE('',#9466,#9465); +#9469=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9470=PRESENTATION_STYLE_ASSIGNMENT((#9469)); +#9471=STYLED_ITEM('',(#9470),#9468); +#9474=DIRECTION('',(3.102789298341E-1,-9.506455626052E-1,0.E0)); +#9475=VECTOR('',#9474,1.342872612821E-1); +#9476=CARTESIAN_POINT('',(3.788947461064E-1,2.968299884918E0,-4.E-2)); +#9477=LINE('',#9476,#9475); +#9479=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9480=PRESENTATION_STYLE_ASSIGNMENT((#9479)); +#9481=STYLED_ITEM('',(#9480),#9478); +#9483=DIRECTION('',(5.919095150862E-1,-8.060044205527E-1,0.E0)); +#9484=VECTOR('',#9483,2.111809268378E-1); +#9485=CARTESIAN_POINT('',(4.205612538274E-1,2.840640295866E0,-4.E-2)); +#9486=LINE('',#9485,#9484); +#9488=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9489=PRESENTATION_STYLE_ASSIGNMENT((#9488)); +#9490=STYLED_ITEM('',(#9489),#9487); +#9492=DIRECTION('',(8.526535798146E-1,-5.224766720432E-1,0.E0)); +#9493=VECTOR('',#9492,2.443354454975E-1); +#9494=CARTESIAN_POINT('',(5.455612538274E-1,2.670427535298E0,-4.E-2)); +#9495=LINE('',#9494,#9493); +#9497=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9498=PRESENTATION_STYLE_ASSIGNMENT((#9497)); +#9499=STYLED_ITEM('',(#9498),#9496); +#9501=DIRECTION('',(9.797706908745E-1,-2.001234451615E-1,0.E0)); +#9502=VECTOR('',#9501,2.126347070808E-1); +#9503=CARTESIAN_POINT('',(7.538947461064E-1,2.542767964873E0,-4.E-2)); +#9504=LINE('',#9503,#9502); +#9506=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9507=PRESENTATION_STYLE_ASSIGNMENT((#9506)); +#9508=STYLED_ITEM('',(#9507),#9505); +#9510=DIRECTION('',(1.E0,0.E0,0.E0)); +#9511=VECTOR('',#9510,1.666665077209E-1); +#9512=CARTESIAN_POINT('',(9.622279999669E-1,2.500214774731E0,-4.E-2)); +#9513=LINE('',#9512,#9511); +#9515=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9516=PRESENTATION_STYLE_ASSIGNMENT((#9515)); +#9517=STYLED_ITEM('',(#9516),#9514); +#9519=DIRECTION('',(9.797707357802E-1,2.001232253108E-1,0.E0)); +#9520=VECTOR('',#9519,2.126349406764E-1); +#9521=CARTESIAN_POINT('',(1.128894507688E0,2.500214774731E0,-4.E-2)); +#9522=LINE('',#9521,#9520); +#9524=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9525=PRESENTATION_STYLE_ASSIGNMENT((#9524)); +#9526=STYLED_ITEM('',(#9525),#9523); +#9528=DIRECTION('',(8.526535798146E-1,5.224766720432E-1,0.E0)); +#9529=VECTOR('',#9528,2.443354454975E-1); +#9530=CARTESIAN_POINT('',(1.337227999967E0,2.542767964873E0,-4.E-2)); +#9531=LINE('',#9530,#9529); +#9533=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9534=PRESENTATION_STYLE_ASSIGNMENT((#9533)); +#9535=STYLED_ITEM('',(#9534),#9532); +#9537=DIRECTION('',(5.919095150862E-1,8.060044205527E-1,0.E0)); +#9538=VECTOR('',#9537,2.111809268378E-1); +#9539=CARTESIAN_POINT('',(1.545561492246E0,2.670427535298E0,-4.E-2)); +#9540=LINE('',#9539,#9538); +#9542=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9543=PRESENTATION_STYLE_ASSIGNMENT((#9542)); +#9544=STYLED_ITEM('',(#9543),#9541); +#9546=DIRECTION('',(3.646906854589E-1,9.311287257622E-1,0.E0)); +#9547=VECTOR('',#9546,2.285032734988E-1); +#9548=CARTESIAN_POINT('',(1.670561492246E0,2.840640295866E0,-4.E-2)); +#9549=LINE('',#9548,#9547); +#9551=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9552=PRESENTATION_STYLE_ASSIGNMENT((#9551)); +#9553=STYLED_ITEM('',(#9552),#9550); +#9555=DIRECTION('',(1.385332358914E-1,9.903577851229E-1,0.E0)); +#9556=VECTOR('',#9555,3.007724773770E-1); +#9557=CARTESIAN_POINT('',(1.753894507688E0,3.053406257751E0,-4.E-2)); +#9558=LINE('',#9557,#9556); +#9560=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9561=PRESENTATION_STYLE_ASSIGNMENT((#9560)); +#9562=STYLED_ITEM('',(#9561),#9559); +#9564=DIRECTION('',(0.E0,1.E0,0.E0)); +#9565=VECTOR('',#9564,2.978723049164E-1); +#9566=CARTESIAN_POINT('',(1.795561492246E0,3.351278622273E0,-4.E-2)); +#9567=LINE('',#9566,#9565); +#9569=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9570=PRESENTATION_STYLE_ASSIGNMENT((#9569)); +#9571=STYLED_ITEM('',(#9570),#9568); +#9573=DIRECTION('',(-1.385332630801E-1,9.903577813197E-1,0.E0)); +#9574=VECTOR('',#9573,3.007724183471E-1); +#9575=CARTESIAN_POINT('',(1.795561492246E0,3.649150927189E0,-4.E-2)); +#9576=LINE('',#9575,#9574); +#9578=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9579=PRESENTATION_STYLE_ASSIGNMENT((#9578)); +#9580=STYLED_ITEM('',(#9579),#9577); +#9582=DIRECTION('',(-3.646905525931E-1,9.311287778011E-1,0.E0)); +#9583=VECTOR('',#9582,2.285033567482E-1); +#9584=CARTESIAN_POINT('',(1.753894507688E0,3.947023232105E0,-4.E-2)); +#9585=LINE('',#9584,#9583); +#9587=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9588=PRESENTATION_STYLE_ASSIGNMENT((#9587)); +#9589=STYLED_ITEM('',(#9588),#9586); +#9591=DIRECTION('',(-5.919095487496E-1,8.060043958311E-1,0.E0)); +#9592=VECTOR('',#9591,2.111809148274E-1); +#9593=CARTESIAN_POINT('',(1.670561492246E0,4.159789283398E0,-4.E-2)); +#9594=LINE('',#9593,#9592); +#9596=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9597=PRESENTATION_STYLE_ASSIGNMENT((#9596)); +#9598=STYLED_ITEM('',(#9597),#9595); +#9600=DIRECTION('',(-8.526536001913E-1,5.224766387895E-1,0.E0)); +#9601=VECTOR('',#9600,2.443354396584E-1); +#9602=CARTESIAN_POINT('',(1.545561492246E0,4.330002029064E0,-4.E-2)); +#9603=LINE('',#9602,#9601); +#9605=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9606=PRESENTATION_STYLE_ASSIGNMENT((#9605)); +#9607=STYLED_ITEM('',(#9606),#9604); +#9609=DIRECTION('',(-9.797707392153E-1,2.001232084928E-1,0.E0)); +#9610=VECTOR('',#9609,2.126349399308E-1); +#9611=CARTESIAN_POINT('',(1.337227999967E0,4.457661588314E0,-4.E-2)); +#9612=LINE('',#9611,#9610); +#9614=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9615=PRESENTATION_STYLE_ASSIGNMENT((#9614)); +#9616=STYLED_ITEM('',(#9615),#9613); +#9618=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9619=VECTOR('',#9618,2.083332538605E-1); +#9620=CARTESIAN_POINT('',(1.128894507688E0,4.500214774731E0,-4.E-2)); +#9621=LINE('',#9620,#9619); +#9623=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9624=PRESENTATION_STYLE_ASSIGNMENT((#9623)); +#9625=STYLED_ITEM('',(#9624),#9622); +#9627=DIRECTION('',(-9.797706943097E-1,-2.001234283435E-1,0.E0)); +#9628=VECTOR('',#9627,2.126347063353E-1); +#9629=CARTESIAN_POINT('',(9.205612538274E-1,4.500214774731E0,-4.E-2)); +#9630=LINE('',#9629,#9628); +#9632=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9633=PRESENTATION_STYLE_ASSIGNMENT((#9632)); +#9634=STYLED_ITEM('',(#9633),#9631); +#9636=DIRECTION('',(-8.526533338197E-1,-5.224770734933E-1,0.E0)); +#9637=VECTOR('',#9636,2.443352363700E-1); +#9638=CARTESIAN_POINT('',(7.122279999669E-1,4.457661588314E0,-4.E-2)); +#9639=LINE('',#9638,#9637); +#9641=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9642=PRESENTATION_STYLE_ASSIGNMENT((#9641)); +#9643=STYLED_ITEM('',(#9642),#9640); +#9645=DIRECTION('',(-5.919095487496E-1,-8.060043958311E-1,0.E0)); +#9646=VECTOR('',#9645,2.111809148274E-1); +#9647=CARTESIAN_POINT('',(5.038947461064E-1,4.330002029064E0,-4.E-2)); +#9648=LINE('',#9647,#9646); +#9650=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9651=PRESENTATION_STYLE_ASSIGNMENT((#9650)); +#9652=STYLED_ITEM('',(#9651),#9649); +#9654=DIRECTION('',(-3.646923618345E-1,-9.311280691825E-1,0.E0)); +#9655=VECTOR('',#9654,2.285035306467E-1); +#9656=CARTESIAN_POINT('',(3.788947461064E-1,4.159789283398E0,-4.E-2)); +#9657=LINE('',#9656,#9655); +#9659=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9660=PRESENTATION_STYLE_ASSIGNMENT((#9659)); +#9661=STYLED_ITEM('',(#9660),#9658); +#9663=DIRECTION('',(0.E0,-1.E0,0.E0)); +#9664=VECTOR('',#9663,1.702127456665E-1); +#9665=CARTESIAN_POINT('',(2.955612538274E-1,3.947023232105E0,-4.E-2)); +#9666=LINE('',#9665,#9664); +#9668=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9669=PRESENTATION_STYLE_ASSIGNMENT((#9668)); +#9670=STYLED_ITEM('',(#9669),#9667); +#9672=DIRECTION('',(3.646925389895E-1,-9.311279997967E-1,0.E0)); +#9673=VECTOR('',#9672,2.285034196476E-1); +#9674=CARTESIAN_POINT('',(2.955612538274E-1,3.776810486439E0,-4.E-2)); +#9675=LINE('',#9674,#9673); +#9677=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9678=PRESENTATION_STYLE_ASSIGNMENT((#9677)); +#9679=STYLED_ITEM('',(#9678),#9676); +#9681=DIRECTION('',(5.919095487496E-1,-8.060043958311E-1,0.E0)); +#9682=VECTOR('',#9681,2.111809148274E-1); +#9683=CARTESIAN_POINT('',(3.788947461064E-1,3.564044554356E0,-4.E-2)); +#9684=LINE('',#9683,#9682); +#9686=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9687=PRESENTATION_STYLE_ASSIGNMENT((#9686)); +#9688=STYLED_ITEM('',(#9687),#9685); +#9690=DIRECTION('',(8.526533338197E-1,-5.224770734933E-1,0.E0)); +#9691=VECTOR('',#9690,2.443352363700E-1); +#9692=CARTESIAN_POINT('',(5.038947461064E-1,3.393831808689E0,-4.E-2)); +#9693=LINE('',#9692,#9691); +#9695=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9696=PRESENTATION_STYLE_ASSIGNMENT((#9695)); +#9697=STYLED_ITEM('',(#9696),#9694); +#9699=DIRECTION('',(9.797706393469E-1,-2.001236974318E-1,0.E0)); +#9700=VECTOR('',#9699,2.126347182636E-1); +#9701=CARTESIAN_POINT('',(7.122279999669E-1,3.266172249439E0,-4.E-2)); +#9702=LINE('',#9701,#9700); +#9704=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9705=PRESENTATION_STYLE_ASSIGNMENT((#9704)); +#9706=STYLED_ITEM('',(#9705),#9703); +#9708=DIRECTION('',(1.E0,0.E0,0.E0)); +#9709=VECTOR('',#9708,2.083332538605E-1); +#9710=CARTESIAN_POINT('',(9.205612538274E-1,3.223619003418E0,-4.E-2)); +#9711=LINE('',#9710,#9709); +#9713=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9714=PRESENTATION_STYLE_ASSIGNMENT((#9713)); +#9715=STYLED_ITEM('',(#9714),#9712); +#9717=DIRECTION('',(9.797706842527E-1,2.001234775808E-1,0.E0)); +#9718=VECTOR('',#9717,2.126349518591E-1); +#9719=CARTESIAN_POINT('',(1.128894507688E0,3.223619003418E0,-4.E-2)); +#9720=LINE('',#9719,#9718); +#9722=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9723=PRESENTATION_STYLE_ASSIGNMENT((#9722)); +#9724=STYLED_ITEM('',(#9723),#9721); +#9726=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#9727=VECTOR('',#9726,3.024440093428E-1); +#9728=CARTESIAN_POINT('',(1.337227999967E0,3.266172249439E0,-4.E-2)); +#9729=LINE('',#9728,#9727); +#9731=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9732=PRESENTATION_STYLE_ASSIGNMENT((#9731)); +#9733=STYLED_ITEM('',(#9732),#9730); +#9735=DIRECTION('',(0.E0,-1.E0,0.E0)); +#9736=VECTOR('',#9735,8.510637283325E-2); +#9737=CARTESIAN_POINT('',(1.587227999967E0,3.436384995106E0,-4.E-2)); +#9738=LINE('',#9737,#9736); +#9740=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9741=PRESENTATION_STYLE_ASSIGNMENT((#9740)); +#9742=STYLED_ITEM('',(#9741),#9739); +#9744=DIRECTION('',(-1.610631614123E-1,-9.869441007655E-1,0.E0)); +#9745=VECTOR('',#9744,2.586966961010E-1); +#9746=CARTESIAN_POINT('',(1.587227999967E0,3.351278622273E0,-4.E-2)); +#9747=LINE('',#9746,#9745); +#9749=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9750=PRESENTATION_STYLE_ASSIGNMENT((#9749)); +#9751=STYLED_ITEM('',(#9750),#9748); +#9753=DIRECTION('',(-3.102822043116E-1,-9.506444938501E-1,0.E0)); +#9754=VECTOR('',#9753,1.342873809039E-1); +#9755=CARTESIAN_POINT('',(1.545561492246E0,3.095959444168E0,-4.E-2)); +#9756=LINE('',#9755,#9754); +#9758=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9759=PRESENTATION_STYLE_ASSIGNMENT((#9758)); +#9760=STYLED_ITEM('',(#9759),#9757); +#9762=DIRECTION('',(-5.466209949943E-1,-8.373801334110E-1,0.E0)); +#9763=VECTOR('',#9762,1.524511795285E-1); +#9764=CARTESIAN_POINT('',(1.503894507688E0,2.968299884918E0,-4.E-2)); +#9765=LINE('',#9764,#9763); +#9767=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9768=PRESENTATION_STYLE_ASSIGNMENT((#9767)); +#9769=STYLED_ITEM('',(#9768),#9766); +#9771=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9772=VECTOR('',#9771,1.512220046714E-1); +#9773=CARTESIAN_POINT('',(1.420561492246E0,2.840640295866E0,-4.E-2)); +#9774=LINE('',#9773,#9772); +#9776=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9777=PRESENTATION_STYLE_ASSIGNMENT((#9776)); +#9778=STYLED_ITEM('',(#9777),#9775); +#9780=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9781=VECTOR('',#9780,1.320445897196E-1); +#9782=CARTESIAN_POINT('',(1.295561492246E0,2.755533923033E0,-4.E-2)); +#9783=LINE('',#9782,#9781); +#9785=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9786=PRESENTATION_STYLE_ASSIGNMENT((#9785)); +#9787=STYLED_ITEM('',(#9786),#9784); +#9789=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9790=VECTOR('',#9789,2.500002384186E-1); +#9791=CARTESIAN_POINT('',(1.170561492246E0,2.712980736616E0,-4.E-2)); +#9792=LINE('',#9791,#9790); +#9794=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9795=PRESENTATION_STYLE_ASSIGNMENT((#9794)); +#9796=STYLED_ITEM('',(#9795),#9793); +#9798=DIRECTION('',(-9.466499177700E-1,3.222637633772E-1,0.E0)); +#9799=VECTOR('',#9798,1.320445897196E-1); +#9800=CARTESIAN_POINT('',(9.205612538274E-1,2.712980736616E0,-4.E-2)); +#9801=LINE('',#9800,#9799); +#9803=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9804=PRESENTATION_STYLE_ASSIGNMENT((#9803)); +#9805=STYLED_ITEM('',(#9804),#9802); +#9807=DIRECTION('',(-8.265992787996E-1,5.627909312417E-1,0.E0)); +#9808=VECTOR('',#9807,1.512220046714E-1); +#9809=CARTESIAN_POINT('',(7.955612538274E-1,2.755533923033E0,-4.E-2)); +#9810=LINE('',#9809,#9808); +#9812=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9813=PRESENTATION_STYLE_ASSIGNMENT((#9812)); +#9814=STYLED_ITEM('',(#9813),#9811); +#9816=DIRECTION('',(-5.466220916090E-1,8.373794175671E-1,0.E0)); +#9817=VECTOR('',#9816,1.524513098532E-1); +#9818=CARTESIAN_POINT('',(6.705612538274E-1,2.840640295866E0,-4.E-2)); +#9819=LINE('',#9818,#9817); +#9821=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9822=PRESENTATION_STYLE_ASSIGNMENT((#9821)); +#9823=STYLED_ITEM('',(#9822),#9820); +#9825=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9826=VECTOR('',#9825,2.083332538605E-1); +#9827=CARTESIAN_POINT('',(5.872279999669E-1,2.968299884918E0,-4.E-2)); +#9828=LINE('',#9827,#9826); +#9830=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9831=PRESENTATION_STYLE_ASSIGNMENT((#9830)); +#9832=STYLED_ITEM('',(#9831),#9829); +#9835=DIRECTION('',(-3.102822043116E-1,-9.506444938501E-1,0.E0)); +#9836=VECTOR('',#9835,1.342873809039E-1); +#9837=CARTESIAN_POINT('',(1.545561492246E0,3.819363672855E0,-4.E-2)); +#9838=LINE('',#9837,#9836); +#9840=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9841=PRESENTATION_STYLE_ASSIGNMENT((#9840)); +#9842=STYLED_ITEM('',(#9841),#9839); +#9844=DIRECTION('',(-5.466210844748E-1,-8.373800750004E-1,0.E0)); +#9845=VECTOR('',#9844,1.524511545726E-1); +#9846=CARTESIAN_POINT('',(1.503894507688E0,3.691704113606E0,-4.E-2)); +#9847=LINE('',#9846,#9845); +#9849=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9850=PRESENTATION_STYLE_ASSIGNMENT((#9849)); +#9851=STYLED_ITEM('',(#9850),#9848); +#9853=DIRECTION('',(-8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9854=VECTOR('',#9853,1.512220046714E-1); +#9855=CARTESIAN_POINT('',(1.420561492246E0,3.564044554356E0,-4.E-2)); +#9856=LINE('',#9855,#9854); +#9858=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9859=PRESENTATION_STYLE_ASSIGNMENT((#9858)); +#9860=STYLED_ITEM('',(#9859),#9857); +#9862=DIRECTION('',(-9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9863=VECTOR('',#9862,1.320445897196E-1); +#9864=CARTESIAN_POINT('',(1.295561492246E0,3.478938181522E0,-4.E-2)); +#9865=LINE('',#9864,#9863); +#9867=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9868=PRESENTATION_STYLE_ASSIGNMENT((#9867)); +#9869=STYLED_ITEM('',(#9868),#9866); +#9871=DIRECTION('',(-1.E0,0.E0,0.E0)); +#9872=VECTOR('',#9871,2.916667461395E-1); +#9873=CARTESIAN_POINT('',(1.170561492246E0,3.436384995106E0,-4.E-2)); +#9874=LINE('',#9873,#9872); +#9876=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9877=PRESENTATION_STYLE_ASSIGNMENT((#9876)); +#9878=STYLED_ITEM('',(#9877),#9875); +#9880=DIRECTION('',(-9.466499177700E-1,3.222637633772E-1,0.E0)); +#9881=VECTOR('',#9880,1.320445897196E-1); +#9882=CARTESIAN_POINT('',(8.788947461064E-1,3.436384995106E0,-4.E-2)); +#9883=LINE('',#9882,#9881); +#9885=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9886=PRESENTATION_STYLE_ASSIGNMENT((#9885)); +#9887=STYLED_ITEM('',(#9886),#9884); +#9889=DIRECTION('',(-8.265992787996E-1,5.627909312417E-1,0.E0)); +#9890=VECTOR('',#9889,1.512220046714E-1); +#9891=CARTESIAN_POINT('',(7.538947461064E-1,3.478938181522E0,-4.E-2)); +#9892=LINE('',#9891,#9890); +#9894=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9895=PRESENTATION_STYLE_ASSIGNMENT((#9894)); +#9896=STYLED_ITEM('',(#9895),#9893); +#9898=DIRECTION('',(-5.466232777014E-1,8.373786433120E-1,0.E0)); +#9899=VECTOR('',#9898,1.524514152223E-1); +#9900=CARTESIAN_POINT('',(6.288947461064E-1,3.564044554356E0,-4.E-2)); +#9901=LINE('',#9900,#9899); +#9903=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9904=PRESENTATION_STYLE_ASSIGNMENT((#9903)); +#9905=STYLED_ITEM('',(#9904),#9902); +#9907=DIRECTION('',(-3.102789952956E-1,9.506455412394E-1,0.E0)); +#9908=VECTOR('',#9907,1.342872329506E-1); +#9909=CARTESIAN_POINT('',(5.455612538274E-1,3.691704113606E0,-4.E-2)); +#9910=LINE('',#9909,#9908); +#9912=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9913=PRESENTATION_STYLE_ASSIGNMENT((#9912)); +#9914=STYLED_ITEM('',(#9913),#9911); +#9916=DIRECTION('',(0.E0,1.E0,0.E0)); +#9917=VECTOR('',#9916,8.510637283325E-2); +#9918=CARTESIAN_POINT('',(5.038947461064E-1,3.819363672855E0,-4.E-2)); +#9919=LINE('',#9918,#9917); +#9921=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9922=PRESENTATION_STYLE_ASSIGNMENT((#9921)); +#9923=STYLED_ITEM('',(#9922),#9920); +#9925=DIRECTION('',(3.102787334496E-1,9.506456267027E-1,0.E0)); +#9926=VECTOR('',#9925,1.342873462764E-1); +#9927=CARTESIAN_POINT('',(5.038947461064E-1,3.904470045689E0,-4.E-2)); +#9928=LINE('',#9927,#9926); +#9930=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9931=PRESENTATION_STYLE_ASSIGNMENT((#9930)); +#9932=STYLED_ITEM('',(#9931),#9929); +#9934=DIRECTION('',(5.466232777014E-1,8.373786433120E-1,0.E0)); +#9935=VECTOR('',#9934,1.524514152223E-1); +#9936=CARTESIAN_POINT('',(5.455612538274E-1,4.032129724148E0,-4.E-2)); +#9937=LINE('',#9936,#9935); +#9939=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9940=PRESENTATION_STYLE_ASSIGNMENT((#9939)); +#9941=STYLED_ITEM('',(#9940),#9938); +#9943=DIRECTION('',(8.265992787996E-1,5.627909312417E-1,0.E0)); +#9944=VECTOR('',#9943,1.512220046714E-1); +#9945=CARTESIAN_POINT('',(6.288947461064E-1,4.159789283398E0,-4.E-2)); +#9946=LINE('',#9945,#9944); +#9948=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9949=PRESENTATION_STYLE_ASSIGNMENT((#9948)); +#9950=STYLED_ITEM('',(#9949),#9947); +#9952=DIRECTION('',(9.466499177700E-1,3.222637633772E-1,0.E0)); +#9953=VECTOR('',#9952,1.320445897196E-1); +#9954=CARTESIAN_POINT('',(7.538947461064E-1,4.244895656231E0,-4.E-2)); +#9955=LINE('',#9954,#9953); +#9957=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9958=PRESENTATION_STYLE_ASSIGNMENT((#9957)); +#9959=STYLED_ITEM('',(#9958),#9956); +#9961=DIRECTION('',(1.E0,0.E0,0.E0)); +#9962=VECTOR('',#9961,2.916667461395E-1); +#9963=CARTESIAN_POINT('',(8.788947461064E-1,4.287448842648E0,-4.E-2)); +#9964=LINE('',#9963,#9962); +#9966=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9967=PRESENTATION_STYLE_ASSIGNMENT((#9966)); +#9968=STYLED_ITEM('',(#9967),#9965); +#9970=DIRECTION('',(9.466499177700E-1,-3.222637633772E-1,0.E0)); +#9971=VECTOR('',#9970,1.320445897196E-1); +#9972=CARTESIAN_POINT('',(1.170561492246E0,4.287448842648E0,-4.E-2)); +#9973=LINE('',#9972,#9971); +#9975=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9976=PRESENTATION_STYLE_ASSIGNMENT((#9975)); +#9977=STYLED_ITEM('',(#9976),#9974); +#9979=DIRECTION('',(8.265992787996E-1,-5.627909312417E-1,0.E0)); +#9980=VECTOR('',#9979,1.512220046714E-1); +#9981=CARTESIAN_POINT('',(1.295561492246E0,4.244895656231E0,-4.E-2)); +#9982=LINE('',#9981,#9980); +#9984=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9985=PRESENTATION_STYLE_ASSIGNMENT((#9984)); +#9986=STYLED_ITEM('',(#9985),#9983); +#9988=DIRECTION('',(5.466210844748E-1,-8.373800750004E-1,0.E0)); +#9989=VECTOR('',#9988,1.524511545726E-1); +#9990=CARTESIAN_POINT('',(1.420561492246E0,4.159789283398E0,-4.E-2)); +#9991=LINE('',#9990,#9989); +#9993=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#9994=PRESENTATION_STYLE_ASSIGNMENT((#9993)); +#9995=STYLED_ITEM('',(#9994),#9992); +#9997=DIRECTION('',(3.102819424634E-1,-9.506445793151E-1,0.E0)); +#9998=VECTOR('',#9997,1.342874942296E-1); +#9999=CARTESIAN_POINT('',(1.503894507688E0,4.032129724148E0,-4.E-2)); +#10000=LINE('',#9999,#9998); +#10002=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10003=PRESENTATION_STYLE_ASSIGNMENT((#10002)); +#10004=STYLED_ITEM('',(#10003),#10001); +#10006=DIRECTION('',(0.E0,-1.E0,0.E0)); +#10007=VECTOR('',#10006,8.510637283325E-2); +#10008=CARTESIAN_POINT('',(1.545561492246E0,3.904470045689E0,-4.E-2)); +#10009=LINE('',#10008,#10007); +#10011=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10012=PRESENTATION_STYLE_ASSIGNMENT((#10011)); +#10013=STYLED_ITEM('',(#10012),#10010); +#10016=DIRECTION('',(4.882865230919E-1,8.726833740635E-1,0.E0)); +#10017=VECTOR('',#10016,3.413293216974E-1); +#10018=CARTESIAN_POINT('',(2.337227999967E0,3.776810486439E0,-4.E-2)); +#10019=LINE('',#10018,#10017); +#10021=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10022=PRESENTATION_STYLE_ASSIGNMENT((#10021)); +#10023=STYLED_ITEM('',(#10022),#10020); +#10025=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10026=VECTOR('',#10025,2.083330154419E-1); +#10027=CARTESIAN_POINT('',(2.503894507688E0,4.074682910564E0,-4.E-2)); +#10028=LINE('',#10027,#10026); +#10030=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10031=PRESENTATION_STYLE_ASSIGNMENT((#10030)); +#10032=STYLED_ITEM('',(#10031),#10029); +#10034=DIRECTION('',(-4.882875870131E-1,-8.726827787741E-1,0.E0)); +#10035=VECTOR('',#10034,3.413295545308E-1); +#10036=CARTESIAN_POINT('',(2.295561492246E0,4.074682910564E0,-4.E-2)); +#10037=LINE('',#10036,#10035); +#10039=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10040=PRESENTATION_STYLE_ASSIGNMENT((#10039)); +#10041=STYLED_ITEM('',(#10040),#10038); +#10043=DIRECTION('',(1.E0,0.E0,0.E0)); +#10044=VECTOR('',#10043,2.083334922791E-1); +#10045=CARTESIAN_POINT('',(2.128894507688E0,3.776810486439E0,-4.E-2)); +#10046=LINE('',#10045,#10044); +#10048=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10049=PRESENTATION_STYLE_ASSIGNMENT((#10048)); +#10050=STYLED_ITEM('',(#10049),#10047); +#10053=DIRECTION('',(4.882865230919E-1,8.726833740635E-1,0.E0)); +#10054=VECTOR('',#10053,3.413293216974E-1); +#10055=CARTESIAN_POINT('',(2.837227999967E0,3.776810486439E0,-4.E-2)); +#10056=LINE('',#10055,#10054); +#10058=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10059=PRESENTATION_STYLE_ASSIGNMENT((#10058)); +#10060=STYLED_ITEM('',(#10059),#10057); +#10062=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10063=VECTOR('',#10062,2.083330154419E-1); +#10064=CARTESIAN_POINT('',(3.003894507688E0,4.074682910564E0,-4.E-2)); +#10065=LINE('',#10064,#10063); +#10067=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10068=PRESENTATION_STYLE_ASSIGNMENT((#10067)); +#10069=STYLED_ITEM('',(#10068),#10066); +#10071=DIRECTION('',(-4.882875870131E-1,-8.726827787741E-1,0.E0)); +#10072=VECTOR('',#10071,3.413295545308E-1); +#10073=CARTESIAN_POINT('',(2.795561492246E0,4.074682910564E0,-4.E-2)); +#10074=LINE('',#10073,#10072); +#10076=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10077=PRESENTATION_STYLE_ASSIGNMENT((#10076)); +#10078=STYLED_ITEM('',(#10077),#10075); +#10080=DIRECTION('',(1.E0,0.E0,0.E0)); +#10081=VECTOR('',#10080,2.083334922791E-1); +#10082=CARTESIAN_POINT('',(2.628894507688E0,3.776810486439E0,-4.E-2)); +#10083=LINE('',#10082,#10081); +#10085=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10086=PRESENTATION_STYLE_ASSIGNMENT((#10085)); +#10087=STYLED_ITEM('',(#10086),#10084); +#10090=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10091=VECTOR('',#10090,3.333333134651E-1); +#10092=CARTESIAN_POINT('',(-1.912772000033E0,-5.811822042987E0,-4.E-2)); +#10093=LINE('',#10092,#10091); +#10095=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10096=PRESENTATION_STYLE_ASSIGNMENT((#10095)); +#10097=STYLED_ITEM('',(#10096),#10094); +#10099=DIRECTION('',(-3.162277744987E-1,-9.486832952232E-1,0.E0)); +#10100=VECTOR('',#10099,2.108185113062E0); +#10101=CARTESIAN_POINT('',(-2.246105313498E0,-5.811822042987E0,-4.E-2)); +#10102=LINE('',#10101,#10100); +#10104=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10105=PRESENTATION_STYLE_ASSIGNMENT((#10104)); +#10106=STYLED_ITEM('',(#10105),#10103); +#10108=DIRECTION('',(1.E0,0.E0,0.E0)); +#10109=VECTOR('',#10108,2.5E-1); +#10110=CARTESIAN_POINT('',(-2.912772000033E0,-7.811822042987E0,-4.E-2)); +#10111=LINE('',#10110,#10109); +#10113=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10114=PRESENTATION_STYLE_ASSIGNMENT((#10113)); +#10115=STYLED_ITEM('',(#10114),#10112); +#10117=DIRECTION('',(3.102800155243E-1,9.506452082487E-1,0.E0)); +#10118=VECTOR('',#10117,5.371491826534E-1); +#10119=CARTESIAN_POINT('',(-2.662772000033E0,-7.811822042987E0,-4.E-2)); +#10120=LINE('',#10119,#10118); +#10122=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10123=PRESENTATION_STYLE_ASSIGNMENT((#10122)); +#10124=STYLED_ITEM('',(#10123),#10121); +#10126=DIRECTION('',(1.E0,0.E0,0.E0)); +#10127=VECTOR('',#10126,8.333333432674E-1); +#10128=CARTESIAN_POINT('',(-2.496105343301E0,-7.301183746383E0,-4.E-2)); +#10129=LINE('',#10128,#10127); +#10131=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10132=PRESENTATION_STYLE_ASSIGNMENT((#10131)); +#10133=STYLED_ITEM('',(#10132),#10130); +#10135=DIRECTION('',(3.102799653834E-1,-9.506452246141E-1,0.E0)); +#10136=VECTOR('',#10135,5.371491734063E-1); +#10137=CARTESIAN_POINT('',(-1.662772000033E0,-7.301183746383E0,-4.E-2)); +#10138=LINE('',#10137,#10136); +#10140=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10141=PRESENTATION_STYLE_ASSIGNMENT((#10140)); +#10142=STYLED_ITEM('',(#10141),#10139); +#10144=DIRECTION('',(1.E0,0.E0,0.E0)); +#10145=VECTOR('',#10144,2.5E-1); +#10146=CARTESIAN_POINT('',(-1.496105373103E0,-7.811822042987E0,-4.E-2)); +#10147=LINE('',#10146,#10145); +#10149=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10150=PRESENTATION_STYLE_ASSIGNMENT((#10149)); +#10151=STYLED_ITEM('',(#10150),#10148); +#10153=DIRECTION('',(-3.162277490531E-1,9.486833037051E-1,0.E0)); +#10154=VECTOR('',#10153,2.108185094213E0); +#10155=CARTESIAN_POINT('',(-1.246105373103E0,-7.811822042987E0,-4.E-2)); +#10156=LINE('',#10155,#10154); +#10158=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10159=PRESENTATION_STYLE_ASSIGNMENT((#10158)); +#10160=STYLED_ITEM('',(#10159),#10157); +#10163=DIRECTION('',(3.102800658973E-1,-9.506451918075E-1,0.E0)); +#10164=VECTOR('',#10163,1.208585728897E0); +#10165=CARTESIAN_POINT('',(-2.079438686568E0,-5.982034788653E0,-4.E-2)); +#10166=LINE('',#10165,#10164); +#10168=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10169=PRESENTATION_STYLE_ASSIGNMENT((#10168)); +#10170=STYLED_ITEM('',(#10169),#10167); +#10172=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10173=VECTOR('',#10172,7.500000298023E-1); +#10174=CARTESIAN_POINT('',(-1.704438626963E0,-7.130971000716E0,-4.E-2)); +#10175=LINE('',#10174,#10173); +#10177=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10178=PRESENTATION_STYLE_ASSIGNMENT((#10177)); +#10179=STYLED_ITEM('',(#10178),#10176); +#10181=DIRECTION('',(3.102799990428E-1,9.506452136281E-1,0.E0)); +#10182=VECTOR('',#10181,1.208585701156E0); +#10183=CARTESIAN_POINT('',(-2.454438656766E0,-7.130971000716E0,-4.E-2)); +#10184=LINE('',#10183,#10182); +#10186=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10187=PRESENTATION_STYLE_ASSIGNMENT((#10186)); +#10188=STYLED_ITEM('',(#10187),#10185); +#10191=DIRECTION('',(0.E0,-1.E0,0.E0)); +#10192=VECTOR('',#10191,2.E0); +#10193=CARTESIAN_POINT('',(-9.127720000331E-1,-5.811822042987E0,-4.E-2)); +#10194=LINE('',#10193,#10192); +#10196=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10197=PRESENTATION_STYLE_ASSIGNMENT((#10196)); +#10198=STYLED_ITEM('',(#10197),#10195); +#10200=DIRECTION('',(1.E0,0.E0,0.E0)); +#10201=VECTOR('',#10200,1.5E0); +#10202=CARTESIAN_POINT('',(-9.127720000331E-1,-7.811822042987E0,-4.E-2)); +#10203=LINE('',#10202,#10201); +#10205=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10206=PRESENTATION_STYLE_ASSIGNMENT((#10205)); +#10207=STYLED_ITEM('',(#10206),#10204); +#10209=DIRECTION('',(0.E0,1.E0,0.E0)); +#10210=VECTOR('',#10209,2.553191483021E-1); +#10211=CARTESIAN_POINT('',(5.872279999669E-1,-7.811822042987E0,-4.E-2)); +#10212=LINE('',#10211,#10210); +#10214=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10215=PRESENTATION_STYLE_ASSIGNMENT((#10214)); +#10216=STYLED_ITEM('',(#10215),#10213); +#10218=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10219=VECTOR('',#10218,1.25E0); +#10220=CARTESIAN_POINT('',(5.872279999669E-1,-7.556502894685E0,-4.E-2)); +#10221=LINE('',#10220,#10219); +#10223=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10224=PRESENTATION_STYLE_ASSIGNMENT((#10223)); +#10225=STYLED_ITEM('',(#10224),#10222); +#10227=DIRECTION('',(0.E0,1.E0,0.E0)); +#10228=VECTOR('',#10227,1.744680851698E0); +#10229=CARTESIAN_POINT('',(-6.627720000331E-1,-7.556502894685E0,-4.E-2)); +#10230=LINE('',#10229,#10228); +#10232=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10233=PRESENTATION_STYLE_ASSIGNMENT((#10232)); +#10234=STYLED_ITEM('',(#10233),#10231); +#10236=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10237=VECTOR('',#10236,2.5E-1); +#10238=CARTESIAN_POINT('',(-6.627720000331E-1,-5.811822042987E0,-4.E-2)); +#10239=LINE('',#10238,#10237); +#10241=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10242=PRESENTATION_STYLE_ASSIGNMENT((#10241)); +#10243=STYLED_ITEM('',(#10242),#10240); +#10246=DIRECTION('',(0.E0,-1.E0,0.E0)); +#10247=VECTOR('',#10246,2.E0); +#10248=CARTESIAN_POINT('',(9.205612538274E-1,-5.811822042987E0,-4.E-2)); +#10249=LINE('',#10248,#10247); +#10251=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10252=PRESENTATION_STYLE_ASSIGNMENT((#10251)); +#10253=STYLED_ITEM('',(#10252),#10250); +#10255=DIRECTION('',(1.E0,0.E0,0.E0)); +#10256=VECTOR('',#10255,1.500000238419E0); +#10257=CARTESIAN_POINT('',(9.205612538274E-1,-7.811822042987E0,-4.E-2)); +#10258=LINE('',#10257,#10256); +#10260=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10261=PRESENTATION_STYLE_ASSIGNMENT((#10260)); +#10262=STYLED_ITEM('',(#10261),#10259); +#10264=DIRECTION('',(0.E0,1.E0,0.E0)); +#10265=VECTOR('',#10264,2.553191483021E-1); +#10266=CARTESIAN_POINT('',(2.420561492246E0,-7.811822042987E0,-4.E-2)); +#10267=LINE('',#10266,#10265); +#10269=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10270=PRESENTATION_STYLE_ASSIGNMENT((#10269)); +#10271=STYLED_ITEM('',(#10270),#10268); +#10273=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10274=VECTOR('',#10273,1.25E0); +#10275=CARTESIAN_POINT('',(2.420561492246E0,-7.556502894685E0,-4.E-2)); +#10276=LINE('',#10275,#10274); +#10278=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10279=PRESENTATION_STYLE_ASSIGNMENT((#10278)); +#10280=STYLED_ITEM('',(#10279),#10277); +#10282=DIRECTION('',(0.E0,1.E0,0.E0)); +#10283=VECTOR('',#10282,1.744680851698E0); +#10284=CARTESIAN_POINT('',(1.170561492246E0,-7.556502894685E0,-4.E-2)); +#10285=LINE('',#10284,#10283); +#10287=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10288=PRESENTATION_STYLE_ASSIGNMENT((#10287)); +#10289=STYLED_ITEM('',(#10288),#10286); +#10291=DIRECTION('',(-1.E0,0.E0,0.E0)); +#10292=VECTOR('',#10291,2.500002384186E-1); +#10293=CARTESIAN_POINT('',(1.170561492246E0,-5.811822042987E0,-4.E-2)); +#10294=LINE('',#10293,#10292); +#10296=CURVE_STYLE('',#20,POSITIVE_LENGTH_MEASURE(2.E-2),#10); +#10297=PRESENTATION_STYLE_ASSIGNMENT((#10296)); +#10298=STYLED_ITEM('',(#10297),#10295); +#10301=PRESENTATION_LAYER_ASSIGNMENT('02___PRT_ALL_AXES','',(#5586,#5595)); +#10302=PRESENTATION_LAYER_ASSIGNMENT('03_ALL_AXES','',(#5586,#5595)); +#10303=PRESENTATION_LAYER_ASSIGNMENT('03___PRT_ALL_CURVES','',(#5851,#5951, +#5979,#6214,#6377,#6486,#6631,#6722,#7119,#7291,#7382,#7473,#7582,#7835,#8142, +#8287,#8432,#8667,#8830,#8894,#8931,#9292,#9473,#9834,#10015,#10052,#10089, +#10162,#10190,#10245,#10300)); +#10304=PRESENTATION_LAYER_ASSIGNMENT('05_ALL_CURVES','',(#5851,#5951,#5979, +#6214,#6377,#6486,#6631,#6722,#7119,#7291,#7382,#7473,#7582,#7835,#8142,#8287, +#8432,#8667,#8830,#8894,#8931,#9292,#9473,#9834,#10015,#10052,#10089,#10162, +#10190,#10245,#10300)); +#10305=PRESENTATION_LAYER_ASSIGNMENT('05___PRT_ALL_DTM_CSYS','',(#5578)); +#10306=PRESENTATION_LAYER_ASSIGNMENT('05___PRT_DEF_DTM_CSYS','',(#5578)); +#10307=PRESENTATION_LAYER_ASSIGNMENT('20_ALL_FEATURES','',(#5586,#5595,#5851, +#5951,#5979,#6214,#6377,#6486,#6631,#6722,#7119,#7291,#7382,#7473,#7582,#7835, +#8142,#8287,#8432,#8667,#8830,#8894,#8931,#9292,#9473,#9834,#10015,#10052, +#10089,#10162,#10190,#10245,#10300)); +#10309=DIMENSIONAL_EXPONENTS(0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,0.E0); +#10311=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(1.745329251994E-2), +#10310); +#10312=(CONVERSION_BASED_UNIT('DEGREE',#10311)NAMED_UNIT(*)PLANE_ANGLE_UNIT()); +#10314=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(6.901208201280E-3),#10308, +'closure', +'Maximum model space distance between geometric entities at asserted connectivities'); +#10315=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT(( +#10314))GLOBAL_UNIT_ASSIGNED_CONTEXT((#10308,#10312,#10313))REPRESENTATION_CONTEXT('ID1','3')); +#5590=GEOMETRIC_SET('',(#5586,#5595,#5851,#5951,#5979,#6214,#6377,#6486,#6631, +#6722,#7119,#7291,#7382,#7473,#7582,#7835,#8142,#8287,#8432,#8667,#8830,#8894, +#8931,#9292,#9473,#9834,#10015,#10052,#10089,#10162,#10190,#10245,#10300)); +#10319=SHAPE_REPRESENTATION_RELATIONSHIP('','',#10318,#10316); +#10320=SHAPE_REPRESENTATION_RELATIONSHIP('','',#10318,#10317); +#10321=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#23,#30,#37, +#44,#52,#59,#67,#75,#82,#90,#97,#104,#111,#119,#127,#134,#142,#149,#157,#164, +#172,#179,#186,#193,#200,#208,#216,#223,#231,#238,#246,#253,#261,#268,#275,#282, +#289,#297,#304,#311,#318,#326,#333,#340,#347,#355,#363,#370,#377,#385,#392,#399, +#407,#414,#421,#429,#436,#444,#451,#459,#466,#474,#481,#488,#495,#502,#509,#516, +#523,#530,#537,#544,#551,#558,#565,#573,#581,#588,#595,#602,#610,#617,#625,#632, +#639,#646,#653,#661,#668,#676,#683,#690,#697,#704,#711,#718,#725,#732,#739,#746, +#753,#760,#767,#775,#782,#789,#796,#804,#811,#818,#825,#832,#839,#846,#853,#860, +#867,#874,#881,#888,#895,#902,#909,#916,#923,#930,#937,#944,#951,#958,#965,#972, +#979,#986,#993,#1000,#1007,#1014,#1021,#1028,#1035,#1042,#1049,#1056,#1063, +#1070,#1077,#1084,#1091,#1098,#1105,#1112,#1119,#1126,#1133,#1140,#1147,#1154, +#1161,#1168,#1175,#1182,#1189,#1196,#1203,#1210,#1217,#1224,#1231,#1238,#1245, +#1252,#1259,#1266,#1273,#1280,#1287,#1294,#1301,#1308,#1315,#1323,#1331,#1339, +#1346,#1354,#1362,#1370,#1377,#1384,#1391,#1398,#1405,#1412,#1419,#1426,#1433, +#1440,#1447,#1454,#1461,#1468,#1475,#1482,#1489,#1496,#1503,#1510,#1517,#1524, +#1531,#1538,#1545,#1552,#1559,#1566,#1573,#1580,#1587,#1594,#1601,#1608,#1615, +#1622,#1629,#1636,#1643,#1650,#1657,#1664,#1671,#1678,#1685,#1692,#1699,#1706, +#1713,#1720,#1727,#1734,#1741,#1748,#1755,#1762,#1769,#1776,#1783,#1790,#1797, +#1804,#1811,#1818,#1825,#1832,#1839,#1846,#1853,#1860,#1867,#1874,#1881,#1888, +#1895,#1902,#1909,#1916,#1923,#1930,#1937,#1944,#1951,#1958,#1965,#1972,#1979, +#1986,#1993,#2000,#2007,#2014,#2021,#2028,#2035,#2042,#2049,#2056,#2063,#2070, +#2077,#2084,#2091,#2098,#2105,#2112,#2119,#2126,#2133,#2140,#2147,#2154,#2161, +#2168,#2175,#2182,#2189,#2196,#2203,#2210,#2217,#2224,#2231,#2238,#2245,#2252, +#2259,#2266,#2273,#2280,#2287,#2294,#2301,#2308,#2315,#2322,#2329,#2336,#2343, +#2350,#2357,#2364,#2371,#2378,#2386,#2394,#2401,#2408,#2415,#2422,#2429,#2436, +#2443,#2450,#2457,#2465,#2473,#2480,#2487,#2494,#2501,#2508,#2515,#2522,#2529, +#2536,#2543,#2550,#2558,#2566,#2573,#2580,#3183,#3246,#4001,#4081,#4161,#4241, +#4321,#4401,#4481,#4561,#4641,#4721,#4801,#4881,#4961,#5041,#5121,#5201,#5281, +#5361,#15,#5581,#5589,#5598,#5606,#5615,#5624,#5633,#5642,#5651,#5660,#5669, +#5678,#5687,#5696,#5705,#5714,#5723,#5732,#5741,#5750,#5759,#5768,#5777,#5786, +#5795,#5804,#5813,#5822,#5831,#5840,#5849,#5859,#5868,#5877,#5886,#5895,#5904, +#5913,#5922,#5931,#5940,#5949,#5959,#5968,#5977,#5987,#5996,#6005,#6014,#6023, +#6032,#6041,#6050,#6059,#6068,#6077,#6086,#6095,#6104,#6113,#6122,#6131,#6140, +#6149,#6158,#6167,#6176,#6185,#6194,#6203,#6212,#6222,#6231,#6240,#6249,#6258, +#6267,#6276,#6285,#6294,#6303,#6312,#6321,#6330,#6339,#6348,#6357,#6366,#6375, +#6385,#6394,#6403,#6412,#6421,#6430,#6439,#6448,#6457,#6466,#6475,#6484,#6494, +#6503,#6512,#6521,#6530,#6539,#6548,#6557,#6566,#6575,#6584,#6593,#6602,#6611, +#6620,#6629,#6639,#6648,#6657,#6666,#6675,#6684,#6693,#6702,#6711,#6720,#6730, +#6739,#6748,#6757,#6766,#6775,#6784,#6793,#6802,#6811,#6820,#6829,#6838,#6847, +#6856,#6865,#6874,#6883,#6892,#6901,#6910,#6919,#6928,#6937,#6946,#6955,#6964, +#6973,#6982,#6991,#7000,#7009,#7018,#7027,#7036,#7045,#7054,#7063,#7072,#7081, +#7090,#7099,#7108,#7117,#7127,#7136,#7145,#7154,#7163,#7172,#7181,#7190,#7199, +#7208,#7217,#7226,#7235,#7244,#7253,#7262,#7271,#7280,#7289,#7299,#7308,#7317, +#7326,#7335,#7344,#7353,#7362,#7371,#7380,#7390,#7399,#7408,#7417,#7426,#7435, +#7444,#7453,#7462,#7471,#7481,#7490,#7499,#7508,#7517,#7526,#7535,#7544,#7553, +#7562,#7571,#7580,#7590,#7599,#7608,#7617,#7626,#7635,#7644,#7653,#7662,#7671, +#7680,#7689,#7698,#7707,#7716,#7725,#7734,#7743,#7752,#7761,#7770,#7779,#7788, +#7797,#7806,#7815,#7824,#7833,#7843,#7852,#7861,#7870,#7879,#7888,#7897,#7906, +#7915,#7924,#7933,#7942,#7951,#7960,#7969,#7978,#7987,#7996,#8005,#8014,#8023, +#8032,#8041,#8050,#8059,#8068,#8077,#8086,#8095,#8104,#8113,#8122,#8131,#8140, +#8150,#8159,#8168,#8177,#8186,#8195,#8204,#8213,#8222,#8231,#8240,#8249,#8258, +#8267,#8276,#8285,#8295,#8304,#8313,#8322,#8331,#8340,#8349,#8358,#8367,#8376, +#8385,#8394,#8403,#8412,#8421,#8430,#8440,#8449,#8458,#8467,#8476,#8485,#8494, +#8503,#8512,#8521,#8530,#8539,#8548,#8557,#8566,#8575,#8584,#8593,#8602,#8611, +#8620,#8629,#8638,#8647,#8656,#8665,#8675,#8684,#8693,#8702,#8711,#8720,#8729, +#8738,#8747,#8756,#8765,#8774,#8783,#8792,#8801,#8810,#8819,#8828,#8838,#8847, +#8856,#8865,#8874,#8883,#8892,#8902,#8911,#8920,#8929,#8939,#8948,#8957,#8966, +#8975,#8984,#8993,#9002,#9011,#9020,#9029,#9038,#9047,#9056,#9065,#9074,#9083, +#9092,#9101,#9110,#9119,#9128,#9137,#9146,#9155,#9164,#9173,#9182,#9191,#9200, +#9209,#9218,#9227,#9236,#9245,#9254,#9263,#9272,#9281,#9290,#9300,#9309,#9318, +#9327,#9336,#9345,#9354,#9363,#9372,#9381,#9390,#9399,#9408,#9417,#9426,#9435, +#9444,#9453,#9462,#9471,#9481,#9490,#9499,#9508,#9517,#9526,#9535,#9544,#9553, +#9562,#9571,#9580,#9589,#9598,#9607,#9616,#9625,#9634,#9643,#9652,#9661,#9670, +#9679,#9688,#9697,#9706,#9715,#9724,#9733,#9742,#9751,#9760,#9769,#9778,#9787, +#9796,#9805,#9814,#9823,#9832,#9842,#9851,#9860,#9869,#9878,#9887,#9896,#9905, +#9914,#9923,#9932,#9941,#9950,#9959,#9968,#9977,#9986,#9995,#10004,#10013, +#10023,#10032,#10041,#10050,#10060,#10069,#10078,#10087,#10097,#10106,#10115, +#10124,#10133,#10142,#10151,#10160,#10170,#10179,#10188,#10198,#10207,#10216, +#10225,#10234,#10243,#10253,#10262,#10271,#10280,#10289,#10298),#10315); +#10322=APPLICATION_CONTEXT( +'CONFIGURATION CONTROLLED 3D DESIGNS OF MECHANICAL PARTS AND ASSEMBLIES'); +#10323=APPLICATION_PROTOCOL_DEFINITION('international standard', +'config_control_design',1994,#10322); +#10324=DESIGN_CONTEXT('',#10322,'design'); +#10325=MECHANICAL_CONTEXT('',#10322,'mechanical'); +#10326=PRODUCT('P169H002','P169H002','NOT SPECIFIED',(#10325)); +#10327=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('5','LAST_VERSION', +#10326,.MADE.); +#10331=PRODUCT_CATEGORY('part',''); +#10332=PRODUCT_RELATED_PRODUCT_CATEGORY('detail','',(#10326)); +#10333=PRODUCT_CATEGORY_RELATIONSHIP('','',#10331,#10332); +#10334=SECURITY_CLASSIFICATION_LEVEL('unclassified'); +#10335=SECURITY_CLASSIFICATION('','',#10334); +#10336=CC_DESIGN_SECURITY_CLASSIFICATION(#10335,(#10327)); +#10337=APPROVAL_STATUS('approved'); +#10338=APPROVAL(#10337,''); +#10339=CC_DESIGN_APPROVAL(#10338,(#10335,#10327,#10328)); +#10340=CALENDAR_DATE(122,28,3); +#10341=COORDINATED_UNIVERSAL_TIME_OFFSET(8,0,.AHEAD.); +#10342=LOCAL_TIME(15,5,4.2E1,#10341); +#10343=DATE_AND_TIME(#10340,#10342); +#10344=APPROVAL_DATE_TIME(#10343,#10338); +#10345=DATE_TIME_ROLE('creation_date'); +#10346=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#10343,#10345,(#10328)); +#10347=DATE_TIME_ROLE('classification_date'); +#10348=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#10343,#10347,(#10335)); +#10349=PERSON('UNSPECIFIED','UNSPECIFIED',$,$,$,$); +#10350=ORGANIZATION('UNSPECIFIED','UNSPECIFIED','UNSPECIFIED'); +#10351=PERSON_AND_ORGANIZATION(#10349,#10350); +#10352=APPROVAL_ROLE('approver'); +#10353=APPROVAL_PERSON_ORGANIZATION(#10351,#10338,#10352); +#10354=PERSON_AND_ORGANIZATION_ROLE('creator'); +#10355=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#10351,#10354,(#10327, +#10328)); +#10356=PERSON_AND_ORGANIZATION_ROLE('design_supplier'); +#10357=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#10351,#10356,(#10327)); +#10358=PERSON_AND_ORGANIZATION_ROLE('classification_officer'); +#10359=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#10351,#10358,(#10335)); +#10360=PERSON_AND_ORGANIZATION_ROLE('design_owner'); +#10361=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#10351,#10360,(#10326)); +#1=DRAUGHTING_PRE_DEFINED_COLOUR('green'); +#2=COLOUR_RGB('',1.1E-2,1.2E-2,1.E0); +#3=COLOUR_RGB('',4.1E-1,2.61589E-1,1.12848E-1); +#4=COLOUR_RGB('',5.04854E-1,1.5455E-2,1.5455E-2); +#5=COLOUR_RGB('',6.40777E-1,6.40777E-1,6.40777E-1); +#6=COLOUR_RGB('',6.66667E-1,7.05882E-1,7.64706E-1); +#7=COLOUR_RGB('',6.69062E-1,6.69903E-1,6.55217E-1); +#8=COLOUR_RGB('',9.21569E-1,7.05882E-1,4.70588E-1); +#9=DRAUGHTING_PRE_DEFINED_COLOUR('red'); +#10=COLOUR_RGB('',1.E0,6.705882352941E-1,0.E0); +#11=DRAUGHTING_PRE_DEFINED_COLOUR('yellow'); +#12=COLOUR_RGB('',1.E0,1.E0,5.3E-1); +#13=COLOUR_RGB('',1.E0,1.E0,9.49E-1); +#14=DRAUGHTING_PRE_DEFINED_COLOUR('white'); +#49=CIRCLE('',#48,5.2E0); +#64=CIRCLE('',#63,5.2E0); +#72=CIRCLE('',#71,5.2E0); +#87=CIRCLE('',#86,5.2E0); +#116=CIRCLE('',#115,5.4E0); +#124=CIRCLE('',#123,5.4E0); +#139=CIRCLE('',#138,5.4E0); +#154=CIRCLE('',#153,5.4E0); +#169=CIRCLE('',#168,5.4E0); +#205=CIRCLE('',#204,5.E0); +#213=CIRCLE('',#212,5.E0); +#228=CIRCLE('',#227,5.E0); +#243=CIRCLE('',#242,5.E0); +#258=CIRCLE('',#257,5.E0); +#294=CIRCLE('',#293,5.E0); +#323=CIRCLE('',#322,5.E0); +#352=CIRCLE('',#351,5.E0); +#360=CIRCLE('',#359,5.4E0); +#382=CIRCLE('',#381,5.4E0); +#404=CIRCLE('',#403,5.4E0); +#426=CIRCLE('',#425,5.2E0); +#441=CIRCLE('',#440,5.2E0); +#456=CIRCLE('',#455,5.2E0); +#471=CIRCLE('',#470,5.2E0); +#570=CIRCLE('',#569,5.E-1); +#578=CIRCLE('',#577,5.E-1); +#607=CIRCLE('',#606,1.E0); +#622=CIRCLE('',#621,1.E0); +#658=CIRCLE('',#657,1.E0); +#673=CIRCLE('',#672,1.E0); +#772=CIRCLE('',#771,3.E-1); +#801=CIRCLE('',#800,3.E-1); +#1320=CIRCLE('',#1319,3.E-1); +#1328=CIRCLE('',#1327,1.E0); +#1336=CIRCLE('',#1335,1.E0); +#1351=CIRCLE('',#1350,1.E0); +#1359=CIRCLE('',#1358,1.E0); +#1367=CIRCLE('',#1366,3.E-1); +#2383=CIRCLE('',#2382,1.E0); +#2391=CIRCLE('',#2390,1.E0); +#2462=CIRCLE('',#2461,5.E-1); +#2470=CIRCLE('',#2469,5.E-1); +#2555=CIRCLE('',#2554,1.E0); +#2563=CIRCLE('',#2562,1.E0); +#3066=EDGE_CURVE('',#3034,#3036,#49,.T.); +#3068=EDGE_CURVE('',#3044,#3034,#56,.T.); +#3070=EDGE_CURVE('',#3042,#3044,#64,.T.); +#3072=EDGE_CURVE('',#3052,#3042,#548,.T.); +#3074=EDGE_CURVE('',#3050,#3052,#72,.T.); +#3076=EDGE_CURVE('',#3060,#3050,#79,.T.); +#3078=EDGE_CURVE('',#3058,#3060,#87,.T.); +#3080=EDGE_CURVE('',#3036,#3058,#94,.T.); +#3084=EDGE_CURVE('',#3018,#3012,#19,.T.); +#3086=EDGE_CURVE('',#3010,#3012,#116,.T.); +#3088=EDGE_CURVE('',#3010,#3004,#27,.T.); +#3090=EDGE_CURVE('',#3002,#3004,#360,.T.); +#3092=EDGE_CURVE('',#3002,#3028,#34,.T.); +#3094=EDGE_CURVE('',#3026,#3028,#382,.T.); +#3096=EDGE_CURVE('',#3026,#3020,#41,.T.); +#3098=EDGE_CURVE('',#3018,#3020,#404,.T.); +#3108=EDGE_CURVE('',#3012,#3007,#101,.T.); +#3111=EDGE_CURVE('',#3018,#3016,#108,.T.); +#3113=EDGE_CURVE('',#3016,#3007,#146,.T.); +#3123=EDGE_CURVE('',#3007,#3008,#139,.T.); +#3125=EDGE_CURVE('',#3010,#3008,#418,.T.); +#3137=EDGE_CURVE('',#2999,#3000,#124,.T.); +#3139=EDGE_CURVE('',#3008,#2999,#131,.T.); +#3143=EDGE_CURVE('',#3015,#3016,#154,.T.); +#3145=EDGE_CURVE('',#3024,#3015,#161,.T.); +#3147=EDGE_CURVE('',#3023,#3024,#169,.T.); +#3149=EDGE_CURVE('',#3000,#3023,#176,.T.); +#3153=EDGE_CURVE('',#2970,#2980,#197,.T.); +#3155=EDGE_CURVE('',#2978,#2980,#352,.T.); +#3157=EDGE_CURVE('',#2978,#2988,#344,.T.); +#3159=EDGE_CURVE('',#2986,#2988,#323,.T.); +#3161=EDGE_CURVE('',#2986,#2996,#315,.T.); +#3163=EDGE_CURVE('',#2994,#2996,#294,.T.); +#3165=EDGE_CURVE('',#2994,#2972,#279,.T.); +#3167=EDGE_CURVE('',#2970,#2972,#205,.T.); +#3189=EDGE_CURVE('',#2970,#2968,#183,.T.); +#3191=EDGE_CURVE('',#2968,#2975,#265,.T.); +#3193=EDGE_CURVE('',#2980,#2975,#190,.T.); +#3204=EDGE_CURVE('',#2967,#2968,#213,.T.); +#3208=EDGE_CURVE('',#2972,#2967,#272,.T.); +#3219=EDGE_CURVE('',#2992,#2967,#220,.T.); +#3221=EDGE_CURVE('',#2991,#2992,#228,.T.); +#3223=EDGE_CURVE('',#2984,#2991,#235,.T.); +#3225=EDGE_CURVE('',#2983,#2984,#243,.T.); +#3227=EDGE_CURVE('',#2976,#2983,#250,.T.); +#3229=EDGE_CURVE('',#2975,#2976,#258,.T.); +#3254=EDGE_CURVE('',#2994,#2992,#286,.T.); +#3268=EDGE_CURVE('',#2996,#2991,#308,.T.); +#3278=EDGE_CURVE('',#2986,#2984,#301,.T.); +#3294=EDGE_CURVE('',#2988,#2983,#337,.T.); +#3304=EDGE_CURVE('',#2978,#2976,#330,.T.); +#3330=EDGE_CURVE('',#3002,#3000,#367,.T.); +#3333=EDGE_CURVE('',#3004,#2999,#411,.T.); +#3345=EDGE_CURVE('',#3028,#3023,#374,.T.); +#3357=EDGE_CURVE('',#3026,#3024,#396,.T.); +#3369=EDGE_CURVE('',#3020,#3015,#389,.T.); +#3406=EDGE_CURVE('',#3031,#3032,#426,.T.); +#3408=EDGE_CURVE('',#3034,#3032,#2570,.T.); +#3411=EDGE_CURVE('',#3036,#3031,#485,.T.); +#3422=EDGE_CURVE('',#3031,#3056,#433,.T.); +#3424=EDGE_CURVE('',#3055,#3056,#441,.T.); +#3426=EDGE_CURVE('',#3055,#3048,#448,.T.); +#3428=EDGE_CURVE('',#3047,#3048,#456,.T.); +#3430=EDGE_CURVE('',#3047,#3040,#463,.T.); +#3432=EDGE_CURVE('',#3039,#3040,#471,.T.); +#3434=EDGE_CURVE('',#3039,#3032,#478,.T.); +#3446=EDGE_CURVE('',#3058,#3056,#492,.T.); +#3460=EDGE_CURVE('',#3060,#3055,#506,.T.); +#3470=EDGE_CURVE('',#3050,#3048,#499,.T.); +#3486=EDGE_CURVE('',#3052,#3047,#541,.T.); +#3496=EDGE_CURVE('',#3042,#3040,#534,.T.); +#3503=EDGE_CURVE('',#2588,#2584,#513,.T.); +#3505=EDGE_CURVE('',#2588,#2586,#1343,.T.); +#3507=EDGE_CURVE('',#2586,#2583,#520,.T.); +#3509=EDGE_CURVE('',#2583,#2584,#527,.T.); +#3519=EDGE_CURVE('',#2599,#2600,#555,.T.); +#3521=EDGE_CURVE('',#2600,#2588,#562,.T.); +#3524=EDGE_CURVE('',#2599,#2584,#636,.T.); +#3535=EDGE_CURVE('',#2599,#2603,#570,.T.); +#3537=EDGE_CURVE('',#2603,#2604,#2505,.T.); +#3539=EDGE_CURVE('',#2604,#2600,#578,.T.); +#3549=EDGE_CURVE('',#2963,#2964,#585,.T.); +#3551=EDGE_CURVE('',#2964,#2651,#592,.T.); +#3553=EDGE_CURVE('',#2647,#2651,#2555,.T.); +#3555=EDGE_CURVE('',#2647,#2624,#599,.T.); +#3557=EDGE_CURVE('',#2623,#2624,#607,.T.); +#3559=EDGE_CURVE('',#2623,#2632,#614,.T.); +#3561=EDGE_CURVE('',#2631,#2632,#622,.T.); +#3563=EDGE_CURVE('',#2631,#2603,#629,.T.); +#3568=EDGE_CURVE('',#2583,#2595,#643,.T.); +#3570=EDGE_CURVE('',#2591,#2595,#2462,.T.); +#3572=EDGE_CURVE('',#2591,#2608,#650,.T.); +#3574=EDGE_CURVE('',#2607,#2608,#658,.T.); +#3576=EDGE_CURVE('',#2607,#2616,#665,.T.); +#3578=EDGE_CURVE('',#2615,#2616,#673,.T.); +#3580=EDGE_CURVE('',#2615,#2643,#680,.T.); +#3582=EDGE_CURVE('',#2639,#2643,#2383,.T.); +#3584=EDGE_CURVE('',#2639,#2963,#687,.T.); +#3595=EDGE_CURVE('',#2963,#2958,#694,.T.); +#3597=EDGE_CURVE('',#2958,#2960,#786,.T.); +#3599=EDGE_CURVE('',#2964,#2960,#743,.T.); +#3609=EDGE_CURVE('',#2943,#2956,#701,.T.); +#3611=EDGE_CURVE('',#2956,#2958,#793,.T.); +#3615=EDGE_CURVE('',#2639,#2640,#708,.T.); +#3617=EDGE_CURVE('',#2640,#2943,#715,.T.); +#3627=EDGE_CURVE('',#2944,#2954,#722,.T.); +#3629=EDGE_CURVE('',#2954,#2956,#801,.T.); +#3632=EDGE_CURVE('',#2943,#2944,#1320,.T.); +#3642=EDGE_CURVE('',#2947,#2952,#729,.T.); +#3644=EDGE_CURVE('',#2952,#2954,#808,.T.); +#3647=EDGE_CURVE('',#2944,#2947,#736,.T.); +#3657=EDGE_CURVE('',#2951,#2948,#750,.T.); +#3659=EDGE_CURVE('',#2951,#2952,#772,.T.); +#3662=EDGE_CURVE('',#2947,#2948,#1367,.T.); +#3674=EDGE_CURVE('',#2960,#2951,#779,.T.); +#3677=EDGE_CURVE('',#2948,#2652,#757,.T.); +#3679=EDGE_CURVE('',#2651,#2652,#764,.T.); +#3705=EDGE_CURVE('',#2644,#2640,#2391,.T.); +#3707=EDGE_CURVE('',#2620,#2644,#2405,.T.); +#3709=EDGE_CURVE('',#2618,#2620,#1328,.T.); +#3711=EDGE_CURVE('',#2612,#2618,#2426,.T.); +#3713=EDGE_CURVE('',#2610,#2612,#1336,.T.); +#3715=EDGE_CURVE('',#2592,#2610,#2454,.T.); +#3717=EDGE_CURVE('',#2596,#2592,#2470,.T.); +#3719=EDGE_CURVE('',#2586,#2596,#2484,.T.); +#3724=EDGE_CURVE('',#2636,#2604,#2498,.T.); +#3726=EDGE_CURVE('',#2634,#2636,#1351,.T.); +#3728=EDGE_CURVE('',#2628,#2634,#2519,.T.); +#3730=EDGE_CURVE('',#2626,#2628,#1359,.T.); +#3732=EDGE_CURVE('',#2648,#2626,#2547,.T.); +#3734=EDGE_CURVE('',#2652,#2648,#2563,.T.); +#3741=EDGE_CURVE('',#2679,#2680,#843,.T.); +#3743=EDGE_CURVE('',#2680,#2682,#850,.T.); +#3745=EDGE_CURVE('',#2682,#2684,#857,.T.); +#3747=EDGE_CURVE('',#2684,#2679,#864,.T.); +#3751=EDGE_CURVE('',#2695,#2696,#871,.T.); +#3753=EDGE_CURVE('',#2696,#2698,#878,.T.); +#3755=EDGE_CURVE('',#2698,#2700,#885,.T.); +#3757=EDGE_CURVE('',#2700,#2695,#892,.T.); +#3761=EDGE_CURVE('',#2711,#2712,#899,.T.); +#3763=EDGE_CURVE('',#2712,#2714,#906,.T.); +#3765=EDGE_CURVE('',#2714,#2716,#913,.T.); +#3767=EDGE_CURVE('',#2716,#2711,#920,.T.); +#3771=EDGE_CURVE('',#2727,#2728,#927,.T.); +#3773=EDGE_CURVE('',#2728,#2730,#934,.T.); +#3775=EDGE_CURVE('',#2730,#2732,#941,.T.); +#3777=EDGE_CURVE('',#2732,#2727,#948,.T.); +#3781=EDGE_CURVE('',#2743,#2744,#955,.T.); +#3783=EDGE_CURVE('',#2744,#2746,#962,.T.); +#3785=EDGE_CURVE('',#2746,#2748,#969,.T.); +#3787=EDGE_CURVE('',#2748,#2743,#976,.T.); +#3791=EDGE_CURVE('',#2759,#2760,#983,.T.); +#3793=EDGE_CURVE('',#2760,#2762,#990,.T.); +#3795=EDGE_CURVE('',#2762,#2764,#997,.T.); +#3797=EDGE_CURVE('',#2764,#2759,#1004,.T.); +#3801=EDGE_CURVE('',#2775,#2776,#1011,.T.); +#3803=EDGE_CURVE('',#2776,#2778,#1018,.T.); +#3805=EDGE_CURVE('',#2778,#2780,#1025,.T.); +#3807=EDGE_CURVE('',#2780,#2775,#1032,.T.); +#3811=EDGE_CURVE('',#2791,#2792,#1039,.T.); +#3813=EDGE_CURVE('',#2792,#2794,#1046,.T.); +#3815=EDGE_CURVE('',#2794,#2796,#1053,.T.); +#3817=EDGE_CURVE('',#2796,#2791,#1060,.T.); +#3821=EDGE_CURVE('',#2807,#2808,#1067,.T.); +#3823=EDGE_CURVE('',#2808,#2810,#1074,.T.); +#3825=EDGE_CURVE('',#2810,#2812,#1081,.T.); +#3827=EDGE_CURVE('',#2812,#2807,#1088,.T.); +#3831=EDGE_CURVE('',#2823,#2824,#1095,.T.); +#3833=EDGE_CURVE('',#2824,#2826,#1102,.T.); +#3835=EDGE_CURVE('',#2826,#2828,#1109,.T.); +#3837=EDGE_CURVE('',#2828,#2823,#1116,.T.); +#3841=EDGE_CURVE('',#2839,#2840,#1123,.T.); +#3843=EDGE_CURVE('',#2840,#2842,#1130,.T.); +#3845=EDGE_CURVE('',#2842,#2844,#1137,.T.); +#3847=EDGE_CURVE('',#2844,#2839,#1144,.T.); +#3851=EDGE_CURVE('',#2855,#2856,#1151,.T.); +#3853=EDGE_CURVE('',#2856,#2858,#1158,.T.); +#3855=EDGE_CURVE('',#2858,#2860,#1165,.T.); +#3857=EDGE_CURVE('',#2860,#2855,#1172,.T.); +#3861=EDGE_CURVE('',#2871,#2872,#1179,.T.); +#3863=EDGE_CURVE('',#2872,#2874,#1186,.T.); +#3865=EDGE_CURVE('',#2874,#2876,#1193,.T.); +#3867=EDGE_CURVE('',#2876,#2871,#1200,.T.); +#3871=EDGE_CURVE('',#2887,#2888,#1207,.T.); +#3873=EDGE_CURVE('',#2888,#2890,#1214,.T.); +#3875=EDGE_CURVE('',#2890,#2892,#1221,.T.); +#3877=EDGE_CURVE('',#2892,#2887,#1228,.T.); +#3881=EDGE_CURVE('',#2903,#2904,#1235,.T.); +#3883=EDGE_CURVE('',#2904,#2906,#1242,.T.); +#3885=EDGE_CURVE('',#2906,#2908,#1249,.T.); +#3887=EDGE_CURVE('',#2908,#2903,#1256,.T.); +#3891=EDGE_CURVE('',#2919,#2920,#1263,.T.); +#3893=EDGE_CURVE('',#2920,#2922,#1270,.T.); +#3895=EDGE_CURVE('',#2922,#2924,#1277,.T.); +#3897=EDGE_CURVE('',#2924,#2919,#1284,.T.); +#3901=EDGE_CURVE('',#2935,#2936,#1291,.T.); +#3903=EDGE_CURVE('',#2936,#2938,#1298,.T.); +#3905=EDGE_CURVE('',#2938,#2940,#1305,.T.); +#3907=EDGE_CURVE('',#2940,#2935,#1312,.T.); +#3911=EDGE_CURVE('',#2663,#2664,#815,.T.); +#3913=EDGE_CURVE('',#2664,#2666,#822,.T.); +#3915=EDGE_CURVE('',#2666,#2668,#829,.T.); +#3917=EDGE_CURVE('',#2668,#2663,#836,.T.); +#3928=EDGE_CURVE('',#2663,#2655,#1374,.T.); +#3930=EDGE_CURVE('',#2655,#2656,#1402,.T.); +#3932=EDGE_CURVE('',#2664,#2656,#1395,.T.); +#3943=EDGE_CURVE('',#2668,#2660,#1381,.T.); +#3945=EDGE_CURVE('',#2660,#2655,#1409,.T.); +#3957=EDGE_CURVE('',#2666,#2658,#1388,.T.); +#3959=EDGE_CURVE('',#2658,#2660,#1416,.T.); +#3972=EDGE_CURVE('',#2656,#2658,#1423,.T.); +#4008=EDGE_CURVE('',#2679,#2671,#1430,.T.); +#4010=EDGE_CURVE('',#2671,#2672,#1458,.T.); +#4012=EDGE_CURVE('',#2680,#2672,#1451,.T.); +#4023=EDGE_CURVE('',#2684,#2676,#1437,.T.); +#4025=EDGE_CURVE('',#2676,#2671,#1465,.T.); +#4037=EDGE_CURVE('',#2682,#2674,#1444,.T.); +#4039=EDGE_CURVE('',#2674,#2676,#1472,.T.); +#4052=EDGE_CURVE('',#2672,#2674,#1479,.T.); +#4088=EDGE_CURVE('',#2695,#2687,#1486,.T.); +#4090=EDGE_CURVE('',#2687,#2688,#1514,.T.); +#4092=EDGE_CURVE('',#2696,#2688,#1507,.T.); +#4103=EDGE_CURVE('',#2700,#2692,#1493,.T.); +#4105=EDGE_CURVE('',#2692,#2687,#1521,.T.); +#4117=EDGE_CURVE('',#2698,#2690,#1500,.T.); +#4119=EDGE_CURVE('',#2690,#2692,#1528,.T.); +#4132=EDGE_CURVE('',#2688,#2690,#1535,.T.); +#4168=EDGE_CURVE('',#2711,#2703,#1542,.T.); +#4170=EDGE_CURVE('',#2703,#2704,#1570,.T.); +#4172=EDGE_CURVE('',#2712,#2704,#1563,.T.); +#4183=EDGE_CURVE('',#2716,#2708,#1549,.T.); +#4185=EDGE_CURVE('',#2708,#2703,#1577,.T.); +#4197=EDGE_CURVE('',#2714,#2706,#1556,.T.); +#4199=EDGE_CURVE('',#2706,#2708,#1584,.T.); +#4212=EDGE_CURVE('',#2704,#2706,#1591,.T.); +#4248=EDGE_CURVE('',#2727,#2719,#1598,.T.); +#4250=EDGE_CURVE('',#2719,#2720,#1626,.T.); +#4252=EDGE_CURVE('',#2728,#2720,#1619,.T.); +#4263=EDGE_CURVE('',#2732,#2724,#1605,.T.); +#4265=EDGE_CURVE('',#2724,#2719,#1633,.T.); +#4277=EDGE_CURVE('',#2730,#2722,#1612,.T.); +#4279=EDGE_CURVE('',#2722,#2724,#1640,.T.); +#4292=EDGE_CURVE('',#2720,#2722,#1647,.T.); +#4328=EDGE_CURVE('',#2743,#2735,#1654,.T.); +#4330=EDGE_CURVE('',#2735,#2736,#1682,.T.); +#4332=EDGE_CURVE('',#2744,#2736,#1675,.T.); +#4343=EDGE_CURVE('',#2748,#2740,#1661,.T.); +#4345=EDGE_CURVE('',#2740,#2735,#1689,.T.); +#4357=EDGE_CURVE('',#2746,#2738,#1668,.T.); +#4359=EDGE_CURVE('',#2738,#2740,#1696,.T.); +#4372=EDGE_CURVE('',#2736,#2738,#1703,.T.); +#4408=EDGE_CURVE('',#2759,#2751,#1710,.T.); +#4410=EDGE_CURVE('',#2751,#2752,#1738,.T.); +#4412=EDGE_CURVE('',#2760,#2752,#1731,.T.); +#4423=EDGE_CURVE('',#2764,#2756,#1717,.T.); +#4425=EDGE_CURVE('',#2756,#2751,#1745,.T.); +#4437=EDGE_CURVE('',#2762,#2754,#1724,.T.); +#4439=EDGE_CURVE('',#2754,#2756,#1752,.T.); +#4452=EDGE_CURVE('',#2752,#2754,#1759,.T.); +#4488=EDGE_CURVE('',#2775,#2767,#1766,.T.); +#4490=EDGE_CURVE('',#2767,#2768,#1794,.T.); +#4492=EDGE_CURVE('',#2776,#2768,#1787,.T.); +#4503=EDGE_CURVE('',#2780,#2772,#1773,.T.); +#4505=EDGE_CURVE('',#2772,#2767,#1801,.T.); +#4517=EDGE_CURVE('',#2778,#2770,#1780,.T.); +#4519=EDGE_CURVE('',#2770,#2772,#1808,.T.); +#4532=EDGE_CURVE('',#2768,#2770,#1815,.T.); +#4568=EDGE_CURVE('',#2791,#2783,#1822,.T.); +#4570=EDGE_CURVE('',#2783,#2784,#1850,.T.); +#4572=EDGE_CURVE('',#2792,#2784,#1843,.T.); +#4583=EDGE_CURVE('',#2796,#2788,#1829,.T.); +#4585=EDGE_CURVE('',#2788,#2783,#1857,.T.); +#4597=EDGE_CURVE('',#2794,#2786,#1836,.T.); +#4599=EDGE_CURVE('',#2786,#2788,#1864,.T.); +#4612=EDGE_CURVE('',#2784,#2786,#1871,.T.); +#4648=EDGE_CURVE('',#2807,#2799,#1878,.T.); +#4650=EDGE_CURVE('',#2799,#2800,#1906,.T.); +#4652=EDGE_CURVE('',#2808,#2800,#1899,.T.); +#4663=EDGE_CURVE('',#2812,#2804,#1885,.T.); +#4665=EDGE_CURVE('',#2804,#2799,#1913,.T.); +#4677=EDGE_CURVE('',#2810,#2802,#1892,.T.); +#4679=EDGE_CURVE('',#2802,#2804,#1920,.T.); +#4692=EDGE_CURVE('',#2800,#2802,#1927,.T.); +#4728=EDGE_CURVE('',#2823,#2815,#1934,.T.); +#4730=EDGE_CURVE('',#2815,#2816,#1962,.T.); +#4732=EDGE_CURVE('',#2824,#2816,#1955,.T.); +#4743=EDGE_CURVE('',#2828,#2820,#1941,.T.); +#4745=EDGE_CURVE('',#2820,#2815,#1969,.T.); +#4757=EDGE_CURVE('',#2826,#2818,#1948,.T.); +#4759=EDGE_CURVE('',#2818,#2820,#1976,.T.); +#4772=EDGE_CURVE('',#2816,#2818,#1983,.T.); +#4808=EDGE_CURVE('',#2839,#2831,#1990,.T.); +#4810=EDGE_CURVE('',#2831,#2832,#2018,.T.); +#4812=EDGE_CURVE('',#2840,#2832,#2011,.T.); +#4823=EDGE_CURVE('',#2844,#2836,#1997,.T.); +#4825=EDGE_CURVE('',#2836,#2831,#2025,.T.); +#4837=EDGE_CURVE('',#2842,#2834,#2004,.T.); +#4839=EDGE_CURVE('',#2834,#2836,#2032,.T.); +#4852=EDGE_CURVE('',#2832,#2834,#2039,.T.); +#4888=EDGE_CURVE('',#2855,#2847,#2046,.T.); +#4890=EDGE_CURVE('',#2847,#2848,#2074,.T.); +#4892=EDGE_CURVE('',#2856,#2848,#2067,.T.); +#4903=EDGE_CURVE('',#2860,#2852,#2053,.T.); +#4905=EDGE_CURVE('',#2852,#2847,#2081,.T.); +#4917=EDGE_CURVE('',#2858,#2850,#2060,.T.); +#4919=EDGE_CURVE('',#2850,#2852,#2088,.T.); +#4932=EDGE_CURVE('',#2848,#2850,#2095,.T.); +#4968=EDGE_CURVE('',#2871,#2863,#2102,.T.); +#4970=EDGE_CURVE('',#2863,#2864,#2130,.T.); +#4972=EDGE_CURVE('',#2872,#2864,#2123,.T.); +#4983=EDGE_CURVE('',#2876,#2868,#2109,.T.); +#4985=EDGE_CURVE('',#2868,#2863,#2137,.T.); +#4997=EDGE_CURVE('',#2874,#2866,#2116,.T.); +#4999=EDGE_CURVE('',#2866,#2868,#2144,.T.); +#5012=EDGE_CURVE('',#2864,#2866,#2151,.T.); +#5048=EDGE_CURVE('',#2887,#2879,#2158,.T.); +#5050=EDGE_CURVE('',#2879,#2880,#2186,.T.); +#5052=EDGE_CURVE('',#2888,#2880,#2179,.T.); +#5063=EDGE_CURVE('',#2892,#2884,#2165,.T.); +#5065=EDGE_CURVE('',#2884,#2879,#2193,.T.); +#5077=EDGE_CURVE('',#2890,#2882,#2172,.T.); +#5079=EDGE_CURVE('',#2882,#2884,#2200,.T.); +#5092=EDGE_CURVE('',#2880,#2882,#2207,.T.); +#5128=EDGE_CURVE('',#2903,#2895,#2214,.T.); +#5130=EDGE_CURVE('',#2895,#2896,#2242,.T.); +#5132=EDGE_CURVE('',#2904,#2896,#2235,.T.); +#5143=EDGE_CURVE('',#2908,#2900,#2221,.T.); +#5145=EDGE_CURVE('',#2900,#2895,#2249,.T.); +#5157=EDGE_CURVE('',#2906,#2898,#2228,.T.); +#5159=EDGE_CURVE('',#2898,#2900,#2256,.T.); +#5172=EDGE_CURVE('',#2896,#2898,#2263,.T.); +#5208=EDGE_CURVE('',#2919,#2911,#2270,.T.); +#5210=EDGE_CURVE('',#2911,#2912,#2298,.T.); +#5212=EDGE_CURVE('',#2920,#2912,#2291,.T.); +#5223=EDGE_CURVE('',#2924,#2916,#2277,.T.); +#5225=EDGE_CURVE('',#2916,#2911,#2305,.T.); +#5237=EDGE_CURVE('',#2922,#2914,#2284,.T.); +#5239=EDGE_CURVE('',#2914,#2916,#2312,.T.); +#5252=EDGE_CURVE('',#2912,#2914,#2319,.T.); +#5288=EDGE_CURVE('',#2935,#2927,#2326,.T.); +#5290=EDGE_CURVE('',#2927,#2928,#2354,.T.); +#5292=EDGE_CURVE('',#2936,#2928,#2347,.T.); +#5303=EDGE_CURVE('',#2940,#2932,#2333,.T.); +#5305=EDGE_CURVE('',#2932,#2927,#2361,.T.); +#5317=EDGE_CURVE('',#2938,#2930,#2340,.T.); +#5319=EDGE_CURVE('',#2930,#2932,#2368,.T.); +#5332=EDGE_CURVE('',#2928,#2930,#2375,.T.); +#5369=EDGE_CURVE('',#2643,#2644,#2412,.T.); +#5380=EDGE_CURVE('',#2620,#2615,#2398,.T.); +#5394=EDGE_CURVE('',#2618,#2616,#2433,.T.); +#5406=EDGE_CURVE('',#2612,#2607,#2419,.T.); +#5420=EDGE_CURVE('',#2610,#2608,#2440,.T.); +#5434=EDGE_CURVE('',#2591,#2592,#2447,.T.); +#5447=EDGE_CURVE('',#2595,#2596,#2477,.T.); +#5470=EDGE_CURVE('',#2636,#2631,#2491,.T.); +#5484=EDGE_CURVE('',#2634,#2632,#2526,.T.); +#5496=EDGE_CURVE('',#2628,#2623,#2512,.T.); +#5510=EDGE_CURVE('',#2626,#2624,#2533,.T.); +#5524=EDGE_CURVE('',#2647,#2648,#2540,.T.); +#5550=EDGE_CURVE('',#3044,#3039,#2577,.T.); +#5586=TRIMMED_CURVE('A_1',#5585,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5595=TRIMMED_CURVE('A_2',#5594,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5603=TRIMMED_CURVE('',#5602,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5607=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5603); +#5612=TRIMMED_CURVE('',#5611,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5616=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5612); +#5621=TRIMMED_CURVE('',#5620,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5625=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5621); +#5630=TRIMMED_CURVE('',#5629,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5634=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5630); +#5639=TRIMMED_CURVE('',#5638,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5643=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5639); +#5648=TRIMMED_CURVE('',#5647,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5652=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5648); +#5657=TRIMMED_CURVE('',#5656,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5661=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5657); +#5666=TRIMMED_CURVE('',#5665,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5670=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5666); +#5675=TRIMMED_CURVE('',#5674,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5679=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5675); +#5684=TRIMMED_CURVE('',#5683,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5688=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5684); +#5693=TRIMMED_CURVE('',#5692,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5697=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5693); +#5702=TRIMMED_CURVE('',#5701,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5706=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5702); +#5711=TRIMMED_CURVE('',#5710,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5715=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5711); +#5720=TRIMMED_CURVE('',#5719,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5724=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5720); +#5729=TRIMMED_CURVE('',#5728,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5733=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5729); +#5738=TRIMMED_CURVE('',#5737,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5742=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5738); +#5747=TRIMMED_CURVE('',#5746,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5751=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5747); +#5756=TRIMMED_CURVE('',#5755,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5760=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5756); +#5765=TRIMMED_CURVE('',#5764,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5769=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5765); +#5774=TRIMMED_CURVE('',#5773,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5778=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5774); +#5783=TRIMMED_CURVE('',#5782,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5787=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5783); +#5792=TRIMMED_CURVE('',#5791,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5796=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5792); +#5801=TRIMMED_CURVE('',#5800,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5805=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5801); +#5810=TRIMMED_CURVE('',#5809,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5814=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5810); +#5819=TRIMMED_CURVE('',#5818,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5823=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5819); +#5828=TRIMMED_CURVE('',#5827,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5832=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5828); +#5837=TRIMMED_CURVE('',#5836,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5841=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5837); +#5846=TRIMMED_CURVE('',#5845,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5850=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5846); +#5851=COMPOSITE_CURVE('',(#5607,#5616,#5625,#5634,#5643,#5652,#5661,#5670,#5679, +#5688,#5697,#5706,#5715,#5724,#5733,#5742,#5751,#5760,#5769,#5778,#5787,#5796, +#5805,#5814,#5823,#5832,#5841,#5850),.F.); +#5856=TRIMMED_CURVE('',#5855,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5860=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5856); +#5865=TRIMMED_CURVE('',#5864,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5869=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5865); +#5874=TRIMMED_CURVE('',#5873,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5878=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5874); +#5883=TRIMMED_CURVE('',#5882,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5887=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5883); +#5892=TRIMMED_CURVE('',#5891,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5896=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5892); +#5901=TRIMMED_CURVE('',#5900,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5905=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5901); +#5910=TRIMMED_CURVE('',#5909,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5914=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5910); +#5919=TRIMMED_CURVE('',#5918,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5923=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5919); +#5928=TRIMMED_CURVE('',#5927,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5932=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5928); +#5937=TRIMMED_CURVE('',#5936,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5941=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5937); +#5946=TRIMMED_CURVE('',#5945,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5950=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5946); +#5951=COMPOSITE_CURVE('',(#5860,#5869,#5878,#5887,#5896,#5905,#5914,#5923,#5932, +#5941,#5950),.F.); +#5956=TRIMMED_CURVE('',#5955,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5960=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5956); +#5965=TRIMMED_CURVE('',#5964,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5969=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5965); +#5974=TRIMMED_CURVE('',#5973,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5978=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5974); +#5979=COMPOSITE_CURVE('',(#5960,#5969,#5978),.F.); +#5984=TRIMMED_CURVE('',#5983,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5988=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5984); +#5993=TRIMMED_CURVE('',#5992,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#5997=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#5993); +#6002=TRIMMED_CURVE('',#6001,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6006=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6002); +#6011=TRIMMED_CURVE('',#6010,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6015=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6011); +#6020=TRIMMED_CURVE('',#6019,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6024=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6020); +#6029=TRIMMED_CURVE('',#6028,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6033=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6029); +#6038=TRIMMED_CURVE('',#6037,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6042=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6038); +#6047=TRIMMED_CURVE('',#6046,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6051=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6047); +#6056=TRIMMED_CURVE('',#6055,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6060=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6056); +#6065=TRIMMED_CURVE('',#6064,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6069=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6065); +#6074=TRIMMED_CURVE('',#6073,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6078=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6074); +#6083=TRIMMED_CURVE('',#6082,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6087=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6083); +#6092=TRIMMED_CURVE('',#6091,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6096=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6092); +#6101=TRIMMED_CURVE('',#6100,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6105=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6101); +#6110=TRIMMED_CURVE('',#6109,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6114=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6110); +#6119=TRIMMED_CURVE('',#6118,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6123=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6119); +#6128=TRIMMED_CURVE('',#6127,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6132=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6128); +#6137=TRIMMED_CURVE('',#6136,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6141=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6137); +#6146=TRIMMED_CURVE('',#6145,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6150=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6146); +#6155=TRIMMED_CURVE('',#6154,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6159=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6155); +#6164=TRIMMED_CURVE('',#6163,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6168=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6164); +#6173=TRIMMED_CURVE('',#6172,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6177=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6173); +#6182=TRIMMED_CURVE('',#6181,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6186=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6182); +#6191=TRIMMED_CURVE('',#6190,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6195=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6191); +#6200=TRIMMED_CURVE('',#6199,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6204=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6200); +#6209=TRIMMED_CURVE('',#6208,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6213=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6209); +#6214=COMPOSITE_CURVE('',(#5988,#5997,#6006,#6015,#6024,#6033,#6042,#6051,#6060, +#6069,#6078,#6087,#6096,#6105,#6114,#6123,#6132,#6141,#6150,#6159,#6168,#6177, +#6186,#6195,#6204,#6213),.F.); +#6219=TRIMMED_CURVE('',#6218,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6223=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6219); +#6228=TRIMMED_CURVE('',#6227,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6232=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6228); +#6237=TRIMMED_CURVE('',#6236,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6241=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6237); +#6246=TRIMMED_CURVE('',#6245,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6250=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6246); +#6255=TRIMMED_CURVE('',#6254,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6259=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6255); +#6264=TRIMMED_CURVE('',#6263,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6268=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6264); +#6273=TRIMMED_CURVE('',#6272,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6277=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6273); +#6282=TRIMMED_CURVE('',#6281,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6286=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6282); +#6291=TRIMMED_CURVE('',#6290,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6295=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6291); +#6300=TRIMMED_CURVE('',#6299,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6304=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6300); +#6309=TRIMMED_CURVE('',#6308,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6313=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6309); +#6318=TRIMMED_CURVE('',#6317,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6322=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6318); +#6327=TRIMMED_CURVE('',#6326,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6331=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6327); +#6336=TRIMMED_CURVE('',#6335,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6340=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6336); +#6345=TRIMMED_CURVE('',#6344,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6349=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6345); +#6354=TRIMMED_CURVE('',#6353,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6358=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6354); +#6363=TRIMMED_CURVE('',#6362,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6367=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6363); +#6372=TRIMMED_CURVE('',#6371,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6376=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6372); +#6377=COMPOSITE_CURVE('',(#6223,#6232,#6241,#6250,#6259,#6268,#6277,#6286,#6295, +#6304,#6313,#6322,#6331,#6340,#6349,#6358,#6367,#6376),.F.); +#6382=TRIMMED_CURVE('',#6381,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6386=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6382); +#6391=TRIMMED_CURVE('',#6390,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6395=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6391); +#6400=TRIMMED_CURVE('',#6399,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6404=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6400); +#6409=TRIMMED_CURVE('',#6408,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6413=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6409); +#6418=TRIMMED_CURVE('',#6417,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6422=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6418); +#6427=TRIMMED_CURVE('',#6426,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6431=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6427); +#6436=TRIMMED_CURVE('',#6435,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6440=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6436); +#6445=TRIMMED_CURVE('',#6444,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6449=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6445); +#6454=TRIMMED_CURVE('',#6453,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6458=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6454); +#6463=TRIMMED_CURVE('',#6462,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6467=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6463); +#6472=TRIMMED_CURVE('',#6471,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6476=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6472); +#6481=TRIMMED_CURVE('',#6480,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6485=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6481); +#6486=COMPOSITE_CURVE('',(#6386,#6395,#6404,#6413,#6422,#6431,#6440,#6449,#6458, +#6467,#6476,#6485),.F.); +#6491=TRIMMED_CURVE('',#6490,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6495=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6491); +#6500=TRIMMED_CURVE('',#6499,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6504=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6500); +#6509=TRIMMED_CURVE('',#6508,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6513=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6509); +#6518=TRIMMED_CURVE('',#6517,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6522=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6518); +#6527=TRIMMED_CURVE('',#6526,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6531=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6527); +#6536=TRIMMED_CURVE('',#6535,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6540=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6536); +#6545=TRIMMED_CURVE('',#6544,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6549=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6545); +#6554=TRIMMED_CURVE('',#6553,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6558=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6554); +#6563=TRIMMED_CURVE('',#6562,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6567=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6563); +#6572=TRIMMED_CURVE('',#6571,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6576=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6572); +#6581=TRIMMED_CURVE('',#6580,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6585=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6581); +#6590=TRIMMED_CURVE('',#6589,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6594=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6590); +#6599=TRIMMED_CURVE('',#6598,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6603=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6599); +#6608=TRIMMED_CURVE('',#6607,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6612=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6608); +#6617=TRIMMED_CURVE('',#6616,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6621=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6617); +#6626=TRIMMED_CURVE('',#6625,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6630=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6626); +#6631=COMPOSITE_CURVE('',(#6495,#6504,#6513,#6522,#6531,#6540,#6549,#6558,#6567, +#6576,#6585,#6594,#6603,#6612,#6621,#6630),.F.); +#6636=TRIMMED_CURVE('',#6635,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6640=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6636); +#6645=TRIMMED_CURVE('',#6644,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6649=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6645); +#6654=TRIMMED_CURVE('',#6653,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6658=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6654); +#6663=TRIMMED_CURVE('',#6662,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6667=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6663); +#6672=TRIMMED_CURVE('',#6671,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6676=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6672); +#6681=TRIMMED_CURVE('',#6680,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6685=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6681); +#6690=TRIMMED_CURVE('',#6689,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6694=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6690); +#6699=TRIMMED_CURVE('',#6698,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6703=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6699); +#6708=TRIMMED_CURVE('',#6707,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6712=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6708); +#6717=TRIMMED_CURVE('',#6716,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6721=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6717); +#6722=COMPOSITE_CURVE('',(#6640,#6649,#6658,#6667,#6676,#6685,#6694,#6703,#6712, +#6721),.F.); +#6727=TRIMMED_CURVE('',#6726,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6731=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6727); +#6736=TRIMMED_CURVE('',#6735,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6740=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6736); +#6745=TRIMMED_CURVE('',#6744,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6749=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6745); +#6754=TRIMMED_CURVE('',#6753,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6758=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6754); +#6763=TRIMMED_CURVE('',#6762,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6767=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6763); +#6772=TRIMMED_CURVE('',#6771,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6776=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6772); +#6781=TRIMMED_CURVE('',#6780,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6785=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6781); +#6790=TRIMMED_CURVE('',#6789,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6794=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6790); +#6799=TRIMMED_CURVE('',#6798,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6803=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6799); +#6808=TRIMMED_CURVE('',#6807,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6812=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6808); +#6817=TRIMMED_CURVE('',#6816,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6821=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6817); +#6826=TRIMMED_CURVE('',#6825,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6830=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6826); +#6835=TRIMMED_CURVE('',#6834,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6839=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6835); +#6844=TRIMMED_CURVE('',#6843,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6848=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6844); +#6853=TRIMMED_CURVE('',#6852,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6857=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6853); +#6862=TRIMMED_CURVE('',#6861,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6866=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6862); +#6871=TRIMMED_CURVE('',#6870,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6875=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6871); +#6880=TRIMMED_CURVE('',#6879,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6884=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6880); +#6889=TRIMMED_CURVE('',#6888,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6893=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6889); +#6898=TRIMMED_CURVE('',#6897,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6902=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6898); +#6907=TRIMMED_CURVE('',#6906,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6911=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6907); +#6916=TRIMMED_CURVE('',#6915,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6920=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6916); +#6925=TRIMMED_CURVE('',#6924,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6929=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6925); +#6934=TRIMMED_CURVE('',#6933,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6938=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6934); +#6943=TRIMMED_CURVE('',#6942,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6947=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6943); +#6952=TRIMMED_CURVE('',#6951,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6956=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6952); +#6961=TRIMMED_CURVE('',#6960,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6965=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6961); +#6970=TRIMMED_CURVE('',#6969,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6974=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6970); +#6979=TRIMMED_CURVE('',#6978,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6983=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6979); +#6988=TRIMMED_CURVE('',#6987,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#6992=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6988); +#6997=TRIMMED_CURVE('',#6996,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7001=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#6997); +#7006=TRIMMED_CURVE('',#7005,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7010=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7006); +#7015=TRIMMED_CURVE('',#7014,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7019=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7015); +#7024=TRIMMED_CURVE('',#7023,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7028=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7024); +#7033=TRIMMED_CURVE('',#7032,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7037=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7033); +#7042=TRIMMED_CURVE('',#7041,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7046=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7042); +#7051=TRIMMED_CURVE('',#7050,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7055=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7051); +#7060=TRIMMED_CURVE('',#7059,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7064=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7060); +#7069=TRIMMED_CURVE('',#7068,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7073=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7069); +#7078=TRIMMED_CURVE('',#7077,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7082=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7078); +#7087=TRIMMED_CURVE('',#7086,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7091=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7087); +#7096=TRIMMED_CURVE('',#7095,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7100=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7096); +#7105=TRIMMED_CURVE('',#7104,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7109=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7105); +#7114=TRIMMED_CURVE('',#7113,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7118=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7114); +#7119=COMPOSITE_CURVE('',(#6731,#6740,#6749,#6758,#6767,#6776,#6785,#6794,#6803, +#6812,#6821,#6830,#6839,#6848,#6857,#6866,#6875,#6884,#6893,#6902,#6911,#6920, +#6929,#6938,#6947,#6956,#6965,#6974,#6983,#6992,#7001,#7010,#7019,#7028,#7037, +#7046,#7055,#7064,#7073,#7082,#7091,#7100,#7109,#7118),.F.); +#7124=TRIMMED_CURVE('',#7123,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7128=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7124); +#7133=TRIMMED_CURVE('',#7132,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7137=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7133); +#7142=TRIMMED_CURVE('',#7141,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7146=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7142); +#7151=TRIMMED_CURVE('',#7150,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7155=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7151); +#7160=TRIMMED_CURVE('',#7159,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7164=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7160); +#7169=TRIMMED_CURVE('',#7168,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7173=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7169); +#7178=TRIMMED_CURVE('',#7177,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7182=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7178); +#7187=TRIMMED_CURVE('',#7186,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7191=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7187); +#7196=TRIMMED_CURVE('',#7195,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7200=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7196); +#7205=TRIMMED_CURVE('',#7204,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7209=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7205); +#7214=TRIMMED_CURVE('',#7213,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7218=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7214); +#7223=TRIMMED_CURVE('',#7222,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7227=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7223); +#7232=TRIMMED_CURVE('',#7231,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7236=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7232); +#7241=TRIMMED_CURVE('',#7240,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7245=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7241); +#7250=TRIMMED_CURVE('',#7249,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7254=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7250); +#7259=TRIMMED_CURVE('',#7258,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7263=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7259); +#7268=TRIMMED_CURVE('',#7267,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7272=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7268); +#7277=TRIMMED_CURVE('',#7276,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7281=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7277); +#7286=TRIMMED_CURVE('',#7285,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7290=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7286); +#7291=COMPOSITE_CURVE('',(#7128,#7137,#7146,#7155,#7164,#7173,#7182,#7191,#7200, +#7209,#7218,#7227,#7236,#7245,#7254,#7263,#7272,#7281,#7290),.F.); +#7296=TRIMMED_CURVE('',#7295,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7300=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7296); +#7305=TRIMMED_CURVE('',#7304,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7309=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7305); +#7314=TRIMMED_CURVE('',#7313,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7318=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7314); +#7323=TRIMMED_CURVE('',#7322,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7327=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7323); +#7332=TRIMMED_CURVE('',#7331,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7336=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7332); +#7341=TRIMMED_CURVE('',#7340,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7345=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7341); +#7350=TRIMMED_CURVE('',#7349,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7354=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7350); +#7359=TRIMMED_CURVE('',#7358,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7363=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7359); +#7368=TRIMMED_CURVE('',#7367,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7372=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7368); +#7377=TRIMMED_CURVE('',#7376,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7381=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7377); +#7382=COMPOSITE_CURVE('',(#7300,#7309,#7318,#7327,#7336,#7345,#7354,#7363,#7372, +#7381),.F.); +#7387=TRIMMED_CURVE('',#7386,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7391=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7387); +#7396=TRIMMED_CURVE('',#7395,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7400=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7396); +#7405=TRIMMED_CURVE('',#7404,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7409=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7405); +#7414=TRIMMED_CURVE('',#7413,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7418=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7414); +#7423=TRIMMED_CURVE('',#7422,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7427=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7423); +#7432=TRIMMED_CURVE('',#7431,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7436=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7432); +#7441=TRIMMED_CURVE('',#7440,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7445=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7441); +#7450=TRIMMED_CURVE('',#7449,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7454=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7450); +#7459=TRIMMED_CURVE('',#7458,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7463=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7459); +#7468=TRIMMED_CURVE('',#7467,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7472=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7468); +#7473=COMPOSITE_CURVE('',(#7391,#7400,#7409,#7418,#7427,#7436,#7445,#7454,#7463, +#7472),.F.); +#7478=TRIMMED_CURVE('',#7477,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7482=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7478); +#7487=TRIMMED_CURVE('',#7486,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7491=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7487); +#7496=TRIMMED_CURVE('',#7495,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7500=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7496); +#7505=TRIMMED_CURVE('',#7504,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7509=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7505); +#7514=TRIMMED_CURVE('',#7513,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7518=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7514); +#7523=TRIMMED_CURVE('',#7522,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7527=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7523); +#7532=TRIMMED_CURVE('',#7531,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7536=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7532); +#7541=TRIMMED_CURVE('',#7540,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7545=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7541); +#7550=TRIMMED_CURVE('',#7549,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7554=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7550); +#7559=TRIMMED_CURVE('',#7558,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7563=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7559); +#7568=TRIMMED_CURVE('',#7567,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7572=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7568); +#7577=TRIMMED_CURVE('',#7576,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7581=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7577); +#7582=COMPOSITE_CURVE('',(#7482,#7491,#7500,#7509,#7518,#7527,#7536,#7545,#7554, +#7563,#7572,#7581),.F.); +#7587=TRIMMED_CURVE('',#7586,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7591=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7587); +#7596=TRIMMED_CURVE('',#7595,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7600=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7596); +#7605=TRIMMED_CURVE('',#7604,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7609=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7605); +#7614=TRIMMED_CURVE('',#7613,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7618=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7614); +#7623=TRIMMED_CURVE('',#7622,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7627=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7623); +#7632=TRIMMED_CURVE('',#7631,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7636=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7632); +#7641=TRIMMED_CURVE('',#7640,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7645=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7641); +#7650=TRIMMED_CURVE('',#7649,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7654=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7650); +#7659=TRIMMED_CURVE('',#7658,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7663=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7659); +#7668=TRIMMED_CURVE('',#7667,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7672=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7668); +#7677=TRIMMED_CURVE('',#7676,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7681=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7677); +#7686=TRIMMED_CURVE('',#7685,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7690=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7686); +#7695=TRIMMED_CURVE('',#7694,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7699=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7695); +#7704=TRIMMED_CURVE('',#7703,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7708=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7704); +#7713=TRIMMED_CURVE('',#7712,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7717=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7713); +#7722=TRIMMED_CURVE('',#7721,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7726=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7722); +#7731=TRIMMED_CURVE('',#7730,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7735=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7731); +#7740=TRIMMED_CURVE('',#7739,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7744=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7740); +#7749=TRIMMED_CURVE('',#7748,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7753=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7749); +#7758=TRIMMED_CURVE('',#7757,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7762=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7758); +#7767=TRIMMED_CURVE('',#7766,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7771=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7767); +#7776=TRIMMED_CURVE('',#7775,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7780=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7776); +#7785=TRIMMED_CURVE('',#7784,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7789=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7785); +#7794=TRIMMED_CURVE('',#7793,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7798=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7794); +#7803=TRIMMED_CURVE('',#7802,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7807=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7803); +#7812=TRIMMED_CURVE('',#7811,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7816=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7812); +#7821=TRIMMED_CURVE('',#7820,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7825=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7821); +#7830=TRIMMED_CURVE('',#7829,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7834=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7830); +#7835=COMPOSITE_CURVE('',(#7591,#7600,#7609,#7618,#7627,#7636,#7645,#7654,#7663, +#7672,#7681,#7690,#7699,#7708,#7717,#7726,#7735,#7744,#7753,#7762,#7771,#7780, +#7789,#7798,#7807,#7816,#7825,#7834),.F.); +#7840=TRIMMED_CURVE('',#7839,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7844=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7840); +#7849=TRIMMED_CURVE('',#7848,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7853=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7849); +#7858=TRIMMED_CURVE('',#7857,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7862=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7858); +#7867=TRIMMED_CURVE('',#7866,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7871=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7867); +#7876=TRIMMED_CURVE('',#7875,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7880=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7876); +#7885=TRIMMED_CURVE('',#7884,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7889=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7885); +#7894=TRIMMED_CURVE('',#7893,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7898=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7894); +#7903=TRIMMED_CURVE('',#7902,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7907=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7903); +#7912=TRIMMED_CURVE('',#7911,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7916=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7912); +#7921=TRIMMED_CURVE('',#7920,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7925=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7921); +#7930=TRIMMED_CURVE('',#7929,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7934=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7930); +#7939=TRIMMED_CURVE('',#7938,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7943=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7939); +#7948=TRIMMED_CURVE('',#7947,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7952=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7948); +#7957=TRIMMED_CURVE('',#7956,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7961=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7957); +#7966=TRIMMED_CURVE('',#7965,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7970=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7966); +#7975=TRIMMED_CURVE('',#7974,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7979=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7975); +#7984=TRIMMED_CURVE('',#7983,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7988=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7984); +#7993=TRIMMED_CURVE('',#7992,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#7997=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#7993); +#8002=TRIMMED_CURVE('',#8001,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8006=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8002); +#8011=TRIMMED_CURVE('',#8010,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8015=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8011); +#8020=TRIMMED_CURVE('',#8019,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8024=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8020); +#8029=TRIMMED_CURVE('',#8028,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8033=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8029); +#8038=TRIMMED_CURVE('',#8037,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8042=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8038); +#8047=TRIMMED_CURVE('',#8046,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8051=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8047); +#8056=TRIMMED_CURVE('',#8055,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8060=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8056); +#8065=TRIMMED_CURVE('',#8064,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8069=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8065); +#8074=TRIMMED_CURVE('',#8073,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8078=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8074); +#8083=TRIMMED_CURVE('',#8082,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8087=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8083); +#8092=TRIMMED_CURVE('',#8091,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8096=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8092); +#8101=TRIMMED_CURVE('',#8100,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8105=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8101); +#8110=TRIMMED_CURVE('',#8109,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8114=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8110); +#8119=TRIMMED_CURVE('',#8118,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8123=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8119); +#8128=TRIMMED_CURVE('',#8127,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8132=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8128); +#8137=TRIMMED_CURVE('',#8136,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8141=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8137); +#8142=COMPOSITE_CURVE('',(#7844,#7853,#7862,#7871,#7880,#7889,#7898,#7907,#7916, +#7925,#7934,#7943,#7952,#7961,#7970,#7979,#7988,#7997,#8006,#8015,#8024,#8033, +#8042,#8051,#8060,#8069,#8078,#8087,#8096,#8105,#8114,#8123,#8132,#8141),.F.); +#8147=TRIMMED_CURVE('',#8146,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8151=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8147); +#8156=TRIMMED_CURVE('',#8155,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8160=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8156); +#8165=TRIMMED_CURVE('',#8164,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8169=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8165); +#8174=TRIMMED_CURVE('',#8173,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8178=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8174); +#8183=TRIMMED_CURVE('',#8182,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8187=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8183); +#8192=TRIMMED_CURVE('',#8191,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8196=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8192); +#8201=TRIMMED_CURVE('',#8200,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8205=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8201); +#8210=TRIMMED_CURVE('',#8209,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8214=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8210); +#8219=TRIMMED_CURVE('',#8218,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8223=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8219); +#8228=TRIMMED_CURVE('',#8227,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8232=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8228); +#8237=TRIMMED_CURVE('',#8236,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8241=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8237); +#8246=TRIMMED_CURVE('',#8245,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8250=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8246); +#8255=TRIMMED_CURVE('',#8254,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8259=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8255); +#8264=TRIMMED_CURVE('',#8263,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8268=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8264); +#8273=TRIMMED_CURVE('',#8272,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8277=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8273); +#8282=TRIMMED_CURVE('',#8281,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8286=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8282); +#8287=COMPOSITE_CURVE('',(#8151,#8160,#8169,#8178,#8187,#8196,#8205,#8214,#8223, +#8232,#8241,#8250,#8259,#8268,#8277,#8286),.F.); +#8292=TRIMMED_CURVE('',#8291,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8296=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8292); +#8301=TRIMMED_CURVE('',#8300,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8305=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8301); +#8310=TRIMMED_CURVE('',#8309,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8314=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8310); +#8319=TRIMMED_CURVE('',#8318,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8323=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8319); +#8328=TRIMMED_CURVE('',#8327,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8332=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8328); +#8337=TRIMMED_CURVE('',#8336,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8341=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8337); +#8346=TRIMMED_CURVE('',#8345,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8350=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8346); +#8355=TRIMMED_CURVE('',#8354,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8359=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8355); +#8364=TRIMMED_CURVE('',#8363,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8368=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8364); +#8373=TRIMMED_CURVE('',#8372,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8377=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8373); +#8382=TRIMMED_CURVE('',#8381,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8386=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8382); +#8391=TRIMMED_CURVE('',#8390,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8395=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8391); +#8400=TRIMMED_CURVE('',#8399,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8404=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8400); +#8409=TRIMMED_CURVE('',#8408,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8413=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8409); +#8418=TRIMMED_CURVE('',#8417,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8422=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8418); +#8427=TRIMMED_CURVE('',#8426,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8431=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8427); +#8432=COMPOSITE_CURVE('',(#8296,#8305,#8314,#8323,#8332,#8341,#8350,#8359,#8368, +#8377,#8386,#8395,#8404,#8413,#8422,#8431),.F.); +#8437=TRIMMED_CURVE('',#8436,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8441=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8437); +#8446=TRIMMED_CURVE('',#8445,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8450=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8446); +#8455=TRIMMED_CURVE('',#8454,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8459=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8455); +#8464=TRIMMED_CURVE('',#8463,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8468=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8464); +#8473=TRIMMED_CURVE('',#8472,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8477=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8473); +#8482=TRIMMED_CURVE('',#8481,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8486=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8482); +#8491=TRIMMED_CURVE('',#8490,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8495=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8491); +#8500=TRIMMED_CURVE('',#8499,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8504=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8500); +#8509=TRIMMED_CURVE('',#8508,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8513=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8509); +#8518=TRIMMED_CURVE('',#8517,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8522=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8518); +#8527=TRIMMED_CURVE('',#8526,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8531=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8527); +#8536=TRIMMED_CURVE('',#8535,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8540=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8536); +#8545=TRIMMED_CURVE('',#8544,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8549=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8545); +#8554=TRIMMED_CURVE('',#8553,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8558=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8554); +#8563=TRIMMED_CURVE('',#8562,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8567=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8563); +#8572=TRIMMED_CURVE('',#8571,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8576=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8572); +#8581=TRIMMED_CURVE('',#8580,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8585=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8581); +#8590=TRIMMED_CURVE('',#8589,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8594=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8590); +#8599=TRIMMED_CURVE('',#8598,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8603=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8599); +#8608=TRIMMED_CURVE('',#8607,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8612=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8608); +#8617=TRIMMED_CURVE('',#8616,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8621=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8617); +#8626=TRIMMED_CURVE('',#8625,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8630=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8626); +#8635=TRIMMED_CURVE('',#8634,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8639=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8635); +#8644=TRIMMED_CURVE('',#8643,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8648=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8644); +#8653=TRIMMED_CURVE('',#8652,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8657=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8653); +#8662=TRIMMED_CURVE('',#8661,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8666=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8662); +#8667=COMPOSITE_CURVE('',(#8441,#8450,#8459,#8468,#8477,#8486,#8495,#8504,#8513, +#8522,#8531,#8540,#8549,#8558,#8567,#8576,#8585,#8594,#8603,#8612,#8621,#8630, +#8639,#8648,#8657,#8666),.F.); +#8672=TRIMMED_CURVE('',#8671,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8676=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8672); +#8681=TRIMMED_CURVE('',#8680,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8685=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8681); +#8690=TRIMMED_CURVE('',#8689,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8694=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8690); +#8699=TRIMMED_CURVE('',#8698,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8703=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8699); +#8708=TRIMMED_CURVE('',#8707,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8712=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8708); +#8717=TRIMMED_CURVE('',#8716,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8721=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8717); +#8726=TRIMMED_CURVE('',#8725,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8730=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8726); +#8735=TRIMMED_CURVE('',#8734,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8739=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8735); +#8744=TRIMMED_CURVE('',#8743,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8748=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8744); +#8753=TRIMMED_CURVE('',#8752,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8757=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8753); +#8762=TRIMMED_CURVE('',#8761,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8766=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8762); +#8771=TRIMMED_CURVE('',#8770,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8775=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8771); +#8780=TRIMMED_CURVE('',#8779,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8784=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8780); +#8789=TRIMMED_CURVE('',#8788,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8793=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8789); +#8798=TRIMMED_CURVE('',#8797,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8802=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8798); +#8807=TRIMMED_CURVE('',#8806,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8811=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8807); +#8816=TRIMMED_CURVE('',#8815,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8820=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8816); +#8825=TRIMMED_CURVE('',#8824,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8829=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8825); +#8830=COMPOSITE_CURVE('',(#8676,#8685,#8694,#8703,#8712,#8721,#8730,#8739,#8748, +#8757,#8766,#8775,#8784,#8793,#8802,#8811,#8820,#8829),.F.); +#8835=TRIMMED_CURVE('',#8834,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8839=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8835); +#8844=TRIMMED_CURVE('',#8843,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8848=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8844); +#8853=TRIMMED_CURVE('',#8852,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8857=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8853); +#8862=TRIMMED_CURVE('',#8861,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8866=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8862); +#8871=TRIMMED_CURVE('',#8870,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8875=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8871); +#8880=TRIMMED_CURVE('',#8879,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8884=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8880); +#8889=TRIMMED_CURVE('',#8888,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8893=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8889); +#8894=COMPOSITE_CURVE('',(#8839,#8848,#8857,#8866,#8875,#8884,#8893),.F.); +#8899=TRIMMED_CURVE('',#8898,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8903=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8899); +#8908=TRIMMED_CURVE('',#8907,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8912=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8908); +#8917=TRIMMED_CURVE('',#8916,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8921=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8917); +#8926=TRIMMED_CURVE('',#8925,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8930=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8926); +#8931=COMPOSITE_CURVE('',(#8903,#8912,#8921,#8930),.F.); +#8936=TRIMMED_CURVE('',#8935,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8940=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8936); +#8945=TRIMMED_CURVE('',#8944,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8949=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8945); +#8954=TRIMMED_CURVE('',#8953,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8958=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8954); +#8963=TRIMMED_CURVE('',#8962,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8967=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8963); +#8972=TRIMMED_CURVE('',#8971,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8976=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8972); +#8981=TRIMMED_CURVE('',#8980,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8985=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8981); +#8990=TRIMMED_CURVE('',#8989,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#8994=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8990); +#8999=TRIMMED_CURVE('',#8998,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9003=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#8999); +#9008=TRIMMED_CURVE('',#9007,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9012=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9008); +#9017=TRIMMED_CURVE('',#9016,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9021=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9017); +#9026=TRIMMED_CURVE('',#9025,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9030=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9026); +#9035=TRIMMED_CURVE('',#9034,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9039=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9035); +#9044=TRIMMED_CURVE('',#9043,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9048=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9044); +#9053=TRIMMED_CURVE('',#9052,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9057=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9053); +#9062=TRIMMED_CURVE('',#9061,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9066=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9062); +#9071=TRIMMED_CURVE('',#9070,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9075=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9071); +#9080=TRIMMED_CURVE('',#9079,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9084=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9080); +#9089=TRIMMED_CURVE('',#9088,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9093=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9089); +#9098=TRIMMED_CURVE('',#9097,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9102=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9098); +#9107=TRIMMED_CURVE('',#9106,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9111=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9107); +#9116=TRIMMED_CURVE('',#9115,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9120=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9116); +#9125=TRIMMED_CURVE('',#9124,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9129=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9125); +#9134=TRIMMED_CURVE('',#9133,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9138=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9134); +#9143=TRIMMED_CURVE('',#9142,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9147=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9143); +#9152=TRIMMED_CURVE('',#9151,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9156=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9152); +#9161=TRIMMED_CURVE('',#9160,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9165=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9161); +#9170=TRIMMED_CURVE('',#9169,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9174=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9170); +#9179=TRIMMED_CURVE('',#9178,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9183=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9179); +#9188=TRIMMED_CURVE('',#9187,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9192=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9188); +#9197=TRIMMED_CURVE('',#9196,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9201=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9197); +#9206=TRIMMED_CURVE('',#9205,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9210=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9206); +#9215=TRIMMED_CURVE('',#9214,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9219=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9215); +#9224=TRIMMED_CURVE('',#9223,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9228=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9224); +#9233=TRIMMED_CURVE('',#9232,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9237=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9233); +#9242=TRIMMED_CURVE('',#9241,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9246=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9242); +#9251=TRIMMED_CURVE('',#9250,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9255=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9251); +#9260=TRIMMED_CURVE('',#9259,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9264=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9260); +#9269=TRIMMED_CURVE('',#9268,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9273=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9269); +#9278=TRIMMED_CURVE('',#9277,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9282=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9278); +#9287=TRIMMED_CURVE('',#9286,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9291=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9287); +#9292=COMPOSITE_CURVE('',(#8940,#8949,#8958,#8967,#8976,#8985,#8994,#9003,#9012, +#9021,#9030,#9039,#9048,#9057,#9066,#9075,#9084,#9093,#9102,#9111,#9120,#9129, +#9138,#9147,#9156,#9165,#9174,#9183,#9192,#9201,#9210,#9219,#9228,#9237,#9246, +#9255,#9264,#9273,#9282,#9291),.F.); +#9297=TRIMMED_CURVE('',#9296,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9301=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9297); +#9306=TRIMMED_CURVE('',#9305,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9310=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9306); +#9315=TRIMMED_CURVE('',#9314,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9319=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9315); +#9324=TRIMMED_CURVE('',#9323,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9328=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9324); +#9333=TRIMMED_CURVE('',#9332,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9337=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9333); +#9342=TRIMMED_CURVE('',#9341,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9346=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9342); +#9351=TRIMMED_CURVE('',#9350,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9355=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9351); +#9360=TRIMMED_CURVE('',#9359,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9364=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9360); +#9369=TRIMMED_CURVE('',#9368,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9373=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9369); +#9378=TRIMMED_CURVE('',#9377,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9382=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9378); +#9387=TRIMMED_CURVE('',#9386,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9391=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9387); +#9396=TRIMMED_CURVE('',#9395,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9400=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9396); +#9405=TRIMMED_CURVE('',#9404,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9409=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9405); +#9414=TRIMMED_CURVE('',#9413,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9418=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9414); +#9423=TRIMMED_CURVE('',#9422,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9427=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9423); +#9432=TRIMMED_CURVE('',#9431,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9436=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9432); +#9441=TRIMMED_CURVE('',#9440,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9445=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9441); +#9450=TRIMMED_CURVE('',#9449,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9454=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9450); +#9459=TRIMMED_CURVE('',#9458,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9463=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9459); +#9468=TRIMMED_CURVE('',#9467,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9472=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9468); +#9473=COMPOSITE_CURVE('',(#9301,#9310,#9319,#9328,#9337,#9346,#9355,#9364,#9373, +#9382,#9391,#9400,#9409,#9418,#9427,#9436,#9445,#9454,#9463,#9472),.F.); +#9478=TRIMMED_CURVE('',#9477,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9482=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9478); +#9487=TRIMMED_CURVE('',#9486,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9491=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9487); +#9496=TRIMMED_CURVE('',#9495,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9500=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9496); +#9505=TRIMMED_CURVE('',#9504,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9509=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9505); +#9514=TRIMMED_CURVE('',#9513,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9518=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9514); +#9523=TRIMMED_CURVE('',#9522,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9527=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9523); +#9532=TRIMMED_CURVE('',#9531,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9536=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9532); +#9541=TRIMMED_CURVE('',#9540,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9545=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9541); +#9550=TRIMMED_CURVE('',#9549,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9554=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9550); +#9559=TRIMMED_CURVE('',#9558,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9563=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9559); +#9568=TRIMMED_CURVE('',#9567,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9572=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9568); +#9577=TRIMMED_CURVE('',#9576,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9581=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9577); +#9586=TRIMMED_CURVE('',#9585,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9590=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9586); +#9595=TRIMMED_CURVE('',#9594,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9599=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9595); +#9604=TRIMMED_CURVE('',#9603,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9608=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9604); +#9613=TRIMMED_CURVE('',#9612,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9617=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9613); +#9622=TRIMMED_CURVE('',#9621,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9626=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9622); +#9631=TRIMMED_CURVE('',#9630,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9635=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9631); +#9640=TRIMMED_CURVE('',#9639,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9644=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9640); +#9649=TRIMMED_CURVE('',#9648,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9653=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9649); +#9658=TRIMMED_CURVE('',#9657,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9662=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9658); +#9667=TRIMMED_CURVE('',#9666,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9671=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9667); +#9676=TRIMMED_CURVE('',#9675,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9680=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9676); +#9685=TRIMMED_CURVE('',#9684,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9689=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9685); +#9694=TRIMMED_CURVE('',#9693,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9698=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9694); +#9703=TRIMMED_CURVE('',#9702,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9707=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9703); +#9712=TRIMMED_CURVE('',#9711,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9716=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9712); +#9721=TRIMMED_CURVE('',#9720,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9725=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9721); +#9730=TRIMMED_CURVE('',#9729,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9734=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9730); +#9739=TRIMMED_CURVE('',#9738,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9743=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9739); +#9748=TRIMMED_CURVE('',#9747,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9752=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9748); +#9757=TRIMMED_CURVE('',#9756,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9761=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9757); +#9766=TRIMMED_CURVE('',#9765,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9770=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9766); +#9775=TRIMMED_CURVE('',#9774,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9779=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9775); +#9784=TRIMMED_CURVE('',#9783,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9788=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9784); +#9793=TRIMMED_CURVE('',#9792,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9797=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9793); +#9802=TRIMMED_CURVE('',#9801,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9806=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9802); +#9811=TRIMMED_CURVE('',#9810,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9815=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9811); +#9820=TRIMMED_CURVE('',#9819,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9824=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9820); +#9829=TRIMMED_CURVE('',#9828,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9833=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9829); +#9834=COMPOSITE_CURVE('',(#9482,#9491,#9500,#9509,#9518,#9527,#9536,#9545,#9554, +#9563,#9572,#9581,#9590,#9599,#9608,#9617,#9626,#9635,#9644,#9653,#9662,#9671, +#9680,#9689,#9698,#9707,#9716,#9725,#9734,#9743,#9752,#9761,#9770,#9779,#9788, +#9797,#9806,#9815,#9824,#9833),.F.); +#9839=TRIMMED_CURVE('',#9838,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9843=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9839); +#9848=TRIMMED_CURVE('',#9847,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9852=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9848); +#9857=TRIMMED_CURVE('',#9856,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9861=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9857); +#9866=TRIMMED_CURVE('',#9865,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9870=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9866); +#9875=TRIMMED_CURVE('',#9874,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9879=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9875); +#9884=TRIMMED_CURVE('',#9883,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9888=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9884); +#9893=TRIMMED_CURVE('',#9892,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9897=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9893); +#9902=TRIMMED_CURVE('',#9901,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9906=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9902); +#9911=TRIMMED_CURVE('',#9910,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9915=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9911); +#9920=TRIMMED_CURVE('',#9919,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9924=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9920); +#9929=TRIMMED_CURVE('',#9928,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9933=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9929); +#9938=TRIMMED_CURVE('',#9937,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9942=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9938); +#9947=TRIMMED_CURVE('',#9946,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9951=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9947); +#9956=TRIMMED_CURVE('',#9955,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9960=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9956); +#9965=TRIMMED_CURVE('',#9964,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9969=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9965); +#9974=TRIMMED_CURVE('',#9973,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9978=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9974); +#9983=TRIMMED_CURVE('',#9982,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9987=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9983); +#9992=TRIMMED_CURVE('',#9991,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#9996=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#9992); +#10001=TRIMMED_CURVE('',#10000,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10005=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10001); +#10010=TRIMMED_CURVE('',#10009,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10014=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10010); +#10015=COMPOSITE_CURVE('',(#9843,#9852,#9861,#9870,#9879,#9888,#9897,#9906, +#9915,#9924,#9933,#9942,#9951,#9960,#9969,#9978,#9987,#9996,#10005,#10014),.F.); +#10020=TRIMMED_CURVE('',#10019,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10024=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10020); +#10029=TRIMMED_CURVE('',#10028,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10033=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10029); +#10038=TRIMMED_CURVE('',#10037,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10042=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10038); +#10047=TRIMMED_CURVE('',#10046,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10051=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10047); +#10052=COMPOSITE_CURVE('',(#10024,#10033,#10042,#10051),.F.); +#10057=TRIMMED_CURVE('',#10056,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10061=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10057); +#10066=TRIMMED_CURVE('',#10065,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10070=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10066); +#10075=TRIMMED_CURVE('',#10074,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10079=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10075); +#10084=TRIMMED_CURVE('',#10083,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10088=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10084); +#10089=COMPOSITE_CURVE('',(#10061,#10070,#10079,#10088),.F.); +#10094=TRIMMED_CURVE('',#10093,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10098=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10094); +#10103=TRIMMED_CURVE('',#10102,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10107=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10103); +#10112=TRIMMED_CURVE('',#10111,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10116=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10112); +#10121=TRIMMED_CURVE('',#10120,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10125=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10121); +#10130=TRIMMED_CURVE('',#10129,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10134=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10130); +#10139=TRIMMED_CURVE('',#10138,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10143=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10139); +#10148=TRIMMED_CURVE('',#10147,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10152=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10148); +#10157=TRIMMED_CURVE('',#10156,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10161=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10157); +#10162=COMPOSITE_CURVE('',(#10098,#10107,#10116,#10125,#10134,#10143,#10152, +#10161),.F.); +#10167=TRIMMED_CURVE('',#10166,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10171=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10167); +#10176=TRIMMED_CURVE('',#10175,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10180=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10176); +#10185=TRIMMED_CURVE('',#10184,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10189=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10185); +#10190=COMPOSITE_CURVE('',(#10171,#10180,#10189),.F.); +#10195=TRIMMED_CURVE('',#10194,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10199=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10195); +#10204=TRIMMED_CURVE('',#10203,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10208=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10204); +#10213=TRIMMED_CURVE('',#10212,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10217=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10213); +#10222=TRIMMED_CURVE('',#10221,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10226=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10222); +#10231=TRIMMED_CURVE('',#10230,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10235=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10231); +#10240=TRIMMED_CURVE('',#10239,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10244=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10240); +#10245=COMPOSITE_CURVE('',(#10199,#10208,#10217,#10226,#10235,#10244),.F.); +#10250=TRIMMED_CURVE('',#10249,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10254=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10250); +#10259=TRIMMED_CURVE('',#10258,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10263=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10259); +#10268=TRIMMED_CURVE('',#10267,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10272=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10268); +#10277=TRIMMED_CURVE('',#10276,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10281=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10277); +#10286=TRIMMED_CURVE('',#10285,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10290=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10286); +#10295=TRIMMED_CURVE('',#10294,(PARAMETER_VALUE(0.E0)),(PARAMETER_VALUE(1.E0)), +.T.,.UNSPECIFIED.); +#10299=COMPOSITE_CURVE_SEGMENT(.CONTINUOUS.,.T.,#10295); +#10300=COMPOSITE_CURVE('',(#10254,#10263,#10272,#10281,#10290,#10299),.F.); +#10308=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.)); +#10310=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.)); +#10313=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT()); +#10316=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#5568),#10315); +#10317=GEOMETRICALLY_BOUNDED_SURFACE_SHAPE_REPRESENTATION('',(#5590),#10315); +#10318=SHAPE_REPRESENTATION('',(#5578),#10315); +#10328=PRODUCT_DEFINITION('design','',#10327,#10324); +#10329=PRODUCT_DEFINITION_SHAPE('','SHAPE FOR P169H002.',#10328); +#10330=SHAPE_DEFINITION_REPRESENTATION(#10329,#10318); +ENDSEC; +END-ISO-10303-21; diff --git a/lib/cst816t/extras/AN-CST816T寄存器说明-v1.pdf b/lib/cst816t/extras/AN-CST816T寄存器说明-v1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0fcfb73628c11e9bfeee8226d561549144234af GIT binary patch literal 1396672 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

W|%|WEfgPeq;h+?I9nY+iSbKm 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