From 2dce374a18356d0c3e48df365e415f9b32a9c071 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 11:55:07 +0200 Subject: [PATCH 01/34] Show difference of last measurement to pressure average of the the last three hours and an arrow indicating the trend in the widget --- apps/widbaroalarm/ChangeLog | 1 + apps/widbaroalarm/README.md | 4 +- apps/widbaroalarm/metadata.json | 1 + apps/widbaroalarm/screenshot.png | Bin 0 -> 5203 bytes apps/widbaroalarm/screenshot.png~ | Bin 0 -> 4465 bytes apps/widbaroalarm/widget.js | 448 ++++++++++++++++-------------- 6 files changed, 240 insertions(+), 214 deletions(-) create mode 100644 apps/widbaroalarm/screenshot.png create mode 100644 apps/widbaroalarm/screenshot.png~ diff --git a/apps/widbaroalarm/ChangeLog b/apps/widbaroalarm/ChangeLog index 86a902605..d508139a1 100644 --- a/apps/widbaroalarm/ChangeLog +++ b/apps/widbaroalarm/ChangeLog @@ -3,3 +3,4 @@ 0.03: Fix crash 0.04: Use Prompt with dismiss and pause Improve barometer value median calculation +0.05: Show difference of last measurement to pressure average of the the last three hours and an arrow indicating the trend in the widget diff --git a/apps/widbaroalarm/README.md b/apps/widbaroalarm/README.md index 59d91ff66..52f53921d 100644 --- a/apps/widbaroalarm/README.md +++ b/apps/widbaroalarm/README.md @@ -19,7 +19,9 @@ Get a notification when the pressure reaches defined thresholds. * Pause delay: Same as Dismiss delay but longer (useful for meetings and such). From 30 to 240 min ## Widget -The widget shows two rows: pressure value of last measurement and pressure average of the the last three hours. +The widget shows two rows: +1. pressure value of last measurement +2. difference of last measurement to pressure average of the the last three hours and an arrow indicating the trend ## Creator Marco ([myxor](https://github.com/myxor)) diff --git a/apps/widbaroalarm/metadata.json b/apps/widbaroalarm/metadata.json index 41b8d3e17..ba9d5cc8b 100644 --- a/apps/widbaroalarm/metadata.json +++ b/apps/widbaroalarm/metadata.json @@ -9,6 +9,7 @@ "tags": "tool,barometer", "supports": ["BANGLEJS2"], "readme": "README.md", + "screenshots": [{"url":"screenshot-dark.png"}], "storage": [ {"name":"widbaroalarm.wid.js","url":"widget.js"}, {"name":"widbaroalarm.settings.js","url":"settings.js"}, diff --git a/apps/widbaroalarm/screenshot.png b/apps/widbaroalarm/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dc20f1da2086bacc694f91b6f9498e528bc20634 GIT binary patch literal 5203 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 D@}+%T literal 0 HcmV?d00001 diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index e1516b6f1..14d29bcfb 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -1,268 +1,290 @@ (function() { - let medianPressure; - let threeHourAvrPressure; - let currentPressures = []; - let stop = false; // semaphore +let medianPressure; +let threeHourAvrPressure; +let currentPressures = []; +let stop = false; // semaphore - const LOG_FILE = "widbaroalarm.log.json"; - const SETTINGS_FILE = "widbaroalarm.json"; - const storage = require('Storage'); +const LOG_FILE = "widbaroalarm.log.json"; +const SETTINGS_FILE = "widbaroalarm.json"; +const storage = require('Storage'); - let settings; +let settings; - function loadSettings() { - settings = Object.assign( - storage.readJSON("widbaroalarm.default.json", true) || {}, - storage.readJSON(SETTINGS_FILE, true) || {} - ); - } +function loadSettings() { + settings = + Object.assign(storage.readJSON("widbaroalarm.default.json", true) || {}, + storage.readJSON(SETTINGS_FILE, true) || {}); +} - loadSettings(); +loadSettings(); +function setting(key) { return settings[key]; } - function setting(key) { - return settings[key]; - } +function saveSetting(key, value) { + settings[key] = value; + storage.write(SETTINGS_FILE, settings); +} - function saveSetting(key, value) { - settings[key] = value; - storage.write(SETTINGS_FILE, settings); - } +const interval = setting("interval"); - const interval = setting("interval"); +let history3 = + storage.readJSON(LOG_FILE, true) || []; // history of recent 3 hours - let history3 = storage.readJSON(LOG_FILE, true) || []; // history of recent 3 hours +function showAlarm(body, key) { + if (body == undefined) + return; + stop = true; - function showAlarm(body, key) { - if (body == undefined) return; - stop = true; - - E.showPrompt(body, { - title: "Pressure alarm", - buttons: { - "Ok": 1, - "Dismiss": 2, - "Pause": 3 - } - }).then(function(v) { - const tsNow = Math.round(Date.now() / 1000); // seconds - - if (v == 1) { - saveSetting(key, tsNow); - } - if (v == 2) { - // save timestamp of the future so that we do not warn again for the same event until then - saveSetting(key, tsNow + 60 * setting('dismissDelayMin')); - } - if (v == 3) { - // save timestamp of the future so that we do not warn again for the same event until then - saveSetting(key, tsNow + 60 * setting('pauseDelayMin')); - } - stop = false; - load(); - }); - - if (setting("buzz") && - !(storage.readJSON('setting.json', 1) || {}).quiet) { - Bangle.buzz(); - } - - setTimeout(function() { - stop = false; - load(); - }, 20000); - } - - - function doWeNeedToWarn(key) { + E.showPrompt(body, { + title : "Pressure alarm", + buttons : {"Ok" : 1, "Dismiss" : 2, "Pause" : 3} + }).then(function(v) { const tsNow = Math.round(Date.now() / 1000); // seconds - return setting(key) == 0 || setting(key) < tsNow; + + if (v == 1) { + saveSetting(key, tsNow); + } + if (v == 2) { + // save timestamp of the future so that we do not warn again for the same + // event until then + saveSetting(key, tsNow + 60 * setting('dismissDelayMin')); + } + if (v == 3) { + // save timestamp of the future so that we do not warn again for the same + // event until then + saveSetting(key, tsNow + 60 * setting('pauseDelayMin')); + } + stop = false; + load(); + }); + + if (setting("buzz") && !(storage.readJSON('setting.json', 1) || {}).quiet) { + Bangle.buzz(); } - function checkForAlarms(pressure) { - if (pressure == undefined || pressure <= 0) return; + setTimeout(function() { + stop = false; + load(); + }, 20000); +} - let alreadyWarned = false; +function doWeNeedToWarn(key) { + const tsNow = Math.round(Date.now() / 1000); // seconds + return setting(key) == 0 || setting(key) < tsNow; +} - const ts = Math.round(Date.now() / 1000); // seconds - const d = { - "ts": ts, - "p": pressure - }; +function checkForAlarms(pressure) { + if (pressure == undefined || pressure <= 0) + return; - // delete entries older than 3h - for (let i = 0; i < history3.length; i++) { - if (history3[i]["ts"] < ts - (3 * 60 * 60)) { - history3.shift(); - } - } - // delete oldest entries until we have max 50 - while (history3.length > 50) { + let alreadyWarned = false; + + const ts = Math.round(Date.now() / 1000); // seconds + const d = {"ts" : ts, "p" : pressure}; + + // delete entries older than 3h + for (let i = 0; i < history3.length; i++) { + if (history3[i]["ts"] < ts - (3 * 60 * 60)) { history3.shift(); } + } + // delete oldest entries until we have max 50 + while (history3.length > 50) { + history3.shift(); + } - if (setting("lowalarm")) { - // Is below the alarm threshold? - if (pressure <= setting("min")) { - if (!doWeNeedToWarn("lastLowWarningTs")) { - showAlarm("Pressure low: " + Math.round(pressure) + " hPa", "lastLowWarningTs"); - alreadyWarned = true; - } - } else { - saveSetting("lastLowWarningTs", 0); + if (setting("lowalarm")) { + // Is below the alarm threshold? + if (pressure <= setting("min")) { + if (!doWeNeedToWarn("lastLowWarningTs")) { + showAlarm("Pressure low: " + Math.round(pressure) + " hPa", + "lastLowWarningTs"); + alreadyWarned = true; } + } else { + saveSetting("lastLowWarningTs", 0); } + } - if (setting("highalarm")) { - // Is above the alarm threshold? - if (pressure >= setting("max")) { - if (doWeNeedToWarn("lastHighWarningTs")) { - showAlarm("Pressure high: " + Math.round(pressure) + " hPa", "lastHighWarningTs"); - alreadyWarned = true; - } - } else { - saveSetting("lastHighWarningTs", 0); + if (setting("highalarm")) { + // Is above the alarm threshold? + if (pressure >= setting("max")) { + if (doWeNeedToWarn("lastHighWarningTs")) { + showAlarm("Pressure high: " + Math.round(pressure) + " hPa", + "lastHighWarningTs"); + alreadyWarned = true; } + } else { + saveSetting("lastHighWarningTs", 0); } + } - if (history3.length > 0 && !alreadyWarned) { - // 3h change detection - const drop3halarm = setting("drop3halarm"); - const raise3halarm = setting("raise3halarm"); - if (drop3halarm > 0 || raise3halarm > 0) { - // we need at least 30min of data for reliable detection - const diffDateAge = Math.abs(history3[0]["ts"] - ts); - if (diffDateAge < 10 * 60) { // todo change to 1800 - return; - } + if (history3.length > 0 && !alreadyWarned) { + // 3h change detection + const drop3halarm = setting("drop3halarm"); + const raise3halarm = setting("raise3halarm"); + if (drop3halarm > 0 || raise3halarm > 0) { + // we need at least 30min of data for reliable detection + const diffDateAge = Math.abs(history3[0]["ts"] - ts); + if (diffDateAge < 10 * 60) { // todo change to 1800 + return; + } - // Get oldest entry: - const oldestPressure = history3[0]["p"]; - if (oldestPressure != undefined && oldestPressure > 0) { - const diffPressure = Math.abs(oldestPressure - pressure); + // Get oldest entry: + const oldestPressure = history3[0]["p"]; + if (oldestPressure != undefined && oldestPressure > 0) { + const diffPressure = Math.abs(oldestPressure - pressure); - // drop alarm - if (drop3halarm > 0 && oldestPressure > pressure) { - if (diffPressure > drop3halarm) { - if (doWeNeedToWarn("lastDropWarningTs")) { - showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + - Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", "lastDropWarningTs"); - } - } else { - saveSetting("lastDropWarningTs", 0); + // drop alarm + if (drop3halarm > 0 && oldestPressure > pressure) { + if (diffPressure > drop3halarm) { + if (doWeNeedToWarn("lastDropWarningTs")) { + showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + + Math.round(oldestPressure) + " to " + + Math.round(pressure) + " hPa", + "lastDropWarningTs"); } } else { saveSetting("lastDropWarningTs", 0); } + } else { + saveSetting("lastDropWarningTs", 0); + } - // raise alarm - if (raise3halarm > 0 && oldestPressure < pressure) { - if (diffPressure > raise3halarm) { - if (doWeNeedToWarn("lastRaiseWarningTs")) { - showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + - Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", "lastRaiseWarningTs"); - } - } else { - saveSetting("lastRaiseWarningTs", 0); + // raise alarm + if (raise3halarm > 0 && oldestPressure < pressure) { + if (diffPressure > raise3halarm) { + if (doWeNeedToWarn("lastRaiseWarningTs")) { + showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + + Math.round(oldestPressure) + " to " + + Math.round(pressure) + " hPa", + "lastRaiseWarningTs"); } } else { saveSetting("lastRaiseWarningTs", 0); } + } else { + saveSetting("lastRaiseWarningTs", 0); } } } + } - history3.push(d); - // write data to storage - storage.writeJSON(LOG_FILE, history3); + history3.push(d); + // write data to storage + storage.writeJSON(LOG_FILE, history3); - // calculate 3h average for widget - if (history3.length > 0) { - let sum = 0; - for (let i = 0; i < history3.length; i++) { - sum += history3[i]["p"]; - } - threeHourAvrPressure = sum / history3.length; - } else { - threeHourAvrPressure = undefined; + calculcate3hAveragePressure(); +} + +function calculcate3hAveragePressure() { + if (history3 != undefined && history3.length > 0) { + let sum = 0; + for (let i = 0; i < history3.length; i++) { + sum += history3[i]["p"]; } + threeHourAvrPressure = sum / history3.length; + } else { + threeHourAvrPressure = undefined; } +} +/* + turn on barometer power + take multiple measurements + sort the results + take the middle one (median) + turn off barometer power +*/ +function check() { + if (stop) + return; + const MEDIANLENGTH = 20; + Bangle.setBarometerPower(true, "widbaroalarm"); + Bangle.on('pressure', function(e) { + while (currentPressures.length > MEDIANLENGTH) + currentPressures.pop(); + currentPressures.unshift(e.pressure); + median = currentPressures.slice().sort(); - /* - turn on barometer power - take multiple measurements - sort the results - take the middle one (median) - turn off barometer power - */ - function check() { - if (stop) return; - const MEDIANLENGTH = 20; - Bangle.setBarometerPower(true, "widbaroalarm"); - Bangle.on('pressure', function(e) { - while (currentPressures.length > MEDIANLENGTH) currentPressures.pop(); - currentPressures.unshift(e.pressure); - median = currentPressures.slice().sort(); - - if (median.length > 10) { - var mid = median.length >> 1; - medianPressure = Math.round(E.sum(median.slice(mid - 4, mid + 5)) / 9); - if (medianPressure > 0) { - turnOff(); - checkForAlarms(medianPressure); - } + if (median.length > 10) { + var mid = median.length >> 1; + medianPressure = Math.round(E.sum(median.slice(mid - 4, mid + 5)) / 9); + if (medianPressure > 0) { + turnOff(); + checkForAlarms(medianPressure); } - }); - - setTimeout(function() { - turnOff(); - }, 10000); - } - - function turnOff() { - if (Bangle.isBarometerOn()) - Bangle.setBarometerPower(false, "widbaroalarm"); - } - - function reload() { - check(); - } - - function draw() { - if (global.WIDGETS != undefined && typeof global.WIDGETS === "object") { - global.WIDGETS["baroalarm"] = { - width: setting("show") ? 24 : 0, - reload: reload, - area: "tr", - draw: draw - }; } - g.reset(); - if (setting("show")) { + }); + + setTimeout(function() { turnOff(); }, 10000); +} + +function turnOff() { + if (Bangle.isBarometerOn()) + Bangle.setBarometerPower(false, "widbaroalarm"); +} + +function reload() { check(); } + +function draw() { + if (global.WIDGETS != undefined && typeof global.WIDGETS === "object") { + global.WIDGETS["baroalarm"] = { + width : setting("show") ? 24 : 0, + reload : reload, + area : "tr", + draw : draw + }; + } + g.reset(); + if (setting("show")) { + g.setFont("6x8", 1).setFontAlign(1, 0); + const x = this.x, y = this.y; + if (medianPressure == undefined) { + + // trigger a new check + check(); + + // lets load last value from log (if available) + if (history3.length > 0) { + medianPressure = history3[history3.length - 1]["p"]; + } + + g.drawString("...", x + 24, y + 6); g.setFont("6x8", 1).setFontAlign(1, 0); - if (medianPressure == undefined) { - check(); - const x = this.x, - y = this.y; - g.drawString("...", x + 24, y + 6); - setTimeout(function() { - g.setFont("6x8", 1).setFontAlign(1, 0); - g.drawString(Math.round(medianPressure), x + 24, y + 6); - }, 10000); - } else { - g.drawString(Math.round(medianPressure), this.x + 24, this.y + 6); - } + g.drawString(Math.round(medianPressure), x + 24, y + 6); + } else { + g.drawString(Math.round(medianPressure), x + 24, y + 6); + } - if (threeHourAvrPressure != undefined && threeHourAvrPressure > 0) { - g.drawString(Math.round(threeHourAvrPressure), this.x + 24, this.y + 6 + 10); + if (threeHourAvrPressure == undefined) { + calculcate3hAveragePressure(); + } + if (threeHourAvrPressure != undefined) { + if (medianPressure != undefined) { + let icon; + + const diff = threeHourAvrPressure - medianPressure; + + if (diff == 0) { + icon = atob("DAyBAAAAAAAAIAEAGD+AEAIAAAAAAA=="); // allow right + } else { + if (diff < 0) { + icon = atob("DAyBAAAAAAAAfAHALATAgBAAAAAAAA=="); // arrow up + } else { + icon = atob("DAyBAAAAAAABAAgATALAHAHAeAAAAA=="); // arrow down + } + } + + g.drawImage(icon, x, y + 6 + 4); + g.drawString((diff < 0 ? "+" : "-" ) + Math.round(diff), x + 24, y + 6 + 10); } } } +} - if (interval > 0) { - setInterval(check, interval * 60000); - } - draw(); - +if (interval > 0) { + setInterval(check, interval * 60000); +} +draw(); })(); From 1d7b98a5f4fad03893c383d21df2b01096f41b9e Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 11:58:51 +0200 Subject: [PATCH 02/34] Fix metadata --- apps/widbaroalarm/metadata.json | 2 +- apps/widbaroalarm/screenshot.png~ | Bin 4465 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 apps/widbaroalarm/screenshot.png~ diff --git a/apps/widbaroalarm/metadata.json b/apps/widbaroalarm/metadata.json index ba9d5cc8b..101d09f3d 100644 --- a/apps/widbaroalarm/metadata.json +++ b/apps/widbaroalarm/metadata.json @@ -9,7 +9,7 @@ "tags": "tool,barometer", "supports": ["BANGLEJS2"], "readme": "README.md", - "screenshots": [{"url":"screenshot-dark.png"}], + "screenshots": [{"url":"screenshot.png"}], "storage": [ {"name":"widbaroalarm.wid.js","url":"widget.js"}, {"name":"widbaroalarm.settings.js","url":"settings.js"}, diff --git a/apps/widbaroalarm/screenshot.png~ b/apps/widbaroalarm/screenshot.png~ deleted file mode 100644 index 503bda52a786efc926467f3bf8f7dff5549c8172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4465 zcmV-%5svPOP)Px`D@jB_RCr$Po#}SuC=7)s@Bh%5QnQjBxK7^1fm9Ovb@9+QW zPkCTd4}2BCn?|nGetDn(4uJ6W^`3m!Gwka$FyN!isZ_C000%tW#@7mQ3r8Cm?%!Y8 z=AXb>Ro`|1XDK|(!2$MCrXD;U;94{B;pZOO+B7~1x3>1lYz6~J(Za4 z>=Yu6i<|(z0mI7)E5LnhINzS@djH#-UjQ3{*llPO^YZ)pVBmJB;li_LdOsh3xo$74o!8+|>Y6 z8C7b#Jptm#ON{L7yIl=DI|H{4KO64Izl{jg3Tt{w2rc_*c4?Qm7UF12tWpMvFpA>Bg22-b>u)a@B3u&r2Y>t-+o4a1GpE>NrrJ0B}Yd ztp&yVriJ6Rr(t|5Stnj9GA(XC# zc4v|{I@E1#hbX^sg#qr8klpawzIU0%j(ZZ zyosZ1M#?i!hLzx@GVoRLfHH7z3#1kq+=o zGJ1K0!8VXznA+48)>nFX*F-qRlMJg+~rdCLMU z{rsI~l;?7kEzhIlG3QEv(c~~oN5qFq0o*$<(^1G;$QZ<_kukG$h{#zf3ttYf_C*{$ z3}}|%daJYKc_HrM@Y*ZMkH9OH5+iig{CF9_nqo7L(-A@Og6N%x_%qYaj7?zCnHyUG zH=fA~O5}(wfNfY8zzYGKwShDQGUQ~eq3MY{FMu}y7-<1o>dy@LGS)x<)y5RS0|2J# zcLXp5R4t%hImod2c^2J}v8ev&xB?jQdI22t($91hOmtiU91Kl{qb(}Tme=am z%eG#sj@C;_NkKb`UJbKbwh+pQDIC7@3>xyUM@=Gw>N`w4U{XVa>kWhC#{}kF0EH zD+4ng^#VjK=ed+|a9B$L1Vj(StHJxSp-PDS5+V|431Ukoi)4L^9CWi-*F?t`zynH% z2*6TiM1zXLd#)GRG*(%t4d}Q6ctL=@5JzCLLL8BW!ikJ4fCm6f0q6}l0+x4eq;~Je zWXeJS)y6Chu%>)HFAo&J#lY4cD1f&PUnySz7Xw>+pa9-Fe5HH=TnudOfdY8z@RjnH z0Bn6zWgQ<4Yb$SszNgjx)y7BTAMRXNsZ-J)&s3(3>d(#BAkv+Kl)q)9KB#_@(`P%V=e>OYP@y4<`^WCtpqS)zc$8dGji!hVb|i}eSQhR znxm17=rx!t5q@0^h?br;qguyjz~Ys8bv#0`oc+BJqn&lEkJNA4O}@`8RyeHVxgciw z%W7|yJ`p&Pxl=Q6>qJet1H#C74Ps<%>j#S>B?sjXM8|U;)xM+FY;CfxZym42IOF-P z0B*|z4dA|%Xq}0+nIu3mGO!mIZk}gDwj0E&PX?&$i7>l_7->wc{X7p$&A`udZ&^Ir z0|oGC57+ubJx~A-b?;h>TRR$SX-{jj9l+Kg^cN50!!|nv&ZDE%cODtD=M=!*hrf}x zRY-?pb|4XX1u){J!DG0LN{OY~J{o)l@ZbO@FTZsLK73*A*%rWWf;2xQb2e2n6$GwR=^SH5VL*KF=#-SvWZ3xKK2(O$;1U?LD5GPnz# zwmt_70`<93DB0G}TUf^rD_j#7-Wp&IDycls`oNwp1Ojjiu>>Pmhe|Tg+O+^q+&SK* z`rsolXn;jCFtw4W6QHlBQMv8<+D4H4S^#^gOPt36dp2$g$rQfa{(=gmQn!C&|2H8m(OKvss6T}Ae!!p z%%v{19l)v9*J9gypa9-JgwHmh0DgA-x3|6k-adrSHlP50cKo-uz5w1ngwHmh01n3g z>%Xti3g7>Ihvq+h@^FBU{^I#5Eabnd2P6utX5TJAuM*cG09%dY#%sZz{d_dMr#-7e zykcC_0M0UQMVM!S+i%DfKwdqrDFBZ)@?3v*#y#X+1@8*kc!#*U0iI>tRT=qeaIeb7 zyT#Q7u+>O3bBQ#s&B%zcSJ#`~0FQw9E^!qBUe(Afh*!?M zmiC@C6W=MWEWoQ9nE~+=0lr&YO&QpG1dg892L+Wk;%G)?d&Y74Ml-NSml<=AxK;*c zB4LGMN}M`3Ei7I zP2VR1OtnNcKVAJ?DM7i(+xo!%elc=TjV&A=A0x#Oze z00_LJGw=z3wh6gow*PmkgwTL$*YE(WWin~wWyH#|K`B4BWyCLEWM<$i0k)nT76_1X z0NrT)ExnzGW+#j8XeMhnDUw92Kw8J6dZ%V!sd(42SG0scGt9>^hGW=sDM98~%My?7 zzp|Bdn^#H(?sS1Sov^-k`bf2VY8Rs4#Zq>mf`{yUDa&h3@5nK%>8ovC$`{ln4gtc` zM$=9x&OR#fP%(h?2H(_5o34jFH3L(1lmun(G{gzgQEj(e; zZ~d$OpKr#T0k9>(!6(Oz8W^n)BjdCT^XCXOln@cUM$GjAOnpve{jYY_;tFM8twtFU zB+Htbka{TDQeb8!Mh>^Iaej065(2#X4<-_|h(BES#Hxn+wlUL1n)1&r)s1 z!LUg4kBw#DQ|=yR1PZU1fqzW?YxD{bTa47OSsmgWc=v$V8dv?Rr50@XTaAnWe03?2 zzq!^eB|LF;1AJ9rIU}Prx&+E)whrr6uLrR=t|5SD2i9w(mVu>mshvBsbjr`Xy%*Mj zI1<+|z_TEZ7?}m|G+U>9L%Rm>+uG58qH$FL)*AjZGE~$^OAxeD;#_M)Hb!LU%0(a^ z2XaPSA%HU=K7u1TpL?ERqy^xsY@H7;(v|p~o@hTFn?TCc^z*E^!T=+I?E#gb)qsA< zoA8TWIJh;S(rukmHt^QUo4f~9f>r}MH?AgtwaZTK@%EPHX{}f@t~5Tk2PsnCYeD6LvqsR+(7c0Vu~i#O`O`WF)80A?1yL^<-caj6TQy7p7!j(~ll>ZN z1Q4-|9<$S?^jrBk9|1TE;JBYBuJ9~?TgOJr4||ZpC4?r@ntjjpcFw}j1bE&B@Yj}! z*1!euUk|hZQ|&gSj@JCT)^qKJ$e8-KYTyefkl?;Roq)*pl7|3{UJ7k04KE>HyF_Wy z-|Z6jbG`Z9wYYC-fdFg+6CFJTU<<@M*S@{ePhd}*o(b@{@?lyD(Pt!XcijnI%EtQw z{7zBypBn)zW#YTT%as-AQMvB8zQ;?|x|{cbxuf+CEwgpOnxz>6Co;yT@3b0Ns}FtZ z?=|Z_9SF(qW4aBT#LEEQ3%$~IRSy)vt45~uf;{j)B=?gnJZU`k00000NkvXXu0mjf D@}+%T From f988c299dded74d7bbce4a54c42ebb439c8c4d40 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 14:25:46 +0200 Subject: [PATCH 03/34] Remove arrows from widget --- apps/widbaroalarm/README.md | 2 +- apps/widbaroalarm/widget.js | 21 +++------------------ 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/apps/widbaroalarm/README.md b/apps/widbaroalarm/README.md index 52f53921d..478b48a71 100644 --- a/apps/widbaroalarm/README.md +++ b/apps/widbaroalarm/README.md @@ -21,7 +21,7 @@ Get a notification when the pressure reaches defined thresholds. ## Widget The widget shows two rows: 1. pressure value of last measurement -2. difference of last measurement to pressure average of the the last three hours and an arrow indicating the trend +2. difference of last measurement to pressure average of the the last three hours ## Creator Marco ([myxor](https://github.com/myxor)) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index 14d29bcfb..81b663c15 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -251,7 +251,6 @@ function draw() { } g.drawString("...", x + 24, y + 6); - g.setFont("6x8", 1).setFontAlign(1, 0); g.drawString(Math.round(medianPressure), x + 24, y + 6); } else { g.drawString(Math.round(medianPressure), x + 24, y + 6); @@ -259,25 +258,11 @@ function draw() { if (threeHourAvrPressure == undefined) { calculcate3hAveragePressure(); - } + } if (threeHourAvrPressure != undefined) { if (medianPressure != undefined) { - let icon; - - const diff = threeHourAvrPressure - medianPressure; - - if (diff == 0) { - icon = atob("DAyBAAAAAAAAIAEAGD+AEAIAAAAAAA=="); // allow right - } else { - if (diff < 0) { - icon = atob("DAyBAAAAAAAAfAHALATAgBAAAAAAAA=="); // arrow up - } else { - icon = atob("DAyBAAAAAAABAAgATALAHAHAeAAAAA=="); // arrow down - } - } - - g.drawImage(icon, x, y + 6 + 4); - g.drawString((diff < 0 ? "+" : "-" ) + Math.round(diff), x + 24, y + 6 + 10); + const diff = Math.round(medianPressure - threeHourAvrPressure); + g.drawString((diff > 0 ? "+" : "-") + diff, x + 24, y + 6 + 10); } } } From ed5fb8aee8aae17cd7036a0122281f523c757573 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 14:27:06 +0200 Subject: [PATCH 04/34] Fix changelog --- apps/widbaroalarm/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbaroalarm/ChangeLog b/apps/widbaroalarm/ChangeLog index d508139a1..d125e62e1 100644 --- a/apps/widbaroalarm/ChangeLog +++ b/apps/widbaroalarm/ChangeLog @@ -3,4 +3,4 @@ 0.03: Fix crash 0.04: Use Prompt with dismiss and pause Improve barometer value median calculation -0.05: Show difference of last measurement to pressure average of the the last three hours and an arrow indicating the trend in the widget +0.05: Show difference of last measurement to pressure average of the the last three hours in the widget From ac74ec2818d92b4d1b3441da40a18c7934e54d76 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 14:30:01 +0200 Subject: [PATCH 05/34] Update screenshot and remove double minus sign --- apps/widbaroalarm/screenshot.png | Bin 5203 -> 4785 bytes apps/widbaroalarm/widget.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbaroalarm/screenshot.png b/apps/widbaroalarm/screenshot.png index dc20f1da2086bacc694f91b6f9498e528bc20634..fcb6ad67e4166118268ca140fd4eba8f4cc5b8f9 100644 GIT binary patch delta 4773 zcmV;W5?bxkD6u7wIDZmjNkl=V}ufm?y10sdBSiMT}I42cOJj(;`wSb-Jab9?AVtuu2| zkA#DD{k#LWEV5-RtMHZNz!$F+J!+#N;>(JULD#NU+?C~*6L{r9SFepo96gEY0SC!= zU!I)Xk*_=?AbYy`EtWmf#XEV4%q* zp4x24Pm}YwPxOfMXT`~S5weXuaUJ`Af9cO(c- zU~^KR2>lwayZV(#Zo<+U~gLr!7#7klgB3!wWOvI>>mO(rjw<$f@PyxqIJxbzEK{ zJbyzJsR3ch;Pdvi1$hZ0k0_oFzS^E@+4)fiUo$mnJ@Hsi?=!VL%|-r86Sz0n9)LULMy;dC2f$CW0M3I=(?x~+%c&>!i^b?ps##imIdieDkzN}RvLpFETUe>Vl ze%cAV66hLj`;R4X&!KClk|v7|X$8BUcs=RwV+s5Ow1_V! zEWeNV9-BANFWa+)=$qN{#4E=G68dcLL8ExCZ`H*{EK$JWp$H<$wQi1a1Y~ z>^LivY9uxvMPO~{t9&bLG4vk2td7}75m=I>$G~Nd9{bfv)uU%C=Eo3N8@dI`%JPwY zXt`E<=s$wMI}9T7&}e;--)f|a^wP@aBM96IteJ5}lUK{P;)C*f0`D>i@8QsTAo~>w z<@M1+_v#;HScA9Z5r8${o_|Er@==|mbN0*^!QHZX{RwO}zJq)Qd3V5t*LVob(OBsI zkT*7rL*N)rL#<|#SIfQX>jMqt)$hPhfnRBuPkR~q1P)AgPT+xHM^epvXlCY)V58X_ z0&A!=k`W;^Qdr?N+jH_-Xno5Mfqi_cwVaIn-U_JMj3n>u{1z@H`G2e5flJNz(raWO znMFv=o@%q?nYyiS%H5jX@+Lv|ciLf{a1rD>d6(g+*^ry)BID$6Aev(l{nQ-FCstEQ(pGXA_C?q}7unmw<%_5JV@ z*aDXt({!2)Ab2|1?7n(EYC25@3^bi4YiW;Iz1E>W$lzef(?io~G63P}U{kyHjGd{; ztHaVk-UDC6rXC{kGriW@4nKjl=1av(uuArC(?|Q~1j}F$jen1rS$p{PSf{)LYmE>n znE_<&wVW9luT2h6({Y)WN5;@>JXyB?)$G0AGP-9(Vd3p`6 zY){$vS^I1~HTF|pA-qC8kTk!ny%uAHjOxS}^7SHNOH8t{vi88Dc3pzN*+FLQYr$#d z*LtYE`_IPD+JCpgmEue%FmFCG=&XH9uvUoGyZ>zbtbJG z`_IPD+P9j)R08v-H_}knJ`!^$n`r-0JK1~IFKaLJwb)N1FmFEc^k(f#;7~jsvt&P8 z&ufj~m8~}$KWm?@Cu%>1z}e=r_NC@|yprt-dR}iWd4G8f*%Q}A;%Dt;zLxvp1kN`9 z#NGmm4~fSod%ov(R;=FgOg+3_?&sCW?YO_?leM?vw31KzU5HWx1SSV7YhM~hB({u^ z@!_^!9I4}d@)%sM-6KxP2X+*rWXtoAU)G-c_qrc`0{3c!;_~5?@_4qS)AX9GlxMWw ztI^Yqu79&tzM&^@tD;Ywg8&eC)d`HI&iXkB90GsNtY6vb(BDRTC4w6@#s3iYmiOW9 z2%H@Pw z%}-}KjrpD&<$sIrpeaWo&2;S0WRT(>50X&~BQOFlJvFOSq| z1gyzB-t(*Rk@0ujzv2XL3A{%VPgklT;!8G`T~jruL|56&L>f4Xz`6Br+`N7vN{LWJf2Jgt|8ijwarfcJlAlQf;)%}0XldjA>F@N~|3DEFg%?J$A)ij4D<=U(1 zEPgm8vwpSqqw{%nu0Gc$1a3)MNq=JOJ&=3qW}b*Ma}%aJ%(a@pJ)TUE)mi~+Pr@Sh zDyQJ+I(D0D)$c-NpG=UVwDyWy$}9D?Ctv0hg_<0h__C+Sz8C(z;!;m(0!NF90Or|@ z$|GyY5~~HNGC5o1lReXZ6yB}#qzGI}t^w0RHY)FIB1QAJCh;hIB^O%c4S&A_w@4-% zi0-X-V#uR$TG$bJS`!F$^^A=ia@~EdAp*~A5`crO)(X4YHFEm(BCf2tlqXWFjH&J4 zFxMi1S7;L8TjYftcG)#Th!Ux?IZO7Xe36>H9B-Lx=pEQ<)&r=gu5~>nGL*>FwO8lI z%TMcSjpI`sYU-&zfu9!p#D56#84!8v4{SwcLd%xSN9!QHhYI-4M}aC z-s$C?db7H=>dn?#i`VGBBXy=u;L#04^2sJ?e=Zw=UGR$5sS;RorhjkGD_(eQkZY+{ z>og<3?1@&&)k<&G<@LgIzj3bSD}-#81F_)<53RQoSQ^uQhpT7Z0GDF{nS~AX86PWF3wa5jNWBpo)Cybd`N}aN zIoV1X>`QfrPGAIEc?Af3?OCq{IC7F++Q>a@N30wds)P3YihtA_wLxs&uO>r&ZU-6G zQr+hS22ul74ADvjy*E(P_v?2iyw?kgDal~Pf*kc=udSL*P5oMIl9lQ{C$NQ_BIm>6 z_loIFRI-P@*YP_k#g)wU$TMileJX$Ie`P{V(?^|9U8YUk+Y-^lxmuw z2fk{?(RxuUw}02-J(cl#DHrl0?m2;hL}4Z1-C zLu=HI`(*BUy_8F0bt5p0_?k&L%a+%Rrd!oQ@g#6^FLQA{)fTz9PsBcBQ^JSmw(2Dt zZb$j$zEqQDugMUnRQK%_f`XNt5WKXaFaT28m*RQ)mVb52Jir6>OFiwOL$BNhI>@9A z_R7otS zG)^eKYb6qs6V^lk$25wAXJ_e1Zjtv-Ctn7a?{Cr=d#C;-RH##~R&h^%r@)FkLaxMb@XrQg`*nbp-Nzl`KyvxYm(}Ja<%<7{iKqs zZ=br>e2s|CRV6UNrjhsx=Nh|R>Rbb@eX5Ag)qf&KtWf!v?i(U==Fwo$9NBMT%!2(vdhfXBrp}XGKn)ydO&*w=zHpURb6#f9bWC% z2-tZfUgL1e&ebI_wY?&VvrS@rHLFFQnpibHWAo1?am`$d1h#^be8$zIp3+G+mPCJ1 z^?&k~YW^EV-g&1m+3q#hB7vy{ldY=qNYyF_#Tk{yuXzlKpU&0%51VMsJx!*?jL1gjjgsg2 zDR}QZlDlo*C`n5v_Pv*gq{UoACoqb!PJdv?VW+L7;aK_>O=|U6vM52UdMU1_v-Bk& z@{86+wy`TpOpoZEj;hf0t>&5{FqH$cYAfma#fKun=Q{F{dXlwjl44~ptrqDoZFoPP zj^aqYjIHf!e6%=sS%k#WhLh6MQ8uY>JJ-}J1aICV7q@9~KPrz^D<>wm=|LzhSAUN@ zypQWWCnne2NyxP|_pRnyO<-O$is7=B_r2qnYL&!_kcxaFc06}Y9`4`fUXnOVUig>& zTFkWxfg`|K!?EO%n4@h_Yl)b!qxwp=vIp|b`p6h<_E92|U5Ts_o4Trp5SR}%Qsx>1 zj8v-I$bNV4NAD8S2stA*h?iS$e}5}E=YFgY0{rwPqVfwmtX$XTKK&^~Hmy93BK|c# zk+{dECjyeZluMJft)V-C+m^duH2L~K59j+HP>-md?)f~s6Ic!~QgV$?B*1ti6TYRes)quXr@wfuwjKv2U7WTCnVUZPq^4Soaf{%D@04C4XgXBk_*S zYy|oc7hMe@FeQr+Gh&0ncUY;PxAmms-j}3$&Tr{30#iC~n4ZpSU?&~#k>Bss!@X9# z2NQ`ok@+4rckic?;qSmSIQcI4o?({9@%~;piOYCAwHWe~IIT#K`27R@+dX;aScOKySGLPp$Ku6$z3ObB(Gh*Uz00000NkvXXu0mjfj?j#K delta 5194 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 0 ? "+" : "-") + diff, x + 24, y + 6 + 10); + g.drawString((diff > 0 ? "+" : "") + diff, x + 24, y + 6 + 10); } } } From 5f11743d761bfe750c9b8b223ba86180cc5ac880 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 15:14:18 +0200 Subject: [PATCH 06/34] Fix warning calculation --- apps/widbaroalarm/ChangeLog | 3 ++- apps/widbaroalarm/widget.js | 45 +++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/apps/widbaroalarm/ChangeLog b/apps/widbaroalarm/ChangeLog index d125e62e1..11f26b353 100644 --- a/apps/widbaroalarm/ChangeLog +++ b/apps/widbaroalarm/ChangeLog @@ -3,4 +3,5 @@ 0.03: Fix crash 0.04: Use Prompt with dismiss and pause Improve barometer value median calculation -0.05: Show difference of last measurement to pressure average of the the last three hours in the widget +0.05: Fix warning calculation + Show difference of last measurement to pressure average of the the last three hours in the widget diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index bb8447588..4fe62378d 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -68,9 +68,12 @@ function showAlarm(body, key) { }, 20000); } +/* + * returns true if an alarm should be triggered + */ function doWeNeedToWarn(key) { const tsNow = Math.round(Date.now() / 1000); // seconds - return setting(key) == 0 || setting(key) < tsNow; + return setting(key) == undefined || setting(key) == 0 || setting(key) < tsNow; } function checkForAlarms(pressure) { @@ -96,26 +99,26 @@ function checkForAlarms(pressure) { if (setting("lowalarm")) { // Is below the alarm threshold? if (pressure <= setting("min")) { - if (!doWeNeedToWarn("lastLowWarningTs")) { + if (!doWeNeedToWarn("lowWarnTs")) { showAlarm("Pressure low: " + Math.round(pressure) + " hPa", - "lastLowWarningTs"); + "lowWarnTs"); alreadyWarned = true; } } else { - saveSetting("lastLowWarningTs", 0); + saveSetting("lowWarnTs", 0); } } if (setting("highalarm")) { // Is above the alarm threshold? if (pressure >= setting("max")) { - if (doWeNeedToWarn("lastHighWarningTs")) { + if (doWeNeedToWarn("highWarnTs")) { showAlarm("Pressure high: " + Math.round(pressure) + " hPa", - "lastHighWarningTs"); + "highWarnTs"); alreadyWarned = true; } } else { - saveSetting("lastHighWarningTs", 0); + saveSetting("highWarnTs", 0); } } @@ -124,9 +127,9 @@ function checkForAlarms(pressure) { const drop3halarm = setting("drop3halarm"); const raise3halarm = setting("raise3halarm"); if (drop3halarm > 0 || raise3halarm > 0) { - // we need at least 30min of data for reliable detection + // we need at least 30 minutes of data for reliable detection const diffDateAge = Math.abs(history3[0]["ts"] - ts); - if (diffDateAge < 10 * 60) { // todo change to 1800 + if (diffDateAge < 30 * 60) { return; } @@ -137,34 +140,38 @@ function checkForAlarms(pressure) { // drop alarm if (drop3halarm > 0 && oldestPressure > pressure) { - if (diffPressure > drop3halarm) { - if (doWeNeedToWarn("lastDropWarningTs")) { + if (diffPressure >= drop3halarm) { + if (doWeNeedToWarn("dropWarnTs")) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", - "lastDropWarningTs"); + "dropWarnTs"); } } else { - saveSetting("lastDropWarningTs", 0); + if (ts > setting("dropWarnTs")) + saveSetting("dropWarnTs", 0); } } else { - saveSetting("lastDropWarningTs", 0); + if (ts > setting("dropWarnTs")) + saveSetting("dropWarnTs", 0); } // raise alarm if (raise3halarm > 0 && oldestPressure < pressure) { - if (diffPressure > raise3halarm) { - if (doWeNeedToWarn("lastRaiseWarningTs")) { + if (diffPressure >= raise3halarm) { + if (doWeNeedToWarn("raiseWarnTs")) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", - "lastRaiseWarningTs"); + "raiseWarnTs"); } } else { - saveSetting("lastRaiseWarningTs", 0); + if (ts > setting("raiseWarnTs")) + saveSetting("raiseWarnTs", 0); } } else { - saveSetting("lastRaiseWarningTs", 0); + if (ts > setting("raiseWarnTs")) + saveSetting("raiseWarnTs", 0); } } } From c2c7d168a7560e88dcdf5b48c233d14add5173bb Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 22 Jun 2022 15:40:36 +0200 Subject: [PATCH 07/34] Fix logging of entries & calculation of alarms --- apps/widbaroalarm/widget.js | 71 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index 4fe62378d..f8d98719c 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -129,55 +129,54 @@ function checkForAlarms(pressure) { if (drop3halarm > 0 || raise3halarm > 0) { // we need at least 30 minutes of data for reliable detection const diffDateAge = Math.abs(history3[0]["ts"] - ts); - if (diffDateAge < 30 * 60) { - return; - } + if (diffDateAge > 30 * 60) { + // Get oldest entry: + const oldestPressure = history3[0]["p"]; + if (oldestPressure != undefined && oldestPressure > 0) { + const diffPressure = Math.abs(oldestPressure - pressure); - // Get oldest entry: - const oldestPressure = history3[0]["p"]; - if (oldestPressure != undefined && oldestPressure > 0) { - const diffPressure = Math.abs(oldestPressure - pressure); - - // drop alarm - if (drop3halarm > 0 && oldestPressure > pressure) { - if (diffPressure >= drop3halarm) { - if (doWeNeedToWarn("dropWarnTs")) { - showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + - Math.round(oldestPressure) + " to " + - Math.round(pressure) + " hPa", - "dropWarnTs"); + // drop alarm + if (drop3halarm > 0 && oldestPressure > pressure) { + if (diffPressure >= drop3halarm) { + if (doWeNeedToWarn("dropWarnTs")) { + showAlarm((Math.round(diffPressure * 10) / 10) + + " hPa/3h from " + Math.round(oldestPressure) + + " to " + Math.round(pressure) + " hPa", + "dropWarnTs"); + } + } else { + if (ts > setting("dropWarnTs")) + saveSetting("dropWarnTs", 0); } } else { if (ts > setting("dropWarnTs")) saveSetting("dropWarnTs", 0); } - } else { - if (ts > setting("dropWarnTs")) - saveSetting("dropWarnTs", 0); - } - // raise alarm - if (raise3halarm > 0 && oldestPressure < pressure) { - if (diffPressure >= raise3halarm) { - if (doWeNeedToWarn("raiseWarnTs")) { - showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + - Math.round(oldestPressure) + " to " + - Math.round(pressure) + " hPa", - "raiseWarnTs"); + // raise alarm + if (raise3halarm > 0 && oldestPressure < pressure) { + if (diffPressure >= raise3halarm) { + if (doWeNeedToWarn("raiseWarnTs")) { + showAlarm((Math.round(diffPressure * 10) / 10) + + " hPa/3h from " + Math.round(oldestPressure) + + " to " + Math.round(pressure) + " hPa", + "raiseWarnTs"); + } + } else { + if (ts > setting("raiseWarnTs")) + saveSetting("raiseWarnTs", 0); } } else { if (ts > setting("raiseWarnTs")) saveSetting("raiseWarnTs", 0); } - } else { - if (ts > setting("raiseWarnTs")) - saveSetting("raiseWarnTs", 0); } } } } history3.push(d); + // write data to storage storage.writeJSON(LOG_FILE, history3); @@ -219,6 +218,7 @@ function check() { medianPressure = Math.round(E.sum(median.slice(mid - 4, mid + 5)) / 9); if (medianPressure > 0) { turnOff(); + draw(); checkForAlarms(medianPressure); } } @@ -248,17 +248,16 @@ function draw() { g.setFont("6x8", 1).setFontAlign(1, 0); const x = this.x, y = this.y; if (medianPressure == undefined) { - // trigger a new check check(); // lets load last value from log (if available) if (history3.length > 0) { medianPressure = history3[history3.length - 1]["p"]; + g.drawString(Math.round(medianPressure), x + 24, y + 6); + } else { + g.drawString("...", x + 24, y + 6); } - - g.drawString("...", x + 24, y + 6); - g.drawString(Math.round(medianPressure), x + 24, y + 6); } else { g.drawString(Math.round(medianPressure), x + 24, y + 6); } @@ -269,7 +268,7 @@ function draw() { if (threeHourAvrPressure != undefined) { if (medianPressure != undefined) { const diff = Math.round(medianPressure - threeHourAvrPressure); - g.drawString((diff > 0 ? "+" : "") + diff, x + 24, y + 6 + 10); + g.drawString((diff > 0 ? "+" : "" + diff), x + 24, y + 6 + 10); } } } From 634b0bb29aafe0fc467b72ca86a3e46afc5bcdd0 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 23 Jun 2022 11:43:28 +0200 Subject: [PATCH 08/34] Better code structure --- apps/widbaroalarm/widget.js | 47 +++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index f8d98719c..711d12a94 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -71,20 +71,34 @@ function showAlarm(body, key) { /* * returns true if an alarm should be triggered */ -function doWeNeedToWarn(key) { +function doWeNeedToAlarm(key) { const tsNow = Math.round(Date.now() / 1000); // seconds return setting(key) == undefined || setting(key) == 0 || setting(key) < tsNow; } -function checkForAlarms(pressure) { +function handlePressureValue(pressure) { if (pressure == undefined || pressure <= 0) return; - let alreadyWarned = false; - const ts = Math.round(Date.now() / 1000); // seconds const d = {"ts" : ts, "p" : pressure}; + history3.push(d); + + // write data to storage + storage.writeJSON(LOG_FILE, history3); + + calculcate3hAveragePressure(); + + if (setting("lowalarm") || setting("highalarm") || setting("drop3halarm") || + setting("raise3halarm")) { + checkForAlarms(pressure, ts); + } +} + +function checkForAlarms(pressure, ts) { + let alreadyWarned = false; + // delete entries older than 3h for (let i = 0; i < history3.length; i++) { if (history3[i]["ts"] < ts - (3 * 60 * 60)) { @@ -99,7 +113,7 @@ function checkForAlarms(pressure) { if (setting("lowalarm")) { // Is below the alarm threshold? if (pressure <= setting("min")) { - if (!doWeNeedToWarn("lowWarnTs")) { + if (!doWeNeedToAlarm("lowWarnTs")) { showAlarm("Pressure low: " + Math.round(pressure) + " hPa", "lowWarnTs"); alreadyWarned = true; @@ -112,7 +126,7 @@ function checkForAlarms(pressure) { if (setting("highalarm")) { // Is above the alarm threshold? if (pressure >= setting("max")) { - if (doWeNeedToWarn("highWarnTs")) { + if (doWeNeedToAlarm("highWarnTs")) { showAlarm("Pressure high: " + Math.round(pressure) + " hPa", "highWarnTs"); alreadyWarned = true; @@ -138,7 +152,7 @@ function checkForAlarms(pressure) { // drop alarm if (drop3halarm > 0 && oldestPressure > pressure) { if (diffPressure >= drop3halarm) { - if (doWeNeedToWarn("dropWarnTs")) { + if (doWeNeedToAlarm("dropWarnTs")) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", @@ -156,7 +170,7 @@ function checkForAlarms(pressure) { // raise alarm if (raise3halarm > 0 && oldestPressure < pressure) { if (diffPressure >= raise3halarm) { - if (doWeNeedToWarn("raiseWarnTs")) { + if (doWeNeedToAlarm("raiseWarnTs")) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", @@ -174,13 +188,6 @@ function checkForAlarms(pressure) { } } } - - history3.push(d); - - // write data to storage - storage.writeJSON(LOG_FILE, history3); - - calculcate3hAveragePressure(); } function calculcate3hAveragePressure() { @@ -202,7 +209,7 @@ function calculcate3hAveragePressure() { take the middle one (median) turn off barometer power */ -function check() { +function getPressureValue() { if (stop) return; const MEDIANLENGTH = 20; @@ -219,7 +226,7 @@ function check() { if (medianPressure > 0) { turnOff(); draw(); - checkForAlarms(medianPressure); + handlePressureValue(medianPressure); } } }); @@ -232,7 +239,7 @@ function turnOff() { Bangle.setBarometerPower(false, "widbaroalarm"); } -function reload() { check(); } +function reload() { getPressureValue(); } function draw() { if (global.WIDGETS != undefined && typeof global.WIDGETS === "object") { @@ -249,7 +256,7 @@ function draw() { const x = this.x, y = this.y; if (medianPressure == undefined) { // trigger a new check - check(); + getPressureValue(); // lets load last value from log (if available) if (history3.length > 0) { @@ -275,7 +282,7 @@ function draw() { } if (interval > 0) { - setInterval(check, interval * 60000); + setInterval(getPressureValue, interval * 60000); } draw(); })(); From 99ec754622d3c432bf38d9c1ba9753ab645e6eab Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 23 Jun 2022 16:16:59 +0200 Subject: [PATCH 09/34] Fix tendency format --- apps/widbaroalarm/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index 711d12a94..b4136fd69 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -275,7 +275,7 @@ function draw() { if (threeHourAvrPressure != undefined) { if (medianPressure != undefined) { const diff = Math.round(medianPressure - threeHourAvrPressure); - g.drawString((diff > 0 ? "+" : "" + diff), x + 24, y + 6 + 10); + g.drawString((diff > 0 ? "+" : "") + diff, x + 24, y + 6 + 10); } } } From 9c63ebf9daa633c49e1403f8e1e154b1c05b8e7d Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 23 Jun 2022 21:29:21 +0200 Subject: [PATCH 10/34] Bump version --- apps/widbaroalarm/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbaroalarm/metadata.json b/apps/widbaroalarm/metadata.json index 101d09f3d..17630eaa8 100644 --- a/apps/widbaroalarm/metadata.json +++ b/apps/widbaroalarm/metadata.json @@ -2,7 +2,7 @@ "id": "widbaroalarm", "name": "Barometer Alarm Widget", "shortName": "Barometer Alarm", - "version": "0.04", + "version": "0.05", "description": "A widget that can alarm on when the pressure reaches defined thresholds.", "icon": "widget.png", "type": "widget", From 936702d9fc45388ebfefebd62fad7c7bac20fe77 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 24 Jun 2022 11:30:12 +0200 Subject: [PATCH 11/34] Fix widget drawing without having the actual widget area --- apps/widbaroalarm/widget.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index b4136fd69..cd3e9b2e7 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -254,6 +254,8 @@ function draw() { if (setting("show")) { g.setFont("6x8", 1).setFontAlign(1, 0); const x = this.x, y = this.y; + if (this.x == undefined) + return; // widget not yet there if (medianPressure == undefined) { // trigger a new check getPressureValue(); From e161a030c158b57923692570d261c8c6b0287396 Mon Sep 17 00:00:00 2001 From: Marco H Date: Mon, 27 Jun 2022 12:58:33 +0200 Subject: [PATCH 12/34] Fix deletion of old entries in log Only use valid pressure values --- apps/widbaroalarm/widget.js | 38 +++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index cd3e9b2e7..9740da68d 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -76,6 +76,12 @@ function doWeNeedToAlarm(key) { return setting(key) == undefined || setting(key) == 0 || setting(key) < tsNow; } +function isValidPressureValue(pressure) { + if (pressure == undefined || pressure <= 0) + return false; + return pressure > 800 && pressure < 1200; // very rough values +} + function handlePressureValue(pressure) { if (pressure == undefined || pressure <= 0) return; @@ -85,6 +91,17 @@ function handlePressureValue(pressure) { history3.push(d); + // delete entries older than 3h + for (let i = 0; i < history3.length; i++) { + if (history3[i]["ts"] < ts - (3 * 60 * 60)) { + history3.shift(); + } + } + // delete oldest entries until we have max 50 + while (history3.length > 50) { + history3.shift(); + } + // write data to storage storage.writeJSON(LOG_FILE, history3); @@ -99,17 +116,6 @@ function handlePressureValue(pressure) { function checkForAlarms(pressure, ts) { let alreadyWarned = false; - // delete entries older than 3h - for (let i = 0; i < history3.length; i++) { - if (history3[i]["ts"] < ts - (3 * 60 * 60)) { - history3.shift(); - } - } - // delete oldest entries until we have max 50 - while (history3.length > 50) { - history3.shift(); - } - if (setting("lowalarm")) { // Is below the alarm threshold? if (pressure <= setting("min")) { @@ -217,8 +223,12 @@ function getPressureValue() { Bangle.on('pressure', function(e) { while (currentPressures.length > MEDIANLENGTH) currentPressures.pop(); - currentPressures.unshift(e.pressure); - median = currentPressures.slice().sort(); + + const pressure = e.pressure; + if (isValidPressureValue(pressure)) { + currentPressures.unshift(pressure); + median = currentPressures.slice().sort(); + } if (median.length > 10) { var mid = median.length >> 1; @@ -231,7 +241,7 @@ function getPressureValue() { } }); - setTimeout(function() { turnOff(); }, 10000); + setTimeout(function() { turnOff(); }, 30000); } function turnOff() { From 803c65eb75379f06f68349032824dd9554336e4d Mon Sep 17 00:00:00 2001 From: Marco H Date: Mon, 27 Jun 2022 12:59:21 +0200 Subject: [PATCH 13/34] Update changelog --- apps/widbaroalarm/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbaroalarm/ChangeLog b/apps/widbaroalarm/ChangeLog index 11f26b353..f0ab89928 100644 --- a/apps/widbaroalarm/ChangeLog +++ b/apps/widbaroalarm/ChangeLog @@ -5,3 +5,4 @@ Improve barometer value median calculation 0.05: Fix warning calculation Show difference of last measurement to pressure average of the the last three hours in the widget + Only use valid pressure values From 11507d5eb450e51a07089a1c34f67f29360c2588 Mon Sep 17 00:00:00 2001 From: Marco H Date: Mon, 27 Jun 2022 13:50:58 +0200 Subject: [PATCH 14/34] Improve performance for deletion Better titles for alarms --- apps/widbaroalarm/widget.js | 48 ++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index 9740da68d..229bac721 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -30,13 +30,13 @@ const interval = setting("interval"); let history3 = storage.readJSON(LOG_FILE, true) || []; // history of recent 3 hours -function showAlarm(body, key) { +function showAlarm(body, key, type) { if (body == undefined) return; stop = true; E.showPrompt(body, { - title : "Pressure alarm", + title : "Pressure " + (type != undefined ? type : "alarm"), buttons : {"Ok" : 1, "Dismiss" : 2, "Pause" : 3} }).then(function(v) { const tsNow = Math.round(Date.now() / 1000); // seconds @@ -91,16 +91,19 @@ function handlePressureValue(pressure) { history3.push(d); + // delete oldest entries until we have max 50 + while (history3.length > 50) { + history3.shift(); + } + // delete entries older than 3h for (let i = 0; i < history3.length; i++) { if (history3[i]["ts"] < ts - (3 * 60 * 60)) { history3.shift(); + } else { + break; } } - // delete oldest entries until we have max 50 - while (history3.length > 50) { - history3.shift(); - } // write data to storage storage.writeJSON(LOG_FILE, history3); @@ -120,8 +123,8 @@ function checkForAlarms(pressure, ts) { // Is below the alarm threshold? if (pressure <= setting("min")) { if (!doWeNeedToAlarm("lowWarnTs")) { - showAlarm("Pressure low: " + Math.round(pressure) + " hPa", - "lowWarnTs"); + showAlarm("Pressure low: " + Math.round(pressure) + " hPa", "lowWarnTs", + "low"); alreadyWarned = true; } } else { @@ -134,7 +137,7 @@ function checkForAlarms(pressure, ts) { if (pressure >= setting("max")) { if (doWeNeedToAlarm("highWarnTs")) { showAlarm("Pressure high: " + Math.round(pressure) + " hPa", - "highWarnTs"); + "highWarnTs", "high"); alreadyWarned = true; } } else { @@ -162,7 +165,7 @@ function checkForAlarms(pressure, ts) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", - "dropWarnTs"); + "dropWarnTs", "drop"); } } else { if (ts > setting("dropWarnTs")) @@ -180,7 +183,7 @@ function checkForAlarms(pressure, ts) { showAlarm((Math.round(diffPressure * 10) / 10) + " hPa/3h from " + Math.round(oldestPressure) + " to " + Math.round(pressure) + " hPa", - "raiseWarnTs"); + "raiseWarnTs", "raise"); } } else { if (ts > setting("raiseWarnTs")) @@ -249,23 +252,23 @@ function turnOff() { Bangle.setBarometerPower(false, "widbaroalarm"); } -function reload() { getPressureValue(); } - function draw() { if (global.WIDGETS != undefined && typeof global.WIDGETS === "object") { global.WIDGETS["baroalarm"] = { width : setting("show") ? 24 : 0, - reload : reload, area : "tr", draw : draw }; } g.reset(); + + if (this.x == undefined) + return; // widget not yet there + + g.clearRect(this.x, this.y, this.x + this.width - 1, this.y + 23); + if (setting("show")) { g.setFont("6x8", 1).setFontAlign(1, 0); - const x = this.x, y = this.y; - if (this.x == undefined) - return; // widget not yet there if (medianPressure == undefined) { // trigger a new check getPressureValue(); @@ -273,12 +276,12 @@ function draw() { // lets load last value from log (if available) if (history3.length > 0) { medianPressure = history3[history3.length - 1]["p"]; - g.drawString(Math.round(medianPressure), x + 24, y + 6); + g.drawString(Math.round(medianPressure), this.x + 24, this.y + 6); } else { - g.drawString("...", x + 24, y + 6); + g.drawString("...", this.x + 24, this.y + 6); } } else { - g.drawString(Math.round(medianPressure), x + 24, y + 6); + g.drawString(Math.round(medianPressure), this.x + 24, this.y + 6); } if (threeHourAvrPressure == undefined) { @@ -287,7 +290,8 @@ function draw() { if (threeHourAvrPressure != undefined) { if (medianPressure != undefined) { const diff = Math.round(medianPressure - threeHourAvrPressure); - g.drawString((diff > 0 ? "+" : "") + diff, x + 24, y + 6 + 10); + g.drawString((diff > 0 ? "+" : "") + diff, this.x + 24, + this.y + 6 + 10); } } } @@ -296,5 +300,5 @@ function draw() { if (interval > 0) { setInterval(getPressureValue, interval * 60000); } -draw(); +getPressureValue(); })(); From ee994e027fe21fd94041ec73bbe795787bfbacca Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:12:26 +0200 Subject: [PATCH 15/34] Version 0.02 of "Info" app including weather data --- apps/info/ChangeLog | 3 +- apps/info/info.app.js | 144 ++++++++++++++++++++++++------------- apps/info/metadata.json | 2 +- apps/info/screenshot_1.png | Bin 3552 -> 3399 bytes apps/info/screenshot_2.png | Bin 3334 -> 3825 bytes apps/info/screenshot_3.png | Bin 3455 -> 3620 bytes 6 files changed, 98 insertions(+), 51 deletions(-) diff --git a/apps/info/ChangeLog b/apps/info/ChangeLog index 07afedd21..400e7a119 100644 --- a/apps/info/ChangeLog +++ b/apps/info/ChangeLog @@ -1 +1,2 @@ -0.01: Release \ No newline at end of file +0.01: Release +0.02: Recfactoring and show weather data. \ No newline at end of file diff --git a/apps/info/info.app.js b/apps/info/info.app.js index c61a88045..9de80affc 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -1,27 +1,90 @@ -var s = require("Storage"); +const storage = require("Storage"); const locale = require('locale'); var ENV = process.env; var W = g.getWidth(), H = g.getHeight(); var screen = 0; -const maxScreen = 2; + + +var screens = [ + { + name: "General", + items: [ + {name: "Steps", fun: () => getSteps()}, + {name: "HRM", fun: () => getBpm()}, + {name: "", fun: () => ""}, + {name: "Temp.", fun: () => getWeatherTemp()}, + {name: "Humidity", fun: () => getWeatherHumidity()}, + {name: "Wind", fun: () => getWeatherWind()}, + ] + }, + { + name: "Hardware", + items: [ + {name: "Battery", fun: () => E.getBattery() + "%"}, + {name: "Charge?", fun: () => Bangle.isCharging() ? "Yes" : "No"}, + {name: "TempInt.", fun: () => locale.temp(parseInt(E.getTemperature()))}, + {name: "Bluetooth", fun: () => NRF.getSecurityStatus().connected ? "Conn" : "NoConn"}, + {name: "GPS", fun: () => Bangle.isGPSOn() ? "On" : "Off"}, + {name: "Compass", fun: () => Bangle.isCompassOn() ? "On" : "Off"}, + ] + }, + { + name: "Software", + items: [ + {name: "Firmw.", fun: () => ENV.VERSION}, + {name: "Boot.", fun: () => getVersion("boot.info")}, + {name: "Settings.", fun: () => getVersion("setting.info")}, + {name: "Storage.", fun: () => ""}, + {name: " Total", fun: () => ENV.STORAGE>>10}, + {name: " Free", fun: () => require("Storage").getFree()>>10}, + ] + } +]; + + +function getWeatherTemp(){ + try { + var weather = storage.readJSON('weather.json').weather; + return locale.temp(weather.temp-273.15); + } catch(ex) { } + + return "?"; +} + + +function getWeatherHumidity(){ + try { + var weather = storage.readJSON('weather.json').weather; + return weather.hum = weather.hum + "%"; + } catch(ex) { } + + return "?"; +} + + +function getWeatherWind(){ + try { + var weather = storage.readJSON('weather.json').weather; + var speed = locale.speed(weather.wind).replace("mph", ""); + return Math.round(speed * 1.609344) + "kph"; + } catch(ex) { } + + return "?"; +} + function getVersion(file) { - var j = s.readJSON(file,1); + var j = storage.readJSON(file,1); var v = ("object"==typeof j)?j.version:false; return v?((v?"v"+v:"Unknown")):"NO "; } -function drawData(name, value, y){ - g.drawString(name, 5, y); - g.drawString(value, 100, y); -} - function getSteps(){ try{ return Bangle.getHealthStatus("day").steps; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } @@ -29,53 +92,36 @@ function getBpm(){ try{ return Math.round(Bangle.getHealthStatus("day").bpm) + "bpm"; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } +function drawData(name, value, y){ + g.drawString(name, 10, y); + g.drawString(value, 100, y); +} + function drawInfo() { g.reset().clearRect(Bangle.appRect); var h=18, y = h;//-h; // Header - g.setFont("Vector", h+2).setFontAlign(0,-1); - g.drawString("--==|| INFO ||==--", W/2, 0); + g.drawLine(0,25,W,25); + g.drawLine(0,26,W,26); + + // Info body depending on screen g.setFont("Vector",h).setFontAlign(-1,-1); + screens[screen].items.forEach(function (item, index){ + drawData(item.name, item.fun(), y+=h); + }); - // Dynamic data - if(screen == 0){ - drawData("Steps", getSteps(), y+=h); - drawData("HRM", getBpm(), y+=h); - drawData("Battery", E.getBattery() + "%", y+=h); - drawData("Voltage", E.getAnalogVRef().toFixed(2) + "V", y+=h); - drawData("IntTemp.", locale.temp(parseInt(E.getTemperature())), y+=h); - } - - if(screen == 1){ - drawData("Charging?", Bangle.isCharging() ? "Yes" : "No", y+=h); - drawData("Bluetooth", NRF.getSecurityStatus().connected ? "Conn." : "Disconn.", y+=h); - drawData("GPS", Bangle.isGPSOn() ? "On" : "Off", y+=h); - drawData("Compass", Bangle.isCompassOn() ? "On" : "Off", y+=h); - drawData("HRM", Bangle.isHRMOn() ? "On" : "Off", y+=h); - } - - // Static data - if(screen == 2){ - drawData("Firmw.", ENV.VERSION, y+=h); - drawData("Boot.", getVersion("boot.info"), y+=h); - drawData("Settings", getVersion("setting.info"), y+=h); - drawData("Storage", "", y+=h); - drawData(" Total", ENV.STORAGE>>10, y+=h); - drawData(" Free", require("Storage").getFree()>>10, y+=h); - } - - if(Bangle.isLocked()){ - g.setFont("Vector",h-2).setFontAlign(-1,-1); - g.drawString("Locked", 0, H-h+2); - } - + // Bottom + g.drawLine(0,H-h-3,W,H-h-3); + g.drawLine(0,H-h-2,W,H-h-2); + g.setFont("Vector",h-2).setFontAlign(-1,-1); + g.drawString(screens[screen].name, 2, H-h+2); g.setFont("Vector",h-2).setFontAlign(1,-1); - g.drawString((screen+1) + "/3", W, H-h+2); + g.drawString((screen+1) + "/" + screens.length, W, H-h+2); } drawInfo(); @@ -88,14 +134,15 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; if(isRight){ - screen = (screen + 1) % (maxScreen+1); + screen = (screen + 1) % screens.length; } if(isLeft){ screen -= 1; - screen = screen < 0 ? maxScreen : screen; + screen = screen < 0 ? screens.length-1 : screen; } + Bangle.buzz(40, 0.6); drawInfo(); }); @@ -104,5 +151,4 @@ Bangle.on('lock', function(isLocked) { }); Bangle.loadWidgets(); -for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} -// Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/info/metadata.json b/apps/info/metadata.json index f05f0e134..97aeb687a 100644 --- a/apps/info/metadata.json +++ b/apps/info/metadata.json @@ -1,7 +1,7 @@ { "id": "info", "name": "Info", - "version": "0.01", + "version": "0.02", "description": "An application that displays information such as battery level, steps etc.", "icon": "info.png", "type": "app", diff --git a/apps/info/screenshot_1.png b/apps/info/screenshot_1.png index 97d42a89636e01437a6397075db1dc453ca22fe8..25f5b0a8bea17a3edd50da81e9196af01a22756b 100644 GIT binary patch literal 3399 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 BcGmy^ literal 3552 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 diff --git a/apps/info/screenshot_2.png b/apps/info/screenshot_2.png index 2d25dd4e6ce4166d5a6b48ad7f50231bf643cc95..517a83299fe937020cdbd4e427cc4e7de98ae6e0 100644 GIT binary patch literal 3825 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 C7%aU2 literal 3334 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 diff --git a/apps/info/screenshot_3.png b/apps/info/screenshot_3.png index 782e4a1952f1dc3205f20852edf88e9493edd6d8..6802495f5edb75442a3b7e397ddc19bfe8a4710a 100644 GIT binary patch literal 3620 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 Qdiy{&mUb467rj&d5BxC2SO5S3 literal 3455 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 Xk+%_!CsMW>72tTx)$W-M?(+Wt^h|>m From eee3a8c0af31ee14697696143f1cf9087ad49624 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:36:26 +0200 Subject: [PATCH 16/34] Export a library for other apps --- apps/ha/ChangeLog | 3 +- apps/ha/README.md | 29 +++++++++++++- apps/ha/ha.app.js | 84 +++++----------------------------------- apps/ha/ha.lib.js | 90 +++++++++++++++++++++++++++++++++++++++++++ apps/ha/metadata.json | 3 +- 5 files changed, 132 insertions(+), 77 deletions(-) create mode 100644 apps/ha/ha.lib.js diff --git a/apps/ha/ChangeLog b/apps/ha/ChangeLog index 07afedd21..e78b4ccd0 100644 --- a/apps/ha/ChangeLog +++ b/apps/ha/ChangeLog @@ -1 +1,2 @@ -0.01: Release \ No newline at end of file +0.01: Release +0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. \ No newline at end of file diff --git a/apps/ha/README.md b/apps/ha/README.md index 8005421f1..654a262c8 100644 --- a/apps/ha/README.md +++ b/apps/ha/README.md @@ -1,13 +1,15 @@ # Home Assistant This app integrates your BangleJs into the HomeAssistant. + # How to use Click on the left and right side of the screen to select the triggers that you configured. Click in the middle of the screen to send the trigger to HomeAssistant. ![](screenshot.png) -# First Setup + +# Initial Setup 1.) First of all, make sure that HomeAssistant and the HomeAssistant Android App works. 2.) Open your BangleJs Gadgetbridge App, click on the Settings icon of your BangleJs and enable "Allow Intent Access" @@ -22,6 +24,7 @@ configured. Click in the middle of the screen to send the trigger to HomeAssista This setup must be done only once -- now you are ready to configure your BangleJS to control some devices or entities in your HomeAssistant :) + # Setup Trigger 1.) Upload the app and all corresponding triggers through the AppStore UI. You must specify the display name, the trigger as well as an icon. @@ -38,12 +41,36 @@ The following icons are currently supported: 3.) Don't forget to select the action that should be executed at the bottom of each automation. + # Default Trigger This app also implements two default trigger that can always be used: - APP_STARTED -- Will be sent whenever the app is started. So you could do some actions already when the app is sarted without the need of any user interaction. - TRIGGER -- Will be sent whenever some trigger is executed. So you could generically listen to that. +# How to use the library (ha.lib.js) in my own app/clk +This app inlcludes a library that can be used by other apps or clocks +to read all configured intents or to send a trigger. Example code: + +```js +// First of all impport the library +var ha = require("ha.lib.js"); + +// You can read all triggers that a user configured simply via +var triggers = ha.getTriggers(); + +// Get display name and icon of trigger +var display = triggers[0].display; +var icon = triggers[0].getIcon(); + +// Trigger the first configured trigger +ha.sendTrigger(triggers[0].trigger); + +// Send a custom trigger that is not configured by a user +ha.sendTrigger("MY_CUSTOM_TRIGGER"); +``` + + # FAQ ## Sometimes the trigger is not executed diff --git a/apps/ha/ha.app.js b/apps/ha/ha.app.js index 85f926138..9ad8db8fa 100644 --- a/apps/ha/ha.app.js +++ b/apps/ha/ha.app.js @@ -1,72 +1,10 @@ -var storage = require("Storage"); +/** + * This app uses the ha library to send trigger to HomeAssistant. + */ +var ha = require("ha.lib.js"); var W = g.getWidth(), H = g.getHeight(); var position=0; - - -// Note: All icons should have 48x48 pixels -function getIcon(icon){ - if(icon == "light"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAMBwAFE4AFDgYFJjgFBnAFBjwXBvAFBh4jBuAFCAQPwAQMHAQPgEQQCBEgcf/AvDn/8Aof//5GDAoJOBh+BAoOB+EP8YFB4fwgfnAoPnGANHAoPjHYQFBHYQFd44pDg47C4/gh/DIIZNFLIplGgF//wFIgZ9BRIUHRII7Ch4FBUIUOAoKzCjwFEhgCBmDpIVooFFh4oCAA4LFC5b7BAob1BAYI=")) - }; - } else if(icon == "door"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAM4Aok/4AED///Aov4Aon8DgQGBAv4FpnIFKJv4FweAQFFAgQFB8AFDnADC")) - }; - } else if (icon == "fire"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("ABsDAokBwAFE4AFE8AFE+AFE/AFJgf8Aon+AocHAokP/8QAokYAoUfAok//88ApF//4kDAo//AgMQAgIFCjgFEjwFCOYIFFHQIFDn/+AoJ/BAoIqBAoN//xCBAoI5BDIPAgP//gFB8AFChYFBgf//EJAogOBAoSgBAoMHAQIFEFgXAAoJEBv4FCNoQFGVYd/wAFEYYIFIvwCBDoV8UwQCBcgUPwDwDfQMBaIYADA")) - }; - } - - // Default is always the HA icon - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AD8BwAFDg/gAocP+AFDj4FEn/8Aod//wFD/1+FAf4j+8AoMD+EPDAUH+OPAoUP+fPAoUfBYk/C4l/EYIwC//8n//FwIFEgYFD4EH+E8nkP8BdBAonjjk44/wj/nzk58/4gAFDF4PgCIMHAoPwhkwh4FB/EEkEfIIWAHwIFC4A+BAoXgg4FDL4IFDL4IFDLIYFkAEQA==")) - }; -} - -// Try to read custom actions, otherwise use default -var triggers = [ - {display: "Not found.", trigger: "NOP", icon: "ha"}, -]; - -try{ - triggers = storage.read("ha.trigger.json"); - triggers = JSON.parse(triggers); -} catch(e) { - // In case there are no user triggers yet, we show the default... -} - - -function sendIntent(trigger){ - var retries=3; - - while(retries > 0){ - try{ - // Send a startup trigger such that we could also execute - // an action when the app is started :) - Bluetooth.println(JSON.stringify({ - t:"intent", - action:"com.espruino.gadgetbridge.banglejs.HA", - extra:{ - trigger: trigger - }}) - ); - retries = -1; - - } catch(e){ - retries--; - } - } -} +var triggers = ha.getTriggers(); function draw() { @@ -78,7 +16,7 @@ function draw() { var w = g.stringWidth(trigger.display); g.setFontAlign(-1,-1); - var icon = getIcon(trigger.icon); + var icon = ha.getIcon(trigger.getIcon()); g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2); g.drawString("Home", icon.width + 20, H/5); g.drawString("Assistant", icon.width + 18, H/5+24); @@ -112,13 +50,9 @@ Bangle.on('touch', function(btn, e){ } if(!isRight && !isLeft){ - - // Send a default intent that we triggered something. - sendIntent("TRIGGER"); - // Now send the selected trigger Bangle.buzz(80, 0.6).then(()=>{ - sendIntent(triggers[position].trigger); + ha.sendTrigger(triggers[position].trigger); setTimeout(()=>{ Bangle.buzz(80, 0.6); }, 250); @@ -126,12 +60,14 @@ Bangle.on('touch', function(btn, e){ } }); + // Send intent that the we started the app. -sendIntent("APP_STARTED"); +ha.sendTrigger("APP_STARTED"); // Next load the widgets and draw the app Bangle.loadWidgets(); Bangle.drawWidgets(); +// Draw app draw(); setWatch(_=>load(), BTN1); diff --git a/apps/ha/ha.lib.js b/apps/ha/ha.lib.js new file mode 100644 index 000000000..0de98d62a --- /dev/null +++ b/apps/ha/ha.lib.js @@ -0,0 +1,90 @@ +/** + * This library can be used to read all triggers that a user + * configured and send a trigger to homeassistant. + */ +function _getIcon(trigger){ + icon = trigger.icon; + if(icon == "light"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAMBwAFE4AFDgYFJjgFBnAFBjwXBvAFBh4jBuAFCAQPwAQMHAQPgEQQCBEgcf/AvDn/8Aof//5GDAoJOBh+BAoOB+EP8YFB4fwgfnAoPnGANHAoPjHYQFBHYQFd44pDg47C4/gh/DIIZNFLIplGgF//wFIgZ9BRIUHRII7Ch4FBUIUOAoKzCjwFEhgCBmDpIVooFFh4oCAA4LFC5b7BAob1BAYI=")) + }; + } else if(icon == "door"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAM4Aok/4AED///Aov4Aon8DgQGBAv4FpnIFKJv4FweAQFFAgQFB8AFDnADC")) + }; + } else if (icon == "fire"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("ABsDAokBwAFE4AFE8AFE+AFE/AFJgf8Aon+AocHAokP/8QAokYAoUfAok//88ApF//4kDAo//AgMQAgIFCjgFEjwFCOYIFFHQIFDn/+AoJ/BAoIqBAoN//xCBAoI5BDIPAgP//gFB8AFChYFBgf//EJAogOBAoSgBAoMHAQIFEFgXAAoJEBv4FCNoQFGVYd/wAFEYYIFIvwCBDoV8UwQCBcgUPwDwDfQMBaIYADA")) + }; + } + + // Default is always the HA icon + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AD8BwAFDg/gAocP+AFDj4FEn/8Aod//wFD/1+FAf4j+8AoMD+EPDAUH+OPAoUP+fPAoUfBYk/C4l/EYIwC//8n//FwIFEgYFD4EH+E8nkP8BdBAonjjk44/wj/nzk58/4gAFDF4PgCIMHAoPwhkwh4FB/EEkEfIIWAHwIFC4A+BAoXgg4FDL4IFDL4IFDLIYFkAEQA==")) + }; +} + +exports.getTriggers = function(){ + var triggers = [ + {display: "Empty", trigger: "NOP", icon: "ha"}, + ]; + + try{ + triggers = require("Storage").read("ha.trigger.json"); + triggers = JSON.parse(triggers); + + // We lazy load all icons, otherwise, we have to keep + // all the icons n times in memory which can be + // problematic for embedded devices. Therefore, + // we lazy load icons only if needed using the getIcon + // method of each trigger... + triggers.forEach(trigger => { + trigger.getIcon = function(){ + return _getIcon(trigger); + } + }) + } catch(e) { + // In case there are no user triggers yet, we show the default... + } + + return triggers; +} + +exports.sendTrigger = function(triggerName){ + var retries=3; + + while(retries > 0){ + try{ + // First send a generic trigger which can be used + // to listen to all trigger send. + Bluetooth.println(JSON.stringify({ + t:"intent", + action:"com.espruino.gadgetbridge.banglejs.HA", + extra:{ + trigger: "TRIGGER" + }}) + ); + + // Now lets send the trigger that we sould send. + Bluetooth.println(JSON.stringify({ + t:"intent", + action:"com.espruino.gadgetbridge.banglejs.HA", + extra:{ + trigger: triggerName + }}) + ); + retries = -1; + + } catch(e){ + retries--; + } + } +} \ No newline at end of file diff --git a/apps/ha/metadata.json b/apps/ha/metadata.json index 0f9929d8c..63308b933 100644 --- a/apps/ha/metadata.json +++ b/apps/ha/metadata.json @@ -1,7 +1,7 @@ { "id": "ha", "name": "HomeAssistant", - "version": "0.01", + "version": "0.02", "description": "Integrates your BangleJS into HomeAssistant.", "icon": "ha.png", "type": "app", @@ -19,6 +19,7 @@ ], "storage": [ {"name":"ha.app.js","url":"ha.app.js"}, + {"name":"ha.lib.js","url":"ha.lib.js"}, {"name":"ha.img","url":"ha.icon.js","evaluate":true} ] } From 69f4aa13957035305a1f7067cc04bc212a22598c Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:46:40 +0200 Subject: [PATCH 17/34] Minor fixes --- apps/ha/ha.app.js | 4 +++- apps/ha/ha.lib.js | 10 ---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/apps/ha/ha.app.js b/apps/ha/ha.app.js index 9ad8db8fa..d9199fb0e 100644 --- a/apps/ha/ha.app.js +++ b/apps/ha/ha.app.js @@ -16,7 +16,7 @@ function draw() { var w = g.stringWidth(trigger.display); g.setFontAlign(-1,-1); - var icon = ha.getIcon(trigger.getIcon()); + var icon = trigger.getIcon(); g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2); g.drawString("Home", icon.width + 20, H/5); g.drawString("Assistant", icon.width + 18, H/5+24); @@ -50,6 +50,8 @@ Bangle.on('touch', function(btn, e){ } if(!isRight && !isLeft){ + ha.sendTrigger("TRIGGER"); + // Now send the selected trigger Bangle.buzz(80, 0.6).then(()=>{ ha.sendTrigger(triggers[position].trigger); diff --git a/apps/ha/ha.lib.js b/apps/ha/ha.lib.js index 0de98d62a..b09cbeab2 100644 --- a/apps/ha/ha.lib.js +++ b/apps/ha/ha.lib.js @@ -63,16 +63,6 @@ exports.sendTrigger = function(triggerName){ while(retries > 0){ try{ - // First send a generic trigger which can be used - // to listen to all trigger send. - Bluetooth.println(JSON.stringify({ - t:"intent", - action:"com.espruino.gadgetbridge.banglejs.HA", - extra:{ - trigger: "TRIGGER" - }}) - ); - // Now lets send the trigger that we sould send. Bluetooth.println(JSON.stringify({ t:"intent", From 5c6952a26012c4991b5c9a888cc48589098ef6d5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:41:43 +0200 Subject: [PATCH 18/34] Integrate HomeAssistant into BW Clock --- apps/bwclk/ChangeLog | 3 +- apps/bwclk/README.md | 1 + apps/bwclk/app.js | 71 +++++++++++++++++++++++++++++------- apps/bwclk/metadata.json | 4 +- apps/bwclk/screenshot_4.png | Bin 0 -> 3389 bytes 5 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ecd0c355f..f9bc5e65a 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -6,4 +6,5 @@ 0.06: Design and usability improvements. 0.07: Improved positioning. 0.08: Select the color of widgets correctly. Additional settings to hide colon. -0.09: Larger font size if colon is hidden to improve readability further. \ No newline at end of file +0.09: Larger font size if colon is hidden to improve readability further. +0.10: HomeAssistant integration if HomeAssistant is installed. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index f6a1c6522..190488d6b 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -7,6 +7,7 @@ - Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. - If the "sched" app is installed tab top / bottom of the screen to set the timer. +- If HomeAssistant is installed, triggers are shown. Simple select the trigger and touch the middle of the screen to send the trigger to HomeAssistant. - The design is adapted to the theme of your bangle. - The colon (e.g. 7:35 = 735) can be hidden now in the settings. diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 5bfec4097..73cd6c35f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -62,7 +62,12 @@ Graphics.prototype.setMediumFont = function(scale) { Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) - this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), + 28+(scale<<8)+(1<<16) + ); return this; }; @@ -123,25 +128,43 @@ var imgWatch = { /* * INFO ENTRIES + * List of [Data, Icon, left/right, HomeAssistant Trigger] */ var infoArray = [ - function(){ return [ null, null, "left" ] }, - function(){ return [ "Bangle", imgWatch, "right" ] }, - function(){ return [ E.getBattery() + "%", imgBattery, "left" ] }, - function(){ return [ getSteps(), imgSteps, "left" ] }, - function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left"] }, - function(){ return [ getWeather().temp, imgTemperature, "left" ] }, - function(){ return [ getWeather().wind, imgWind, "left" ] }, + function(){ return [ null, null, "left", null ] }, + function(){ return [ "Bangle", imgWatch, "right", null ] }, + function(){ return [ E.getBattery() + "%", imgBattery, "left", null ] }, + function(){ return [ getSteps(), imgSteps, "left", null ] }, + function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left", null] }, + function(){ return [ getWeather().temp, imgTemperature, "left", null ] }, + function(){ return [ getWeather().wind, imgWind, "left", null ] }, ]; + +/* + * We append the HomeAssistant integrations if HomeAssistant is available + */ +try{ + var triggers = require("ha.lib.js").getTriggers(); + triggers.forEach(trigger => { + infoArray.push(function(){ + return [trigger.display, trigger.getIcon(), "left", trigger.trigger] + }); + }) +} catch(ex){ + // Nothing to do if HomeAssistant is not available... +} const NUM_INFO=infoArray.length; function getInfoEntry(){ if(isAlarmEnabled()){ - return [getAlarmMinutes() + " min.", imgTimer, "left"] + return [getAlarmMinutes() + " min.", imgTimer, "left", null] } else if(Bangle.isCharging()){ - return [E.getBattery() + "%", imgCharging, "left"] + return [E.getBattery() + "%", imgCharging, "left", null] } else{ + // In case the user removes HomeAssistant entries, showInfo + // could be larger than infoArray.length... + settings.showInfo = settings.showInfo % infoArray.length; return infoArray[settings.showInfo](); } } @@ -351,12 +374,14 @@ function drawTime(){ g.setSmallFont(); var imgWidth = 0; if(infoImg !== undefined){ - imgWidth = infoImg.width; + imgWidth = 26.0; var strWidth = g.stringWidth(infoStr); + var scale = imgWidth / infoImg.width; g.drawImage( infoImg, - W/2 + (printImgLeft ? -strWidth/2-2 : strWidth/2+2) - infoImg.width/2, - y - infoImg.height/2 + W/2 + (printImgLeft ? -strWidth/2-2 : strWidth/2+2) - parseInt(imgWidth/2), + y - parseInt(imgWidth/2), + { scale: scale } ); } g.drawString(infoStr, printImgLeft ? W/2 + imgWidth/2 + 2 : W/2 - imgWidth/2 - 2, y+3); @@ -429,6 +454,7 @@ Bangle.on('touch', function(btn, e){ var is_right = e.x > right; var is_upper = e.y < upper; var is_lower = e.y > lower; + var is_center = !is_upper && !is_lower && !is_left && !is_right; if(is_upper){ Bangle.buzz(40, 0.6); @@ -454,6 +480,25 @@ Bangle.on('touch', function(btn, e){ settings.showInfo = settings.showInfo < 0 ? NUM_INFO-1 : settings.showInfo; drawTime(); } + + if(is_center){ + var infoEntry = getInfoEntry(); + var trigger = infoEntry[3]; + if(trigger != null){ + try{ + require("ha.lib.js").sendTrigger("TRIGGER_BW"); + Bangle.buzz(80, 0.6).then(()=>{ + require("ha.lib.js").sendTrigger(trigger); + setTimeout(()=>{ + Bangle.buzz(80, 0.6); + }, 250); + }); + }catch(ex){ + print(ex); + // Without ha -> nop. + } + } + } }); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index eba1449a6..95fb7e608 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,11 +1,11 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.09", + "version": "0.10", "description": "BW Clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}, {"url":"screenshot_4.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..3807d47ada1c1ba4019334828a2212f03dfc0ccf GIT binary patch literal 3389 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 T`UAS(00000NkvXXu0mjfqzXj@ literal 0 HcmV?d00001 From 0a3222eae34b229b79e25bba0a8bad7cfa21c65b Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:45:42 +0200 Subject: [PATCH 19/34] Improved stability --- apps/bwclk/app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 73cd6c35f..60898dbe0 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -503,7 +503,11 @@ Bangle.on('touch', function(btn, e){ E.on("kill", function(){ - storage.write(SETTINGS_FILE, settings); + try{ + storage.write(SETTINGS_FILE, settings); + } catch(ex){ + // If this fails, we still kill the app... + } }); From 86af82dd068404ab2094bdfc90537c4f442cc548 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:59:15 +0200 Subject: [PATCH 20/34] Lazy load images to improve memory consumption. --- apps/bwclk/app.js | 126 ++++++++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 60898dbe0..4b7deb21e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -71,59 +71,77 @@ Graphics.prototype.setSmallFont = function(scale) { return this; }; -var imgLock = { - width : 16, height : 16, bpp : 1, - transparent : 0, - buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) -}; +function imgLock(){ + return { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) + } +} -var imgSteps = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) -}; +function imgSteps(){ + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) + } +} -var imgBattery = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) -}; +function imgBattery(){ + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) + } +} -var imgBpm = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) -}; +function imgBpm() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) + } +} -var imgTemperature = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) -}; +function imgTemperature() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) + } +} -var imgWind = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) -}; +function imgWind () { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) + } +} -var imgTimer = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) -}; +function imgTimer() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) + } +} -var imgCharging = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) -}; +function imgCharging() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) + } +} -var imgWatch = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/8B//+ARANB/l4//5/1/+f/n/n5+fAQnf9/P44CC8/n7/n+YOB/+fDQQgCEwQsCHBBEC")) -}; +function imgWatch() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/8B//+ARANB/l4//5/1/+f/n/n5+fAQnf9/P44CC8/n7/n+YOB/+fDQQgCEwQsCHBBEC")) + } +} /* @@ -132,12 +150,12 @@ var imgWatch = { */ var infoArray = [ function(){ return [ null, null, "left", null ] }, - function(){ return [ "Bangle", imgWatch, "right", null ] }, - function(){ return [ E.getBattery() + "%", imgBattery, "left", null ] }, - function(){ return [ getSteps(), imgSteps, "left", null ] }, - function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left", null] }, - function(){ return [ getWeather().temp, imgTemperature, "left", null ] }, - function(){ return [ getWeather().wind, imgWind, "left", null ] }, + function(){ return [ "Bangle", imgWatch(), "right", null ] }, + function(){ return [ E.getBattery() + "%", imgBattery(), "left", null ] }, + function(){ return [ getSteps(), imgSteps(), "left", null ] }, + function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm(), "left", null] }, + function(){ return [ getWeather().temp, imgTemperature(), "left", null ] }, + function(){ return [ getWeather().wind, imgWind(), "left", null ] }, ]; /* @@ -158,9 +176,9 @@ const NUM_INFO=infoArray.length; function getInfoEntry(){ if(isAlarmEnabled()){ - return [getAlarmMinutes() + " min.", imgTimer, "left", null] + return [getAlarmMinutes() + " min.", imgTimer(), "left", null] } else if(Bangle.isCharging()){ - return [E.getBattery() + "%", imgCharging, "left", null] + return [E.getBattery() + "%", imgCharging(), "left", null] } else{ // In case the user removes HomeAssistant entries, showInfo // could be larger than infoArray.length... @@ -391,7 +409,7 @@ function drawTime(){ function drawLock(){ if(settings.showLock && Bangle.isLocked()){ g.setColor(g.theme.fg); - g.drawImage(imgLock, W-16, 2); + g.drawImage(imgLock(), W-16, 2); } } From ff216c5e787ee5fe18cc7c5b979ff942472ba0e2 Mon Sep 17 00:00:00 2001 From: Giles Booth Date: Mon, 27 Jun 2022 20:53:03 +0100 Subject: [PATCH 21/34] Update README.md --- apps/macwatch2/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/macwatch2/README.md b/apps/macwatch2/README.md index 217807e9b..c32b01655 100644 --- a/apps/macwatch2/README.md +++ b/apps/macwatch2/README.md @@ -4,10 +4,10 @@ A clock inspired by Susan Kare's original 1984 Macintosh desktop design. Ideas for development: - [x] fix dark mode either by forcing black on white or doing proper inverse display and text -- [] date in text format -- [] tap to load different info in window -- [] unlock to show seconds, perhaps flip time and date? -- [] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar +[] date in text format +[] tap to load different info in window +[] unlock to show seconds, perhaps flip time and date? +[] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar ![](screenshot.png) From 19d14e7a7eb882fd8863816693aa25fd7cf5b0eb Mon Sep 17 00:00:00 2001 From: Giles Booth Date: Mon, 27 Jun 2022 20:53:28 +0100 Subject: [PATCH 22/34] Update README.md --- apps/macwatch2/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/macwatch2/README.md b/apps/macwatch2/README.md index c32b01655..217807e9b 100644 --- a/apps/macwatch2/README.md +++ b/apps/macwatch2/README.md @@ -4,10 +4,10 @@ A clock inspired by Susan Kare's original 1984 Macintosh desktop design. Ideas for development: - [x] fix dark mode either by forcing black on white or doing proper inverse display and text -[] date in text format -[] tap to load different info in window -[] unlock to show seconds, perhaps flip time and date? -[] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar +- [] date in text format +- [] tap to load different info in window +- [] unlock to show seconds, perhaps flip time and date? +- [] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar ![](screenshot.png) From 7471e48c822ea3ab8382f917a2284b1fe42dbe57 Mon Sep 17 00:00:00 2001 From: Giles Booth Date: Mon, 27 Jun 2022 20:54:13 +0100 Subject: [PATCH 23/34] Update README.md --- apps/macwatch2/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/macwatch2/README.md b/apps/macwatch2/README.md index 217807e9b..4fdb9b6e9 100644 --- a/apps/macwatch2/README.md +++ b/apps/macwatch2/README.md @@ -4,10 +4,10 @@ A clock inspired by Susan Kare's original 1984 Macintosh desktop design. Ideas for development: - [x] fix dark mode either by forcing black on white or doing proper inverse display and text -- [] date in text format -- [] tap to load different info in window -- [] unlock to show seconds, perhaps flip time and date? -- [] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar +- [ ] date in text format +- [ ] tap to load different info in window +- [ ] unlock to show seconds, perhaps flip time and date? +- [ ] incorporate widgets somehow either by leaving space or adding Chicago font widgets of my own in top bar ![](screenshot.png) From c060e5edb8c21c1b856d570aa15a1b7fa81cf5bf Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 18 Jun 2022 12:39:44 +0200 Subject: [PATCH 24/34] Release tabanchi 0.03, reduce source size and fix a js error in the clock screen --- apps/tabanchi/ChangeLog | 1 + apps/tabanchi/app.js | 108 +++++++++++++++--------------------- apps/tabanchi/metadata.json | 2 +- 3 files changed, 47 insertions(+), 64 deletions(-) diff --git a/apps/tabanchi/ChangeLog b/apps/tabanchi/ChangeLog index 3889ade8e..4e2facf6f 100644 --- a/apps/tabanchi/ChangeLog +++ b/apps/tabanchi/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial implementation 0.02: Fix app icon +0.03: Fix clock animation issue and reduce source size diff --git a/apps/tabanchi/app.js b/apps/tabanchi/app.js index c87a08817..f159052b7 100644 --- a/apps/tabanchi/app.js +++ b/apps/tabanchi/app.js @@ -2,14 +2,18 @@ // TABANCHI -- たばんち const scale = 6; -let tool = -1; const w = g.getWidth(); const h = g.getHeight(); +const yy = 34; +const y = 40 - scale; +let tool = -1; let hd = 1; let vd = 1; let x = 20; let sx = 0; // screen scroll x position -const y = 40 - scale; +let cacaLevel = 0; +let cacaBirth = null; +let angryState = 0; let animated = true; let transition = false; let caca = null; @@ -22,9 +26,38 @@ let oldMode = ''; let gameChoice = 0; let gameTries = 0; let gameWins = 0; +let statusMode = 0; +let lightSelect = 0; +let lightMode = 0; // on is zero +let frame = 0; + +const tama = { + age: 0, + weight: 1, + aspect: 6, + discipline: 0, + happy: 3, + sick: false, + hungry: 3, + cacas: 0, + // hidden + sickness: 0, + defenses: 100, + tummy: 100, + awake: 3 +}; + g.setBgColor(0); +const sun = { + width: 8, + height: 8, + bpp: 1, + transparent: 1, + buffer: atob('773nW9rnvfc=') +}; + const tama06eat0 = { width: 16, height: 16, @@ -387,7 +420,6 @@ const caca01 = { buffer: atob('////v/33v7+3+f4v0HwH////') }; -// var img = hs.decompress(atob("sFggP/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A+A")); const tama00 = { width: 16, height: 16, @@ -574,23 +606,6 @@ g.drawString('Loading...', 10, 10); egg = egg00; n = tama00; -const tama = { - // visible - age: 0, - weight: 1, - aspect: 6, - discipline: 0, - happy: 3, - sick: false, - hungry: 3, - cacas: 0, // move from cacas - // hidden - sickness: 0, - defenses: 100, - tummy: 100, - awake: 3 -}; - function drawHearts (n) { for (i = 0; i < 4; i++) { const himg = (i < n) ? heart1 : heart0; @@ -599,7 +614,6 @@ function drawHearts (n) { } function drawLinebar (n, arrow) { // 0-100 - const yy = 34; g.drawImage(linebar, 0, yy + (scale * 8), { scale: scale }); let wop = scale * 2; // (frame++%2)? scale*3:scale*2; @@ -631,7 +645,6 @@ function drawLinebar (n, arrow) { // 0-100 } function drawStatus () { - const yy = 34; switch (statusMode) { case 0: g.drawImage(face, scale, yy, { scale: scale }); @@ -774,11 +787,6 @@ function drawScene () { } } -var statusMode = 0; -var lightSelect = 0; -var lightMode = 0; // on is zero -let frame = 0; - function drawAngry () { const one = angryState % 2; g.drawImage(one ? tama06no0 : tama06no1, (scale * 5), 40, { scale: scale }); @@ -833,14 +841,6 @@ function drawMedicine () { // food eating animation g.drawImage(tama06no0, (scale * 10), 40, { scale: scale }); } -var sun = { - width: 8, - height: 8, - bpp: 1, - transparent: 1, - buffer: atob('773nW9rnvfc=') -}; - function drawEating () { // food eating animation const one = angryState % 2; const snack = [snack0, snack1, snack2]; @@ -953,6 +953,7 @@ function nextItem () { tool++; if (tool > 6) tool = 0; } + function prevItem () { tool--; if (tool < 0) tool = 7; @@ -1099,7 +1100,6 @@ function drawCaca () { } } } -var angryState = 0; function animateHappy () { if (transition || mode == 'happy') { @@ -1208,7 +1208,7 @@ function animateShower () { } function animateToGame () { - if (transition || mode == 'game') { + if (transition || mode === 'game') { return; } mode = 'game'; @@ -1298,14 +1298,6 @@ function button (n) { } if (mode == 'game') { - /* - if (gameTries > 3) { - mode = ""; - gameWins = 0; - gameTries = 0; - //tama.tired++; - } - */ switch (n) { case 1: // pick left @@ -1345,8 +1337,7 @@ function button (n) { drawScene(); break; case 'status': - if (oldMode == 'clock') { - } else { + if (oldMode != 'clock') { statusMode++; drawScene(); } @@ -1363,8 +1354,7 @@ function button (n) { animateFromClock(); break; case 'status': - if (oldMode == 'clock') { - } else { + if (oldMode != 'clock') { statusMode++; drawScene(); } @@ -1433,7 +1423,6 @@ function drawGame () { } mode = oldMode; oldMode = ''; - // g.drawImage(); } else { g.drawImage(one ? tama06no1 : tama06no0, (scale * 7) + sx, 40, { scale: scale }); } @@ -1467,7 +1456,6 @@ function drawClock () { const s1 = numbers[ts[1] - '0']; const s2 = numbers[ts[3] - '0']; const s3 = numbers[ts[4] - '0']; - const yy = 34; // hours if (s0) { g.drawImage(s0, wsx, yy, { scale: scale }); @@ -1515,17 +1503,11 @@ function drawClock () { } setInterval(function () { - // if (animated) { updateAnimation(); drawScene(); - // } }, 1000); -let cacaLevel = 0; -let cacaBirth = null; - -setInterval(function () { - // poo maker +function pooMaker() { if (tama.hungry > 0 && !tama.sleep) { const a = 0 | (cacaLevel / tama.tummy); const b = 0 | ((cacaLevel + tama.hungry) / tama.tummy); @@ -1545,9 +1527,8 @@ setInterval(function () { tama.awake--; tama.sleep = false; } -}, 5000); - -setInterval(function () { +} +function sickMaker() { if (tama.sleep) { return; } @@ -1569,8 +1550,10 @@ setInterval(function () { if (tama.sick > 0) { callForAttention = true; } -}, 2000); +} +setInterval(pooMaker, 5e3); +setInterval(sickMaker, 2e3); updateAnimation(); Bangle.on('touch', function (r, s) { @@ -1600,4 +1583,3 @@ Bangle.on('touch', function (r, s) { button(2); } }); - diff --git a/apps/tabanchi/metadata.json b/apps/tabanchi/metadata.json index 335dd0326..f72147162 100644 --- a/apps/tabanchi/metadata.json +++ b/apps/tabanchi/metadata.json @@ -2,7 +2,7 @@ "id": "tabanchi", "name": "Tabanchi", "shortName": "Tabanchi", - "version": "0.02", + "version": "0.03", "type": "app", "description": "Tamagotchi WatchApp", "icon": "app.png", From 4059d4c42cea41054bd2051e05c491fafaad2864 Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 18 Jun 2022 00:47:41 +0200 Subject: [PATCH 25/34] Release kanawatch 0.03 * Fix ui button issue, reduce source size, improved graphics * Add the program to generate all the katakana/hiragana images * Improve battery life reducing fullscreen refresh * Show month and day numbers --- apps/kanawatch/ChangeLog | 2 + apps/kanawatch/app.js | 849 ++++++----------------------------- apps/kanawatch/fontmaker.zip | Bin 0 -> 65124 bytes apps/kanawatch/metadata.json | 2 +- 4 files changed, 144 insertions(+), 709 deletions(-) create mode 100644 apps/kanawatch/fontmaker.zip diff --git a/apps/kanawatch/ChangeLog b/apps/kanawatch/ChangeLog index 7b83706bf..ce7cac123 100644 --- a/apps/kanawatch/ChangeLog +++ b/apps/kanawatch/ChangeLog @@ -1 +1,3 @@ 0.01: First release +0.02: Improve battery life, sprite resolution, fix launcher issue and unaligned text bug +0.03: Reduce code size, refresh once a minute and faster refresh diff --git a/apps/kanawatch/app.js b/apps/kanawatch/app.js index ada6aa6df..26123378d 100644 --- a/apps/kanawatch/app.js +++ b/apps/kanawatch/app.js @@ -7,641 +7,107 @@ const w = g.getWidth(); /// ///////////////////////////////////////// const katakana = {}; const hiragana = {}; -katakana.A = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAjAEBfv4B/+yeAXwAOgBAAPAAAEHAAABzAAAAPgAAADgAAAAwAAAAMAAAAGAAAABgAAAAYAAAAMAAAADAAAABgAAAAYAAAAMAAAAGAAAADAAAABgAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.A = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAIAAAACAAAABgAAAAZ4AAGf4AAA/gAAAAQAAAAEAAAABBAAAAQwAAAN/wAADiGAADxAwABswEAAhYBgAQUAYAMHAEACBgDABh4AwAZ2AYAD4gcAAQAcAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.I = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAwAAAAGAAAADwAAAA0AAAAYAAAAUgAAAGAAAAFAAAADgAAAA8AAAA2AAAAZgAAAYYAAAMGAAAMFgAAGAYAAGAGAACABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.I = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAgAEAAEABAAAgAQAAMAGAABAAgAAYAIAAGACAAAwAQAAMAEAADABiAAQAIgAAADQAAAAcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.U = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAQAAAAHAAAAAwAAAAICAAACIAAAAgIABQa3AAP7q4ADQANAAwADAAMABgADAAYAAwAGAAMADAADAAwAAwAYAAMAGAABADAAAABgAAAAwAAAAMAAAAGAAAACQAAADAAAABgAAAAwAAAAoAAAAAAAAAAAAAAAgAAA=') -}; -hiragana.U = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAIAAAABwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAA4YAAA4CAAAAAgAAAAIAAAACAAAAAgAAAAYAAAAGAAAABAAAAAQAAAAIAAAACAAAABAAAAAQAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.E = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAJXAAe+20ADRQAAAAOAAAABgAAAAQAAAAMAAAABAAAAAwAAAAEAACABAEAgJbvgP9qSsByAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.E = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAADgAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAdwAAAcYAAB8MAAAIGAAAADAAAABgAAAAwAAAAYAAAAMAAAAGAAAADIAAAB4gAAA4EAAAMAgAACAOGAAAB/wAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.O = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAADwAAAAOAAAADAAAAAwAAAAMAAAAjAABAAydAbff/wH/XAUAwDwAAAB0AAAA7AAAAMwAAAHMAAADjAAABkwAAA4MAAAZDAAAMEwAAGEMAAGQzAADAHwABAA8AAAAHAAAABAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.O = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAADACAAAwAYAAMADAADIAQAA/AGAF+AAAAyAAAAAgAAAAIAAAACAAAAAg/gAAJwOAADgBgABgAMAAoADAAyAAwAIgAMAEIAGABCADAAJgBgAD4AgAAMAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.HA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAcGAAADgwAAB4HAAA4A4AAMgHAAHAA4ADAAXAAwAA4AYAAHAMAABwGAAAMGAAACDAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.HA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAABAACAAYAAwAGAAMABgACAAYAAgAHwAIAD4AGAfYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAOGAAQEfgAFCA8ABggPwAYG+GAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.HI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAXAAAABwAAAAYAgAAGAMAABgDgABYD0AAWF4gABvwAAAfAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAgAAal8AAD//gAAJQAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.HI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAA8BAAB2AYAABACAAAwAQAAIAEAAGAJgABACIAAwAjAAIAIYACACGABABAwAQAQEAEAEAABADAAAAAgAAEAYAABAEAAAYDAAADDgAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.HU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAALwAYt/vAD/0DwAcABwAACAcAAAAGAAAADIAAAAwAAAAYAAAAOAAAAGAAAADgAAAAwAAAA0AAAAaAAAAOAAAAHAAAAHAAAAHAAAAGgAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.HU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAGAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAACAAAAAQAAAACAgAAAgEAAAMBgAABAYAgAwDAMAMAgBgCAAAYHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.HE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAANwAAAGHAAADA4AABwDgAIwBOADcABwQeAAHgDAAA8AIAADwAAAAeAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.HE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAIMAAAMAgAAGAGAADAAwAAAADAAAAAYAAAADgAAAAMAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.HO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAEAAAADQAAAAYAAAASAAAABgAAAAIAACAGK4A273dAHoYAAAAGAAAAAgAAAIIQAAECGAABAgwAAgYGAAIGAwAGAgGADAIBwBiCAaAYRgDAMDIAgAAeAAAADgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.HO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAQB+AAEAgAABAAQAAQAGAAIABgACAAQAAgAHwAIAD4ACAfQABAAEAAQABAAEAAQABAAGAAQABgAEAAYABAAGAAQBdgAHAg4ABwAHgAIB+OACAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.KA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAUAAAADwAAAAcAAAAGAAAABgAAAAYFABAOvwAfv9eAD6wHAAQMBwAADAYAABwGAAAYBgAAGAYAADAOAAAwDAAAYgwAAMgcAADEmAAFgzgAAwHwAA4B4ABYAcAAMABAAEAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.KA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAIAAAACAAAABAAAAAQAgAAMAEAAD8AwAHggGAHQIBgAECAMADAgDAAgIAQAIGAEAEBAAABAwAAAwIAAAYGAAAGBgAAADwAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.KI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAACwAAAAeAAAADgAAAAYAAAATBgAAAz8AAAP5AAxfQAAH8YAAA4GAAAABgHAAAYf4AAD+pAAF8AAMPsAAC/hgAAPAYAABAGAAAABwAAAAYAAAAHAAAAAwAAAAOAAAADAAAAAYAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.KI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAQAAAAGAAAAAgAAAAIAAAADDAAAAfwAAAeAAAA4gAAAwIAAAABAAAAAZwAAADwAAAHwAAAOGAAAAAgAAAAMAAAADAAAAAQAAAAAAAAAAAAAAAAAAEAAAABgAAAAPmAAAAfwAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.KU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAQAAAAHAAAAA4AAAAMAAAAHBwAAB/+AAA0XAAAaBkAAGA4AADAOAABgHAAAwBwAAYA4AAMAMAAGAHAAAADgAAABwAAAA0AAAAaAAAAOAAAAHAAAADIAAADgAAACgAAABgAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.KU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAADAAAABgAAAAQAAAAIAAAAGAAAABAAAAAgAAAAQAAAAEAAAACAAAAAQAAAAEAAAAAgAAAAEAAAABgAAAAIAAAADAAAAAYAAAAGAAAAAwAAAAMAAAABgAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.KE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAABwAAAAOAAAADgAAABwAAAAYAQAAGAAgABgF8AA79/gAb7gAAGQcQADAHgABgBgAAYAwAAZAMAAMAHAADABgAAgAwAAAAMAAAAGAAAALAAAABwAAAAYAAAAYAAAAMgAAAGAAAACAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.KE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAABAAAAAYAAIAGAAGABgABgAYAAYAGAAEAB+ABAB/gAQHmAAEABgADAAYAAgAGAAIABgACAAYAAgAGAAIABAACAAQAAgAEAAKABAADgAwAAYAIAAGACAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.KO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwCtwAH//8AA+oGAAEABgAAAAYAAAAGAAAABgAAAAQAAAAsAAAADAAIAFwADv//AAf1CQACAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.KO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAADwAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAYAAAAD8EAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.MA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAFcAIG/3ga/0h4H6gA4AcAAcACAAOAAAAHAAAYDAAAFjgAAAPgAAAB4AAAAOAAAABwAAAAMAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.MA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABBAAAAf8AAD+AAAOBAAAAAQAAAAGAAAABgAAAAZwAAAHwAAB/gAAAAYAAAAGAAAABgAAAAYAAAAGAAAARgAAAR4AAAIHgAACDPAAARg4AABAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.MI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAegAAAC+gAAAB8AAAAHgAAAAYAAAAQAAAAgAAAegAAAB+AAAAD4AAAAPAAAABwAAAAMAAAAAAAAAAAAAAAAAAAUAAAAF8AAAAHwAAAAPgAAAA8AAAAHwAAAAeAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.MI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAA+YAAAEMAAAADAAAABgAAAAQAAAAMAAAACAAAABgAAAAQAAAAIAIAAGAGAADgBgAO/wQAEIH8ACEAH4AiABnAJgAQQBgAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.MU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAACgAAAAcAAAADgAAAA4AAAAcAAAAHAAAABkAAAAYAAAAMQAAADEAAABwwAAAYGAAAGAwAADAHAAAwA4AAIAOAAWBfwBBX9OAf/oDgH+gAYA6AAGAAEAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.MU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAgAwAAIAGAACIAwAA/gEAB+ABAB2AAAAAgAAAAYAAAAGAAAABgAAAAYAAAAGAEAABgBAAGQAQAA0AEAAFABAAAwAQAAEAMAARgCAAGWHgAA8fgAAGAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.ME = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAcAAAABgAAAAcAAAAHAAAADgAAAAwAAABcAABgGAAAfDgAAAewAAAB8AAAAPAAAAD8AAABzgAAA44AAAcHAAAGAwAADAAAACgAAABwAAAAoAAAAcAAAAMAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.ME = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABgAAAAYAABAGAAAIBAAACAwAAAgP4AAMeDgABZgMAAYQBgAOMAYAGiACADJgAgAjQAIAQcACAEGABgBBgAQARsAIAHwAEAAQAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.MO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAABAAUAASXfgAD7EQAAQwAAAAOAAAABAAAAAwAAAAEAUBADd/wNfaRID1EAAAIDAAAAAwAAAAEAAAADAAAAAQAAAAMAAAABiQAAAf+AAABKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.MO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAB+AAAA/wAAB0AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEYAAAf+AAABwAAAAMAAAACAIAAAgCAAAIAgAACAIAAAgCAAAEBAAABgwAAAP4AAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.NA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAPAAAAA4AAAAOAAAADAAAAAwBAAAMQAAADAaBAT9/wf/vbcD6DAAAQAxAAAAMAAAADAAAAAwAAAAMAAAAGAAAABgAAAAYAAAAMAAAAGAAAABgAAAAwAAAAYAAAAMAAAAEAAAABAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.NA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAgAAAAJgAAAH4AAA/gAAAMQAIAAIABAACAAYABgACAAQAAAAMAAAACAIAAAgCAAAAAgAAAAIAAAACAAAAAgAAAPIAAAEOAAABB4AAAQTgAAD4MAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.NI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgALAANb/8AB/6pAAMAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAAIAAAJvAKN//4D/1EGAdAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.NI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAGAAAABgA/AAYBwAAEAAAABAAAAAQAAAAMAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAEAAAIAgAADAH/gAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.NU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFgAML38AB/9OAAOgHAAAQBgABAA4AAAAMAADoHAAAPRgAAAfYAAAB4gAAAPQAAADeAAABjwAABwcAAI4DgAA4AcAAcADAAcAAQAaAAAAWAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.NU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAABAwAAAIMAAACDf4AAg4DAAIYAYACeACAAZAAgAMQAIAFMACACSAAgBDgAIAwwOGAIMEbACHBDgAjYPsAPCABgBggAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.NE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAGAAAAA4AAAAHAAAAA4AAAAGAAAABgAAAAJYABAv/AAf+nwAD4DoAAQB4AAAA8AAAB8AAAAeAAAAPQAAAHzgAAHMeAAHDB4ADgwOAHgMBwHADAMKgAwAgAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAAAAAAAAAAA=') -}; -hiragana.NE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAADAAAAAwAAAAIAAAADAHgAA8GIAA+CCAAzBAwAAhAMAAIgDAAGQAwABoAMAAsADAASAAwAFgAMAC4ACAAyAugAcgIYAGYCHABGAecABgABgAYAAIAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.NO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAGAAAABwAAAAeAAAAOAAAADgAAAAwAAAAcAAAANAAAADAAAABwAAAAYAAAAOAAAAHAAAABgAAAAwAAAAYAAAAMAAAAGAAAAGQAAADAAAADgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.NO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAD44AADEBAABBAIABgQBAAwMAYAICACAEBgAgAAQAIAgMACAICAAgCBgAYAwwAGAEIADABmAAgAPAAQADgAYAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.RA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAEAAQAIAANTvgAD/u0AAOAAAAAACAAAAAAABAACAAgAt4APf/vAB/UDQAIAJwAAAA4AAAAOAAAAHAAAABgAAAA4AAAAcAAAAOAAAAGgAAADQAAABoAAAA4AAAAcAAAAaAAAAMgAAAEIAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.RA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAQAAAACAAAAAwAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAYAAAAEAAAABAAAAAQAAAAEA+AADBwQAA3gCAAPgAgADAAIAAAAGAAAADAAAABgAAAAwAAAAgAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.RI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAQBwAAHgOAAAsDgAAGAwAABgMAAAYDAAAGAwAABgMAAAYDAAAGAwAABgMAAAYDAAAGAwAABgMAAAYDAAACAwAAAAYAAAAGAAAADAAAAEwAAAA0AAAAcAAAAOAAAAOAAAAOAAAAGAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.RI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAABAAAAAYAAAAGAAAABAQAAAQGAAAEAgAABAIAAAwCAAAIAgAACAIAAAoCAAAOAgAADAIAAAQCAAAEAgAAAAYAAAAGAAAABAAAAAQAAAAEAAAACAAAAAgAAAAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.RU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAABAAAAAeAAAADgAAAA4AAAcGAAADhgAAA4YAAAMGABAGDAAwBkYAYAYGAMAMDAOADAYHAAwGDgAYBjgAMgbwADAHyABgD4AAwA4AAYAEAAMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.RU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAO4AAA8MAAAAGAAAADAAAAAgAAAAQAAAAIAAAAGAAAABAAAAAgAAAAQAAAAIYMAAE4BgAB4AIAA4ACAAMAAgAAAAYAAAAEAAATCAAAEZAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.RE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAACgAAAAeAAAADgAAAAwAAAAMAAAADAAAAAwAAYAMAAMADAAGAAwAGAAsADgADABgAAwBwAAMBwAADA4AAAw8AAAM8AAAD8AAAA+AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.RE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAGAAAYDgAAfBIAANgiAAMQwgAAMYIAAHMCAAB2AgAAnAIAAJgCAAEwAgAAcAIAAvACAAewAggHMAIwBDADwAAwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.RO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAYABk3/AAP/a4ADQAYAAwAGAAMABgABAAwAAwAMAAMADAABAAwAAQEMAAEASAADEt4AA/++QAGgAAADAAQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.RO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAF8wAAAwYAAAAMAAAACAAAABAAAAAwAAAAYAAAAEAAAACAAAABAAAAAg/gAARgGAAPgAgAHgAMADgADAAQAAwAAAAYAAAAOAAAAGAAAAGAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.SA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAFAAAAA4AABAHAAAdBgAABwYAAAYGAAAGBgAABgYABAYGrAYu//4H/aomA4YGAAAGBgAABgYAAAYGAAAGBgAABgwAAAYMAAACGAAAABgAAAAwAAAAYAAAAOAAAAGAAAADgAAABgAAAAgAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.SA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAGAAAABgAAAAIAAAADAAAAAQgAAAG8AAAB4AAAB8AAAPhgAAAAIAAAABAAAAAYAAAADAAAABwAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAEAAAAAwAAAAH/AAAAHwAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.SI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAHgAAAAcAAAAjgAAAAYABAAAAAwEAAAYB4AAMAHgAGAA4ADAAWABgAAgAyAAAAYAAAAcAAAAOAAAAOAAAIHAAAUHgAABnwAAAPwAAAB4AAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.SI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAQAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAIAQAADA4AAAf4AAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.SU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAEAAGC/gAE/9cAAOgOAAAgHAAAABwAAAA4AAAAcAAAAGAAAAHgAAAB2AAAA44AAAYHAAAcA4AAOAHAALAA4AHAAOAGgABgDAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.SU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAADAAAAAQAAAAEAAAABAAAAAQAAAAE/gAAf/4AH4QAAHAEAAAABAAAAAQAAAGkAAABFAAAARQAAAEcAAABDAAAAYwAAAB8AAAAGAAAABgAAAAQAAAAMAAAAGAAAABAAAABgAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.SE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAA4AAAAHgAAAA4AAAAMAAAADABAAAwG4CAN/vAw36DgH+wDgA6MBwACDA4AAAwZAAAMUAAADMAAAAyAAAAMAAAADAAAAAwAAAAMAAAADAGAAA//gAAL94AAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.SE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAgCAAAMAgAADAIAAAwCAAAMAgAADAf8AAx+AAAPhgAAPAQAA8wEAAMMBAAADAwAAAwcAAAEGAAABAAAAAQAAAACAAAAA8OAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.SO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAQAAAALAAIAA4ADAAeAAcAHAADIBwAAYA4AAHAOAAAwDAAAIBwAAAAYAAAAMgAAAHAAAADAAAABwAAAAYAAAAMAAAAOAAAAHAAAADgAAADgAAADgAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.SO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAYAAAAzAAAHxgAAAwwAAAAYAAAAEAAAACAAAABAAAAAgAAAAQDwAAIDwAAEGQAACOIAABeEAAAMCAAAAAAAAAAQAAAAEAAAABAAAAAYAAAADAAAAAYAAAADwAAAAMAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.TA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAOAAAABwAAAAcAAAAGBYAAB/fAAA1DgAAMA4AAGAcAABgHAAA4DAABdwwAAMPcAAGA+AADADkABgB8AAQAzAAAAMAAAAGAAAADAAAADgAAABwAAAA4AAAAYAAAAcAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.TA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAYAAAAEAAAADHgAAA/gAAH8AAAAmAAAABAAAAAQAAAAMAAAACAfgABg4AAAQAAAAEAAAADAAAAAgAAAAYAAAAEAAAADAAAAAwDjgAIAP8ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.TI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAOAAAAH4AAAPwAAAvgAADe4AAL4OAABADAAABAwAQAAMV4ECv//B7/0IwPQmAAAgDAAAAQwAAAAMAAAADAAAABgAAAAYAAAAMAAAAGAAAACgAAAAwAAAAwAAAAsAAAAMAAAACAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.TI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAABAAAAAIAAAAGAAAABgAAAAQAAAAEAAAABHAAAB/AAAH4AAAACAAAAAgAAAAQAAAAEAAAABAAAAAQAAAAIPcAACMBgAAsAIAAcACAAGAAgAAAAIAAAAGAAAADAAAABgAAABgAAABgAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.TU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAACAAAAAyBgAgHAOAGA4DwAwOA8AGBgcABwYHAAcADgADAA4AAQAcAAAAGAAAALgAAABwAAAAYAAAAMAAAAOAAAADAAAADgAAABwAAABwAAABwAAADRAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.TU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/HAAB4AYADwACAPwAAwBgAAMAAAADAAAAAgAAAAYAAAAEAAAADAAAADAAAADgAAADAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.TE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAACAACAn4AC3/vAAHoAAACQAAAAAAIAAAIAAAgAFfQG3+/8B/YwBAGAOAAAADgAAABgAAAAcAAAAGAAAADAAAABQAAAAYAAAAOAAAADAAAABgAAAAwAAAAwAAAAYAAAAKAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.TE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAPAAAAbgAAA5gAABwgAADwYAAHgEAAAgCAAAABAAAAAQAAAAAAAAACAAAAAgAAAAIAAAACAAAAAQAAAAEAAAAAgAAAAOAAAABwAAAAHAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.TO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAA4AAAAHgAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD6AAAAzwAAAMPAAADA4AAAwHAAAMAwAADAEAAAwAAAAMAAAADAAAAAwAAAAMAAAAGAAAABwAAAAMAAAAAAAAAAAAAAAIAAAAAAAA=') -}; -hiragana.TO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAGAAAAAgAAAAMAYAABAHAAAQHAAAGDAAAAhgAAAIwAAABwAAAAYAAAAMAAAAEAAAACAAAABAAAAAQAAAAAAAAACAAAAAAAAAAGAAAAAf/wAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.WA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAACAAANACsAB7//gAPtI4AJgAOAAYADAAMABwABgAYACYAGAAOABgABgA4AAwAcAAGAHAABADgAAAAwAAAAcAAAAOAAAAHAAAADgAAADgAAADgAAAFwAAACgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.WA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAA8AAAAfAAAAfgAAAIwAAAAIDnAAGCAYACiACAArAAwATAAMAJgADAD4AAgByAAYARgAEAAYACAAGACAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.WI = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAQAAAAPAAAAA4AAAAMAAAADAAAAAwAAAAsEABhLvgAP//cAB5MAAAGDAAADAwAAAQMAAAMDAAADAwcBg19/wf/7UsD1AwAAIAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.WI = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAbAAAB4wAAAMIAAAACAAAABgAAAAQAAAAEAAAADAAAAA3+AAAeAwAAeAGAAZAAgAMQAMAEMADACCAAwBBgAMAwQACAIMDxgBCBGwARAQYADgCcAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.WE = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFBK4AB//+AAPUHgABADgAAARwAAAOwAAABwAAAAMAAAADAAAAAwAAAAMAAAALAAAgAyVgPv//+B/qIrgIAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.WE = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAA8AAAB3AAAHhgAAAAwAAAAYAAAAMAAAAGAAAADAAAABhwAAAzDAAAaAYAAOAGAADADAAACRgAAANgAAAGAAAADAAAABgAAAAgAAAAwAcAAYAxwAfggGAOGwAwDA4AAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.WO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAABAAAgAAwAO37/AB//bwAMgAwAAABYAAgAHAAAABgAGFb4AA//uAAHQDAAAAQwAAAAYAAAAOAAAADAAAABgAAAAwAAAAsAAAAGAAAADAAAABgAAABoAAAAwAAAA4AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.WO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAACOAAAB/AAAPwAAAAMAAAACAAAABAAAAAwAgAAIAcAAHMMAADBOAAAAeAAAAGAAAADgAAADIAAABCAAAAgAAAAIAAAACAAAAAgAAAAGBwAAAP8AAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.YA = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAEAAAAD4AAAAOAAAADAAAAAwAIAAGADAABgX4AAa/fAAX6OAZfwHAD9MDgAcDBgAEAwwAAAmYAAABogAAAYAAAAGAAAABgAAAAcAAAADAAAAAwAAAAOAAAADgAAAA4AAAAGAAAABgAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.YA = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAgAAAAGAAAAAgAAAAMAAAQAAAAEAAAABAHGAAQOAwAGcAEAA4ADAA4AAwA7AAYA4QA4AAEAAAAAgAAAAIAAAADAAAAAQAAAAGAAAAAgAAAAMAAAADAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.YU = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABAC4AAd//AAH2hoAAQAyAAAAMAAAALAAAAAwAAAAMAAAADAAABAwQEABe+Bt//9wP+kAIBwAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.YU = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAIAACADAAAwD3AAIDIIACBCDAAgggQAIwIGACICBgBkAgYASAIEAEACBABQBgwAcB4YAGAGcABgB8AAYAQAACAIAAAACAAAABAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -katakana.YO = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIAlgAD//8AAfUGAACABgAAAAYAAAAMAABABgABBLwAAf/8AAF0DAAAgAwAAAAMAAAADAAAQAwAAgAMAANN3AAD/3wAANAIAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.YO = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAEAAAABgAAAAMAAAACAAAAAgAAAAIAAAACDAAAA3wAAAOAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPCAAAEPgAABA8AAAQHwAAADPAAA/g8AAAADgAAAAYAAAAAAAAAAAAAAAAA=') -}; -katakana.N = { - width: 32, - height: 32, - bpp: 1, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAEAAAABgAAAAOAAAABwAAIAMgAGADgADAAwABgAAAAwAAAAwAAABYAAABOAAAAHAAAAHAAAADgAAADkAAABwAACB4AAAx4AAAP4QAAB8AAAAOAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; -hiragana.N = { - width: 32, - height: 32, - bpp: 1, - transparent: 0, - buffer: atob('AAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAABgAAAAQAAAAMAAAACAAAABAAAAAQAAAAIAAAAGAAAABAAAAAkAAAALgAAAFIAIADiAAAAwwBAAYMAQAEBAIADAQGAAgGDAAYAzgAEAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') -}; +function image(x,y,b) { + return { + bpp:1, width:x,height:y, + buffer:require('heatshrink').decompress(atob(b)) + }; +} +katakana['A'] = image(56, 51, "v//AAfwAon//AGF/wGT/gGM/A3F/BDEn/wJQoGCj4RB//gAxUB//AAwcDAwsH/+AAwcP/4tCAwMf/wGEn/8Awl/JYYGBKQkf/I9DAwJgBGwQGDGwRlBAwJsE+42DAwPzGwYGB+J7EQIIvDQIIFEAw5DEAwRDDgCIEAxCPBKIcAR4IhER4hnCLAg9BLAgoBAwgoBcQiCBMwj0BHogGBHogGBfoooEQQREFEIgGBAokAhAGFA="); +katakana['I'] = image(54, 55, "AAkEAws+AokB/wGEg//Awk//gTE//gAwcPCYt/CYkDCYsfCYv//A0F4A0ECYg0BCYggBCYn/KwhBBGgl/EAgtBEAgMBEAZOBEAgMBEAYZB/+ABggTDBgQnDAoIaDJoIaDFgIABDQQFC74aBBgX8v4aBEwWBDQQgB/EHDQQ6BwEfGoX/+AJBDQMDWAKMBDQMPAQIaDiBFCPAgaDU4hrDDQiuDDX4acSAIaCA="); +katakana['U'] = image(52, 55, "AAMP/gGE//ABlH/AAnvAon+Bk5EDv/vIgcHBkHPBgZwBBgn/Bi8B/+PBgcf/AMFw/wBgYEDgED/6qEv4MEKYK3F8AFDj7EED4LREv/4CQn/wASEFginBDAgfEDAIfDn67BC4YABH4QXBCQcHZoQkEEoYMCHAYlBFYZEBLwk/MgpQEAAw"); +katakana['E'] = image(58, 45, "h//AAfwgYGE/0AAwn/wE/AwngDgv4DjhDCv/wJQkf/gGEg//AwkB//AA4gc/Dn4cjbAv/34GF94GF/YGF/wcjwA="); +katakana['O'] = image(57, 54, "AAcf+AGEh/8AwkH/wGEgf/AwkB/+AA4n/4AGEv/gAwk/GIsf/A4P/4AE+F/Awn4n4GE/kfAwn+h4cFg4GFwYGF4IGFKwYFBMQpxFAwJxEAwJxEAwJxEAwJxEK4JxEAwKqEMoQGE/o4En/8HAl//iqEAwKqEv/+VQgNBVQgNBcYgNBcYhLBcYhSCHAQKBAwI4CAwY4CD4IGBHASxBAYI4CAwY4CYwIGBHAQGBD4I4CBIJfCHASmDHAV/PYQ4Cj5QCHAUPLwQ4CgQGCOIgABOIgABHAIGEAAY="); +katakana['KA'] = image(54, 54, "AAMP/AGEv/gAocB/+AAwcH/wTEj4arg//AAf+j4GE/F/AwnhAon/w4aZHAMP/hTEn/wKYn/4BTDgf/KYgQCDQYQCBIQQDBIQQCBIc/DQouCDQQuCEghJBEhITBH4RTBLoRTEBIJTGCAUPNwoTCDQQWBDoIuCj4TCJIX/CYQ/BZQInBH4U//0HwBTBGgPwXAXwh4PBXAXAv4PCZIIgBEYTJBn5SBDQXABAIzBCYJcCDQXwgbOCAwIDBQgI4CgEOJwIADkAGFA"); +katakana['KI'] = image(58, 55, "AAU+Awv/4AGEn/wAwkP/gGEgf/Dkk/CAc//4ABwAGBj4GC8ATBAAf4h4GE/woBAAmAAwvgFAYcIwAcD/BFDFARFD/kBIoYACv5FBAAcfRL94DgkfHgf/95EBD4RgDD4MHLwf8AogAd+CPFGwiJCS4XHJgSGB8CJEkCJJUwYABg5pDD4amTNwKmXYbgcDLoY="); +katakana['KU'] = image(55, 55, "AAMHwAGEh/8Awkf/AGEv/wAwn/4AFDgf/EQkH/whF/4ACAwM/AoQQCBgY5BgIGDHIMHAwY5Bh4GD8AhEIAQFDIAIhBBIJACEIJpEj45CNIV/NgRpBDQIrBEoPgDQJlBEoQaDEoV/RwUP/wPBQ4Uf/gPBQ4QsBKAKSD8BvCSQXDDQYYBNYIaCGYIqBDQU//kPXoYYBj5QCEIPgj60DKoMcWga7FKoYABKogaDbojPBbojMDGob/ECYJBCbgYaDE4IaEPoIaDEAI1EbYQZECYgtBCZQGCLol/KwxxEAwJqEgIMFgIZEgA="); +katakana['KE'] = image(60, 54, "AAMcAwsD/4HFn/wBxl/8AGEg/+BxkP/gOF//ABxcB/+AA4kf/BCGAAZOBv4HEIQIOGAwgOBh4OFGYIOFn4OFEgoOBAwvgh52BKgYDBOwJUDv5nBBwY6BAYM/BwIKBJgJjBBQSbCWoQVBRgK1D/4oDBwJJBWos/WIS1CgIVCJoRGBWowCCj61HYgpRCdIjEGLgTLEIwTLEfAv/GYqtBEghyBGYjoCAwwkDAwQVEYwYjEHQt/CopeBQgQOEIIgOBPgxeFgZ7FA"); +katakana['KO'] = image(49, 46, "v//AAYFF34FE74FE94FE+4FE/IFE/gFE/w0Dgf/AocB/+AAwf/4BHE8AFDn/wAocf/AFDh/8AocHGH4w6YZf7Aon9YYoFEejBhEAAIA="); +katakana['SA'] = image(58, 53, "AAcD/wDBg4DC//AgEB/+AgE/+AKBv/ggEP/gGBj/4DgP/DnU//4A34CQ+DAIcEDAIcDDAQDDDAYDCDAYDD/4cDIgJADAAUfIAQACh4jCAAUHD4QACJwIfBAAQtBEYgGBI4QUDFQkP/4qEVYQvEAAIxCEIK5CBwV/AwsfAwocCAwYcCJogcBNIp3F"); +katakana['SI'] = image(56, 52, "gFwAwt+Awv/8AGF/gFDgP//4GGCocDAwIVDBoX/wAHCn4VFg4GB4AxEAwsfAworBEQYABv4GFj4DCjgrCBQYRFn/4JQfAIgIGD+F/JQcD/gGBMARQCOwcH/wNBCoUP/0PAwIrBj/8OwQGBn4fBGIIGCAQIlB+BcBAQKvDBIQRB8AfBIQUH4AXBP4RXBGgJmERoJsFAwv//yaFbYghBQIYaCeAi9FPQTZGdxKFCFASECFAZPBEIgNCJQaZEAwhDDAwRJDTAYGEQAiQBPIgAGA"); +katakana['SU'] = image(60, 51, "gH/AAYGBh4GD/AOG4AOF/gONDo+ABxAACgY7CAAd/+AGEg4OG//gAwkP/wGEgJCCAAcfKIQzEIQIzEIQozOj4zFEgIzFn4kHGYv/M4okIGYt/IQqXBFghuBHYs/bAY6DCwrJECod/HgYVB8ZLEcoMfLQYECCwYVB+BTBCwT7CCwYrBAYIKCCoQDC8BXBEIQSBNoQVBBYP4EAIoCOQPHCoYTB/xdBIwQ8B+6SET4N/dYn/4aCFFgKRFgC+EgPghivEAoI"); +katakana['SE'] = image(57, 53, "gEH/wGEgf/AwkB/+AA4n/4AGEv/gAwk/+AGEj/4AwkP/g4JjA4EBQQ4D/4DD4E/AwIuBv/vAoP/FwILCAAIuBv4GEBgn//wFEAwITEh//CgfwAwMfCIRGB/4BB/5xBAgJTBIQQGBwP/75CBAwOAD4JCBAwRmDDIKYBOIQGDOIQGDOIQbBAwSqBAwiqBAwiqBDYg4Cv4GCHAUfAwQ4Cg4GCHAUBbwbjnHAgADcYYADUYQxEEYq6CVwbDBdQi6CZQYqBAAZcCAwY1BEYi5DAAQ8CegfgA="); +katakana['SO'] = image(52, 52, "gGAAol8AYUD/Ef4AGCn/3/wFCg/+v/wAwV/8//Bgk//AMD8f/FoQMBj/8Bgfg//gBgcPFoYMBFocP/kHFof/4AtDBgMDFoYMBFoYMBgIIBgADBwAtDj4dBHQQMCFoYqCHQQqCFoc/BIIPCCwQtDKYIpBB4IwDIAQwCh45CBIVAFgSmDFIaaDOIYfCVgYfBRYYfCTASTCUoY1BQgZPCD4l/D4kfH4g4BH4YYBH4gFBGQd//4yDBYIyDn4SEJQIlEBgRXEHAg+BFYZRGZYQADBYgAG"); +katakana['TA'] = image(55, 56, "AAMHwAGEh/8Awkf/AGEv/gAwn/4AFDgf/EQkH/4oF/4ACAwM/AoX+FAQGCHIMBCYY5BEIIAC+AhFIAIhDHIQFDF4IhBJQMHF4JDDNIUfHIRpCv5sCn/wDQJsCDwIaBEIIKBwEf/9gOAQaB/gbBFAIPB+YsC/AaB54RBFAIaBAIOAEoJvBOgPh/+DNAJWB+//DQPBQIZyBM4f4LQSQC8EPKAIpBFAMPPgKKCgEcYIZwBiAGDbohwEZ4bdEFILxFf4ghBXwLjEDQhLBCYoaEE4IaDdIQaDBgLBCDIRQENYYTIewRkEAwJCFHYicBOIkAEAhDBS4IAJ"); +katakana['TI'] = image(57, 54, "AAkGAwsfwAGE//gAocP//wBgn//gEBgIFBAAIeBAof/wAYBAwkHAof+gEDAwf4E4YAB4AGBv4TDAAM/AwoxDKQhABLQwiCAAV/MIglBMIglBHwRwDNARbF//3Awv7Awv9Awv+Awv/MQQAD34GF74GFKAUHOIYABSAJxGaYp4Uv54FP40/P4oGHQwQGKKgt/AwrUEMIQGEVYIGLg4bMFII+Fv5TGNAsPQgsHTIoAG"); +katakana['TU'] = image(54, 53, "AAMBwAGEj4FEgf8AYPwgFgn/4BIP/g+Av/ggEP/n/gP/4EAv/v/wQBFQP/z/4CAMAg/+DAMfEIICBDAN/FgN/8YYBBAIaBw4hDDQIVBAYMAn/wDAIhCCwIhDCwIBBwAIBHAIYBEIQYDBAIuBwAjBFQghCJgQhEAIIhDEYQPBh5HBM4IhDQQQhCwYeBCwMBCoSPB/0CIQQhBAQKWDvytBCYTBDv5tBZYYTCAAQTCAAYTFHAITEj4TF/4TEh4TFv4TEg//JgIMDMYIMEO4ImD/53BAAM/AwIsEEAgFBEAZNBIIgTCFocfJwo6BPgpHEgZAEgEOAogAGA=="); +katakana['TE'] = image(57, 51, "h//AAfwg4GE/kDAwn+gIGE/8AAwuAv4GE4E/Awngj4GFNWJNF/gGF/5UF/+/AwvfAwvvAwv3Awv7GJn8IQV/4BJEv59Fn/wAwkf/DJFEAYABg/+AwjJBAxbQBwAGFH4gGBH4gGIIwgGNG4IGEg//LYjyBAwiyBAxc/EQoGGFIJTLdYJvEgF+fIsYAwo="); +katakana['TO'] = image(42, 54, "//AAgU/+AECh/8AgUD/4U/CgYPDn//wAUC/4VCCgIlDAgIKCCgIKCCgP//wUD//gCgQKCn/zBQQ+BDYP8CgMBEAQBBj4KBKYIKC54yBBQP7KYIKCG4QKB35YBBQIUCGQPjNAUD+BXDnB9Dgy8/CicAA="); +katakana['MA'] = image(57, 50, "/4AE/l/A4s/AwvfAwoAN/YGF/oxGHokf/wGLh4GN/4GSg4GChgGDwARBAw3gAwv4Awo7BAwn/4ACBAwIKB+AGDgJtBAwcAUgOPAwYLB94GDgaFCAwTBDAwcfAwoyBAwgyBAwgyCAwgcBAwgyBNgL0ENgIADn6oHDijhFW4wcB4AGDKwPwBwl/fwzUJDgZOFgAGGngGFhADCA"); +katakana['MI'] = image(52, 53, "gPwAwkf/wFDgf///gAwU/AwIVCBgX//AME//8gEHAoQGCBgYGCv4GDFIMPBggoE4A2CCoIuCAweAAwc/BghYBMwswNw0PNwkBGAIbEG4gMCOoYMCOoQMDAwRnE4BYDKYQTEKYRuCKYY8GgCjDAAV+LAtgcTMDbYhTCHobICBwbBDBghZDZwmAZoYGCAogGBCYgiBEIidCBwQ2DS4QMCVYT2CSAb2DBoLpFn72EdJAA=="); +katakana['MU'] = image(59, 54, "AAMDwAHFv/AAwkf/gVF/4VG8AGEh4VHFgoVPFdZBdRogVBgP4CokBFogVBn/wTIkHEwYrCv4ODCoMP/wVDFIP/JYQVCBwgVBGYLICCoTIDCoQCBBwQhCn5RCCoR/DNoZCDDIRRDCoQODg4+CIQYvGCoZCCCoZRDAQV//4SBRAM//4ABwEfAgQAB/ARBAAkPAwvxAwv+Dgv/8YGF/gkD/xCB543DH4P5AoaBBewsAvgGFhgGFAAQ="); +katakana['ME'] = image(55, 54, "AAcB8AGEgf/AwkP/wGEj/8Awk/+AGEv4iF//AFAuAAwcHFAsPFA34AYNwFAQvBgICCFAUHCAIoDDwQoDn4DBKIf/MYIoCDwIGB/5RBAwWDKIYGB456Dv//75RDAwP/JQQmBAwJ6Dj4GBOYYGCOYcP/5zEg//OYgGNDYw3BAwgvBAwaABAwgaBOARZC/wGDOoP8MQI1D+AGDFwPAAwJaBDAQNCJIc/AQJsBTYL3COQc/4ATBXoYdCSgU8J4SNCmCNCNQqoDAwQuBAwgFDFAITEAwK1DAAKZEAAIMFAA4="); +katakana['MO'] = image(55, 49, "j//AAfAv4GFAon/wIGFgYFE/0HAwn8h4GE/AvF8A4Bv4DCAAQzBAocB/+AAwYxBCYkH/wGEh/8MIv4Awk/+AGEGyJfFAFP9AwpOBNuikeAwxfEHoLpFNoZACAwZABIgIACJYYABIAYGCIAYwCHIoABA="); +katakana['NA'] = image(57, 55, "AAV/8AGEn/wAwkf/AGEh/8AwkH/wGEgf/AwkB/+AA4n/4A4rGoIAE/IGF/wGF/9/Awu/AwvfAwvvAwv3AwpQCOOqqEWLV/H4pGGn5GFAw0fJosfJooGGn4GGKgq6BLQoGEg4GFh4GFPoIpEDYIwFv5MFLQ4GFg6EFgaZFAAw"); +katakana['NI'] = image(56, 43, "h//AAf4A25+/AH4AuWggA5A="); +katakana['NU'] = image(55, 51, "g//AAcAh4GFj4FD/0An4GD/kAv4GD/EADQnwgIGE8EDAwnAAwuAIIgvBAAcPF4IADn4vBAAd/8AGEFAIDBAQIsBFAMDCAIoDh4eBj4oCj4GBFAd/CIJRBgBZCAQIlD/+HQIIGD54oCNwZKDPQZPDOYRdDOYqmBOYi0BOYjCBBogGGYQSAEAwimDGATdDAwQTBH4JFBLIP8AwYTB+AqBAwITB4AGBE4bADBIJyBUIJ6CVgXgJAQzBg+BAoJkCgxcBCYRIEPArlEH4YGDO4ibBeQs+AokAsAGF"); +katakana['NE'] = image(61, 55, "AAX/4AGEg/+Bws/+AGEgP/wAHEh/8Cwt/8AGEgf/Bwsf/AMEAAYnBj4GDHwQOEDAMHA4hVBn4WFJIIADHwMPA4hgCAwZkFCQKCGBwpHBPQwOFFAJyGBwt/BwozBBwpwDGYiYEEgP+iAkF4IPDCoP8j7WCUAXhbwYVB/4RBU4n4QISfD54vBS4f+FASPD+AEB+AFB/IjBFIPnA4LzCGAfAeYIjBGAP4eYQCBwZuBeYUH/EfIwJRCAoIDBg6ACnCmDR4oqBDIKfEHgKuFS4g5CBwo8CWwqOCAAQ8DcYg8Vn48FAAo="); +katakana['NO'] = image(47, 52, "AAcHAokP/gFDj/4Aod/+AFD//gAgUB//AAoUD/4oE/woJn4oLEQYoBwAoIh4oEj4oFJZ8HERU/EQhFEDgIiDH4JFDh4iEH4t/NAYcFHII/Dj4cEv4/DCwIcDCwIcDCwI5DCwhEBHIYQBKwf/GYYhBCwc/FoYKBFoYEBFoQKCE4RrBE4YFCHwQyBHAYnBJ4YFBcBN/AgcAPgYABA="); +katakana['HA'] = image(62, 52, "AAP/wEH/gGCgf/gE/+AHCh4MB//AA4QMBCIQeD4ARCDwv4Dwt/8AeEgI4BDwkH/weFj4eEAgIeF8AeEAgQeEAgQeEAgQeEAgQeGMggeCMggeCQYiACQYYbCDwgbCIogbCIoZZDIoYTCMggTCEwn/CYJFDBYZFDBYYmDv4LBEwYDDg4aCh5JCDQYiDaIQWBNAQ5CMAYLDcgYmCCwgqCGIYTBFwL7EJIIWEAgPgh4WDNAPACwgMBCwiHB/wWEFwV/CwZVB/YWEDgPHXgYuBDwLbDKQPwh60CGwWAngGDgAFBkAHEsAFEAAQA=="); +katakana['HI'] = image(47, 51, "//AAgUB/+AAoUD/4QDg/+AocP/gFDj/4Aoc/+AFDv/gFw8BwIuDj+DFwf/FwcP/4uD///FwQKB/wuBJwIFBFwM/AoP8//PAgP/+IDCAAJdBAAXwg4FDEoQKCIIIgCLoQFBKYV//5qDB4aMuF1YFDFwIRDUIQAC+YFE8YFE44FEw4FEUgn+Aon8WwhKBXggA="); +katakana['HU'] = image(49, 50, "/4AEv4FE34FE74FE94FE+4FE/YFE/oFE/w0Dg//AocD/+AAoUB//AI4ngAod/+AFDn4FEj/4Aon8AocPAokHHgg2BHhYFDHgJCLJBZCEAopIFAoxIEAoxOEApc/AojSBbwplEAoZxBAocPAojICBQhBCGYIFDBYRZCa4P/NYQuCPoYFBSoZGFZYsPAgYABA="); +katakana['HE'] = image(61, 43, "AAMH8AHF/4HFh//wAOF/wOG/AHEv4eFg//DwoOBDwgOCDwk//YeEgf/x4eEn/8n4eDgP/4AeEj/8DAIeCBwPgLgkfDYIeECYQeDh4LBIwIeC//wDIIeCBYJdCDwV/BwIwBDwIOBCQYeBn4pCDwRIBIAQeCMIJPD/AOB4CED4BhBMwf/MISbD/kHPovwj4ODDwV/UYhYBKQJ2DRoIGDHQINEcARCCWYgGEDwIOFgb+FDwL2EDwQGFIQoeCBw0YA40AA=="); +katakana['HO'] = image(61, 54, "AAV/8AGEgf/Bwsf/AHF//AAwkH/wOFn/wAwkB/+AA4kP/g8Rg//AAngv4HFCYIAE/EfA4vAAwv+Eo3wn4HFwAGFJwZ5UgfAPIJzDn/x/+PEgR/BAoJzDP4N/8JzD//D/6KDFYI8BCwYrCCAItBPQOH/wWDCgIQBCwf/4P/wIWCCQIBDWgYBCZ4KJBE4LPDEYInBh5sBBgKLBNgQ0CJoIWB4ACCBgIiBBwP8EYU/TQLXBHQQECFAI8BCwIqB8DzCDYMPAgQbCMoI3BF4IRB44OBWwQUBv4TBJIV//InBHgQCBw4OBHgUH/EfNgKOCj0A3BsCQwNgeaSdCABA="); +katakana['N'] = image(54, 50, "ggGFngFEgP+AwkPAws/AwkB/4GEh4GFn4Gaj///gNF/AGF4BEJAwITBgOAAwQTBh4GCnwJCCgVwLgRwMHAgTBHAgTGv4TEgYTFMIITEMAsHMBY0B+ClFCYiPFEAITEv//OIQMCTg3gBgggEDIIgDGYIgDMIJVDDAIABIIILCFoYYCJwZ0BHQgsBBgZnBBggnCKgYhBMIi3FgAFFgAA=="); +katakana['WA'] = image(51, 50, "/4Ay4A3E/AFCh4GBAoUBAoPgAwU///8AoUHBgOAD4nwAoUf//+AoUDGRYSBGQYSCGQd/94yDh/9GQZFB34yDn/zGQcPAgYSCG4YSBC4YSNv4SKJYJwDLwISEn5QDS4QSDDAJjDDAJ2DGIJ2DUYQ+DQYKcFFYYXBDASOCGIQFDGIQRCDwTaCG4YFBEgbHHN4hiFg6HEA="); +katakana['WO'] = image(50, 52, "/4AE34FE94FE/YFE/wYYGocB/+AAwd/8AFDn/4AocP/gFDgf/KovADAnwDB43B45EE+IFE/F/KAkfBgmHAonhAonwDAn8h4MEN5X/N4l/N4k/KwkfRwgoBDwcHOohoBOoYFBEgY2BEgYFBEgYFBJIYXBFQYpBFQZ3CAoIWCKoQQCGwQLDHgR8CAoQdCAoQvCOYYFFn5gENgKREbYgAGA"); +katakana['RA'] = image(51, 50, "n//AAcHAongAon8j4GEwYFE+F/Aof+h4ME4IFE/BYr+4FE/wFE//fAon7BgpYE//vAon9CQo3Ev/gAocP/gFDgP/wASX+ASJgYSFXwJ2ECQivBDAoSEWIs//wFDbYIrDAoI+DAoIYDQ4IYCFIIABDALlDGIJhBewS/EJQQYCG4YkED4QFDD4JJF4AFDA"); +katakana['RI'] = image(43, 53, "AAf/7/4AgMf/f/AgMD/9/8AFBv/v/gEBh/9/+AgEB/+/+AKBn/3/wEBg/+//AFX4q3v4qDh/8FQQPBz4PDAYQvBEYQvCEYI/CGYRPBB4cfIYQpBB4cH/5TCDwJjD/4kCn4EBCgN/AgIUBDoP/FIJHBAAIyCDIYjBIYYaBQ4QaBJoZHDAAoA="); +katakana['RU'] = image(61, 53, "AAUH/wHFn/wAgUB/+B/+AA4UP/gBBCgd/8ABBAwUD/4BBBwcf/ABBA4f/4ABBHQg8FHQI8/HksYHgwYBHgkPF4I8EvwlCHwOAg4gBEYI8CCIQjBHgITBCIP+HgU/CwIRBDAIgB4AMCAgMfEAIMBDAIOCBgQYCIwQMCPYJTBAQI8BBwUHEoN/8P/IYN/+AvBj4LBBwOAj/7BwZGB/4ABBwXAAQIODM4QOFHgIOC/4OBh4OCAYJGBv4OCn4OBHgJKBAYJkBIQISBaIYhCCwIOBSoTqBJQISBeYUHd4U+bYUwcAYAKA"); +katakana['RE'] = image(51, 51, "//AAocf/AFDgf/CQl/8AFDh/8AocB/+AAwc/+AFDg/+GX4ECgwyEgPgGQk+GQkP+IyDC4IyE//3GQc//gyDh//GQYYB8YyD//4GQc//wyDDAOBGQUH//gGQRvB/BlD/4DBGQU/CwIyCj4YBMoQkBBIIyBBAIYBGQIkBDAIDBGgIiD+AFBGoIyBv4eCGQIABJwQvBAAJnDEgTLCEgY8CIYLLDEgZVCAoZuBb4iaBfAj+EgE4AokAA"); +katakana['RO'] = image(50, 47, "/4AEn4FE94FE/YFE/wYF34YS4A1BgIYB+A8Cv/v/gFCj4YBAoUHDH4Y/DEbglDBQ8CAAYA=="); +katakana['YU'] = image(59, 46, "gP/AAX+A4M/A4fggEHAwf8BwIGD/4GBj4VFgYVGv4HDwEAh4GD+A+Eg46CAAf/4AGEj/4Coo6CCqJFBCot/KAIADh5QCQAhQBCrM/Myk/M3JQGh5QFMyIRBAH6NB"); +katakana['YO'] = image(50, 49, "v//AAefAonnAon5Aon+DDA1DgP/wA8E8AFDj/4AocHDFZjfDCJjxDD5WE/+/AonvAon7PgoYX/g3DAAQ"); +hiragana['A'] = image(52, 50, "gEB/wGEn/AAocD/gMcg//AAfgv4FD/wMYFIRNa54HDgYyCBgYsEBgX/+AGBHQYpBCQQaCh4JBJQPwgIdBBAP/wASB4H/j/8MIP8j5fBBIP/4P8gf+j/7/hVBj/jA4PH/C/Bn4RBv8Aj/3/Ef55FB/9/wI+D+/wj40BHwIWBL4QJB+BFBwAmB/4MBD4M/94MBD4JAB/4cBNYN/BgM//AsB/n/z4bBQgOHX4QVB/B3B/CQCAQTSC8BFCB4Q4CB4UAgIIBRQOAXojREn/gaIgAC"); +hiragana['I'] = image(58, 50, "v/gAgUggEf/AGCnkAg/+AwU/gEB/+AAwQZBDgcP/gcECQIcFCQIJCCol/4AGBgYLBj/wCokHCAIABFAIQCCon/DgQECn4cDCoItCAAI+BDggVCLoZeB+BgCCocPPQZUBwZdDJAQcEGAIcEGAIcEGQPDDghIBDggyBDggyBx4cBjxIC8aaCCAIyBLAMDM4IyBSARnC//HUIk/+IyBCASdBLAJKCGQOf/kDJQV/GQRKCJ4XgEYRPC/CoCDgOHNwl/8P/84jCDgM//5HCDgMHAwIjBgP8DwIsBQgYVBSQgVBaYZnCTIgtBbQhDCUAYkCfwYOCGIgAHA"); +hiragana['U'] = image(46, 50, "h//Aoc////8AFBAgIABgEDAofACwIAB/wWD//4CwgdBCIeAFQUfCwIADCwIAMj//+AEBv4tDAgQLBHAYFBAgf/8YFE54FECwRTB/wkCAoP7IAd/OgR2CKwcBQ4kH/hMEJYQcC4AWIh4WEn4tJg6EEj6EEVgIQDE4l/CAbABCAZqBBQgQDBQIQCXwIyCYYTIFeIhlCBQjxCLIQWBMgbdFvzYJ"); +hiragana['E'] = image(55, 50, "gF//4GE/4AB+AFBgIGC/+AgEDAwYNBg4FC/wGBh4GC/gGF/ArFFIQAD4BRVn42FLAIGEJQYGBLAhEBLAhEBLAf/8ArDBIIyEj5fCRYZYEEgJYEN4JNFDQouFDQKcBFwYGFMIIGDLQRJFAwgaBOYQuC8Y2DFwODAwcP/0HXAc//EPcQnAj5LCPAU/MwR4Cv5ECPAQ9CLoUBd4auE/guBVwf5PARaC+5qCAwXnJwSXB//HI4QGCw5ACAwUHNIn+gj/HAAg"); +hiragana['O'] = image(54, 50, "gEB/0AggGCg/4gE8AwUf8EA/gGCv+AB4QaDv/wDQn/CwIaCgP/4AaDgf/wAaCgPn/4PBAAXv/0HAwef/kfAoX+n/4v4GCAgPxCYfg/4jBAAWBGwQ1BgEDJoJQCJoJRBLYcPCAJrCgEcKAaGEHgSGDF4QPCJYYxCHoYMBn5YDBgoGBDIP8FQKiBDwabBFoIzCv/gEAJQCMwWfKAIbBh58BDQMH/l/4IaCh/xTgIaCn/P/BrD/8/4CGD/i3BDQfz/gaDv/P+AaCCAIaEHQQaDv/hGoV4h//g4VB8JnBa4ePZYRkBBwKNCbwPwCYR/C44CB4BtBfgSaD8ACBYQQWBAAYA=="); +hiragana['KA'] = image(55, 49, "gEH/AGEh/wAwkf8AGEn/AAwl/wEAhgGC/4CBngCBgP+AQP8AwMDAYIyDAYUPAwQ2CAwY2Cj/4gP/AAP4j/wgYGC/gGBg4GC/0/8EPAwsfCgd/4E/Awt/FIf/LgJmBE4IGCMwMf8JjBHwIPB4IDBgZmBv+DAYMHMwP/BQRfBOwIKCL4J2BOIQvBAgJxCGQIEBHAKPCCwIYDCwQBBQoRGBviIDIQJRC4AdCXAYdCKIcHboQ/CboY4BboghBboZKCFAYhBjAoDh/8nzME+CfBF4V/RgP/EgKVBwYGBFAMH/zIBFAQeBAwIoDboRRD4DrBJQUHAQJsDAAwA="); +hiragana['KI'] = image(48, 50, "AAMB+AFDh4FL/AFDg4FIn//AAX4ArpHC/xNEAov/LQgFCDgYAlF4UfPx8/g/8CoQbBKgQhCAoMDFAkHAoeAh4FEDgQAB4E/FgIUBwE/HwQdBn/gAoM+AoPAAoMMAohFCAqIpCgI7C4BEBI4oICAoZfE4C9BAob2EAoISCaQgACA="); +hiragana['KU'] = image(33, 45, "AAsB4ADC+ADC/wDBgf/wADMg//CYIDDh4DDD4UfAY/8AY34AZRDCh4DCg4DCgYbCgI/CgH/BgU/BgREBBgIQB8AMCFIRNDLoJ2Cv42DJwQdDFQIdDFQQdDFQIdDHYRkDgYhCgADDnwDChyzE"); +hiragana['KE'] = image(50, 49, "AAUB/0Ag/gAwN/wAICgEfBIIIBB4P4BAYPCh/wDAcD/gYE/4FBDAU/4AYEGIgOCDAQOBh//AAP+v+DAoX/7/AAof3+E/AoX9/gYD/9/gYFD/4YE/5QCGIJQDHYRvCJQU/N4JKCKAYYCKAQYWmAYEjwYEx6lDh/zUocDMgIYDv6cBKgUf/4yBBAMH/4eC4EBNQUfAQN/DYMPE4TjCAQQkCYgSJBDYLEBn7QCAQIbCE4UDDYP/PIV/CgLpD4EPP4UH+AkBAoIACCgIADh6LCAAMDAoYA=="); +hiragana['KO'] = image(52, 50, "h//AAX+gAFD//gBgn/BgvwBiWAAon4GwUBDIQACCQQFCn//4AFCg4lBCQc/DwYfBKQJdEDwYAB8CIihAFEgJJDIgQFEg5KEMgITEj/8D4hwED4JqEOIIfEv5eEg4fEFg0PHIwsEBigmFCYkOv65CJYPnbgn+ZgIAD8IMFewvgCYjRBE4IMDegQABIoUfAoK7HA=="); +hiragana['SA'] = image(51, 50, "AAMB/gFE/+AAwcf+AFDgf+DIl/4AFDg4fEgAfLgIfCj//AFQzCn/gLJYMELI5mEh6GGBgUHGAP4CAQ3COYILCBgUDIgYZBAoYmBn5REDwPgQQPgDAIVBj4fBJ4d+CQI1CgeAXhgSDKoYSEQQp1GQQpFBawXwD4IGBg42BaQngBgRlDBgmABgjzBRYZDCPIYvCv//MQoACA=="); +hiragana['SI'] = image(45, 50, "v/AAgUD/wKDj/wAof/wAECg/8BQc/8AbD/4bE/AbEFgcHFgk/FgcBFgkPDYhIgFgIKDFh8eFgn+FgcH/4sDv+/FgUD/osDn/vFgQ2BFgcf+YsD/+fFgUP/gsDv/HFgSKBLId/8IsCHgIXBSod/EIIKBwIhCv/4h4WBAQOAv/+IIP8AQIAC4AYBAAIkBn4KDJQIKDCwYpBCwRWCAoJhDAoK1DAAg="); +hiragana['SU'] = image(52, 50, "AAUf8AFDgP+BjH/AYP/AAnvAon+BjJAUgf9BgZFB/4MDn4kEg4MFGIwMED4QME+E/+AyC/x0DFgPABwIMC/gMGDIn8gYMFv/4EwcP/+AKYf/BgRACBgYRB/4mCgF/AwJ6DBgoTCRohNDTZE/VAkP/gFDE4PAUQhGCI4YeEUIgYBD4gMBEpI4GgIFEAAo"); +hiragana['SE'] = image(56, 50, "AAcP/ADB//AAwP8AwkHA34FBAAn+A1JalmAGFvinFv4GF//PXghEBAwfBAwoNGEQP/+AGDn4GFh//8AGDg5PCgF/AYP/wAGEgj/CAwQADAw4mCAwZCCAAQ8BFQgGBAAQGBj4GFJQIGEJQIGEgYGFGIIGCIQQVDHQgACA"); +hiragana['SO'] = image(53, 50, "gP/AAXggEPAweAgF/AoX+gEDBgfwgEfCYoFD/EAg4MFAAQMCAAQwBBhQpBJQozBAAU/IAIACIYJUBAAV//gsJD4IsEn4sEOAn+NIn/+4FEAA39AwvvAwqQDAAP7UYhmCx5bDuBVB4BCDg5bEJ4JoEgJ1EEQKCESwIFEg5vEEA4TFh4TFv4TGYgiLBCYrFG/5dDd4YHCOQKkBDQjbDDQQwDWgR5DAwSGEEAgAEA=="); +hiragana['TA'] = image(52, 50, "gEP+AGE/4Mjgf/AAXAgE/AoX8BjUAgP+GYkf8AFDBhHnEIQMBEQQhBn/jFAWAgYMD/AMH/gMF4f/F4UH/kQGYd/KIIACg4VBBgmAQ4gMFUJcB/8DDQZgBv6iD/wuEn/gKIJGDEIl/4KCDC4KPE/+BBgYXBBgY5BAIImCj4MBTIKFB/wMBAAKSB8EPAwXnUYIMDCwLYD95RBEAIZCFQN/AwPBKISpBwEGQAgAGA=="); +hiragana['TI'] = image(51, 49, "gED/wGEv/AAocP/AFDgP/CQk/8AFDg/8Bgn/wAFDj/wBQYAqJ4M/LBZrMJYZ+Ch5aDv/f/4bCBQIABCoMDHAYTBv4+Ej4MEg4DB4IMCAoIcCwE/TwU/+ASBEQI8BVQJLCv/gS4cP/kBMgYWBjyoEgLbJEYYSCQQkHCQg2EHASCEv4SBgYOBOQ70BQoYrBEQIABFYR/DJASRED4YFCBgJDDA="); +hiragana['TU'] = image(59, 45, "AAUP/4FFAAIGCAoX//EAg4GD//ACYYAB/kBAwgOBn4OFDgoOBAYX+BYP8j4GBwEAAgPDGwQ+C/F/BgIABCwOMLQl/+AGEg/+NIv/8BwF/gGEKwIqDAAM/HAYzDEhkfEgsDEgxJGh5JFHQPACqQrBCpkfCopXBCogcBCog5BK4jSCAwxtDDYK8EZIQcCAoQcDCYTjCJgQGCEYT0DIAYGGEgQGDEgRcEv5UEA="); +hiragana['TE'] = image(57, 50, "/4AFv4GF34GF74GF94GF+4GF/YGF/oGF/w7Cn//4BCDAwOAAwpQEj4ZDAxP8AyUPAwwiFg4GMgZFFAw0BLQqlBNAkAv4GG8AGEn/wKgv4KhZGGHALeGH4oxNh4xFOJBjGEYt/VQwVFg//BwhOBAAI7Dv4GBHYYcBCwgcB/5CEDgQyFGYgrCUwkPKAwAC"); +hiragana['TO'] = image(46, 49, "gEH/AFDj/wAod/4AECgP/Cwn8C0cICwcDBoIWC/4NBCwMfEgV/4f/BoIWBv//LAMH/4AB8AWBAoWAgE/BQYlBDYUAh4FBHwQPEEIJQDFYJhCgYwCLQQqCDYQKDDYIKDn5xEEAYQB/x8JDYkDCAkPYIk/JoQWTAol/AocZQwR6B8aNCAAOPAgf+TIZqBAongT4QfCBYY9BW4R1BA="); +hiragana['NA'] = image(55, 50, "AAd/wEAn4CBgH/BIXAgEB/wJEgf8AQIJCg/4AQIJBgEP+ACBBIMAj/gAQYsBEoIoCGwf/GwkB/8P/4AC4f+j4GDw/4n4GDj/wv4FC/0/8AMD/l/4IGD/H/wYGD+P/g4vELARtCMQRtDMQQKDL4YKCMQQKDMQQKDR4QKCTIYKCFYQ2bOoI2C4BgCGwWASAQ2BGQKJC8DNBBAIAB+DNBPYf4ZoKrDAgPwT4K7BAwRdBB4K3BVYIqCVYY6BAwKrB/0DVY3+v/hAwf8n4SBdIXwnxEBAwXgnBEBAwShBO4IbBSYSVCOYQAHA"); +hiragana['NI'] = image(57, 50, "AAMPwAGE//gAocf//wgFwgEH////kH/AZBAwP+gf+Bof/wP/gEDAwWAAIMBAwc/FgIGDj4sBv4GBE4P8HAIdBE4IqBAwYgBKAIGCKAYKBAwN/EYIGDn4jBAwZfBDAQfBLIPAAwZZBDgItENYN/CAIfBIAIGCLIRfDLIXwAwc/RQJmCHAPv/0PEoI4B+f/AwcH/P/w50D/l/wZ0CgP+j/BK4Q4Bg/gJoQ4BwIGBIwU/4EwAQI4CIYICCAYY/EJQMHHATcCbAQKEHARGBGgQqBCIc/D4IGDaITCDT4PAAQJfCQQRYDeQQGDSIIGEYYIGEE4IGEDgYFCcAQ+CGQZsCABAA="); +hiragana['NU'] = image(58, 50, "gEP/AGEgf//wHE/4ABAwc/AwIPDh4OC8AGBg4GCEwUBAwX8Dod/EgoHC4AsF+BJFjAGDg4iEFgRfF/+AAwk/IwQjDFIgjDvAjDMYJlCgRHB4ABBFIUf/ABBFIXH/0HCoUf+BcBLwQpBCogpBCYIVDv+ACohNBn/wCoRxBCohNCMoIVBOIQVBAIJNCCAIVCEYIQBCoOAb4QtDCAQtC/gjCdIIXCN4QwBC4SVBDQIXBEYUP/gXBI4QEBHwPD/8ODgR/CwZNCCYN/8P/5/4GQOf+DtBKgXv/jtBKgX5/0PAwJxB/0/DAL8CvkDJYP/IYMMgFgg//fot/VYQACgYGFAAoA=="); +hiragana['NE'] = image(67, 45, "AAXwA43/4AHFn/8A4sPCA0B//+CAt///gA4kfCA0H/4QGA4IyFn4IBGQg5BIYsD//nCAt//F/CAkf/wzBCAYFBwH//BaE8ArBwBzFCAgNBLoQQCHIPADYIQD/6dBCAk/OQIQEHIQQEHIQkCCARaBO4YUCSYQQDHIQQFHIQQERQgQCLQQQEHIKBDCAPAn5fDCAP8gbNECAaJDCAbVECAPgvj+Gg72GdoqYFCAgHFKIoQDDA0AKIjODDA0ARYQAEhwHGAAIA=="); +hiragana['NO'] = image(54, 50, "h4GFn+AAocB/0IAwcH/F//4AB+Ef8IFC//A/+PAwcD/0fAoX8h/wDQk/4ITDAgMDAwcH/hGC/EAj/wIwXggF/4AGB/+AJIIFBGQJJCDQoWBDQf/wZlBDQIWBh41Dx5kE/0/Mgn4IgIGD8f8MgYaBL4IaEPQJrD/6RCGoRkCKAR/BKAgaBKAoaFNYoWCKIIaC8BKCDQWAIYQaCgJCCDQRyDDQRXDEoOBK4ahBW4K+CAgKcBDgLcBMwIwC/1/4JHBCYP5CoQwC4aND/atBRofDAgPgdQaSBHgX4hxXBHQXAhAOBAwKXCAAJlBbIIAH"); +hiragana['HA'] = image(50, 50, "AAMH/gFDgP/Bgl/4AFDj/wDBsH/4AD/oFE/9/AwoARJVXhAon4JQn+j4MEw4YLn4YEJTIfCAooYCAoX4DgQwCwBdEBgMDHoYMB//3Bgd/8AUC4A7BJQP//kHBwQGB4JYBFoX8KgMP/gGBz/+h//AIPjGAXA//wAoXwh/4DgX4gP8IgQnCF4QFBgOAEIKIEv6SCAA4A=="); +hiragana['HI'] = image(59, 50, "gP/AAOAA4U/AwPwAwUHAwP+CwYVC4AGCj4GB/AGCgYOCCod/AwPgGokH/g8GHQY8CHQYVCHQg8CwEfCAYEBgYQDAgV/JYYEBh5LDj/4GoJKEGoJLCAwP4JYZ9C/BLCNwSGDQgSGDOoaGDAwg6BEYQHDh//EomDAIP+ToaQBEIIvCKoJyCJgPH/yDCEIIVB4BNBMwIgB+CZCn/n4f+h5jBAQMw/+BOgKyCCoN/PIICBS4I0BCoQJBJQJqCBIP5NQfgD4KACn5tDGQSDEwADBTIJaBGQKZEDISvCToR8BeAQDBAQLbCb4RSCAAcHcQYACvwGFg45BAAj/DAAw="); +hiragana['HU'] = image(55, 50, "gED/gGEg/4AwkP+EAhwGCj/ggF+AwU/4EB/wGCv+Ag4GD/4kBAwM//4AB84GBv4GC54GBAoX/x/+gIGDh/+gYFC/0P/kHAwX8AwMPAwX4j5cCGwJOBAwJIDj5jBv4QCAwIpBNoU/+AiBNoIGCJYJtBAwPhFwPANQXjAwOAgEEv+P/A2C/H+CoI2BTIIhBwY2Bh/xwH+UgUf+CwBUgSgBBYKkCn/gh/gToI1B4Ef4AvCBIM/4ZmCIAN/44oBSgKdCFAJ3CLAY0BUgQoBGgIGBEIUPAwSID+AGBQIZHBJQRECd4Q9DI4QvBJwQ2Cj4sBGATRBJwLcDFgTcDC4QGEEILqEAwIbDIARoCBgQAGA="); +hiragana['HE'] = image(55, 50, "AAUf+AGEn/gAwl/4AECBQP/wAYC4EB/4YDwED/wYDwEH/gGCCIMP/AFBgIRBGwcDCIN/GwUH/EP/4bCDAP/AAI2C+4GCHwMfAoX/JgM/AwYjBv4GI8YGCFoN/wIGBgYCBFwIiBHYJfBNAPAn/8IwIGBwAaBh/wAwOD//4R4IfBg//+B2BDoJKB+AoBg/+JQPjOwMP/n/z/nQIMf/IOB76BBn/3/gVBMgN/94nBOQX/7/gAwKbBOwSOCHoJMCEIMH/v/CAJxBh/7/hcCF4X4KYLEC5/wj5KBEIOfGwJRCL4PzF4V/JIQvBCYJJCH4JxB4AGB/xCCFQIJDDoIMBBIRNBAQJdCIwKUCeAb5CPgQACSgIFDSgIFEAAg="); +hiragana['HO'] = image(51, 50, "AAN+AokP+AFDgf+Bgl/4ASE/ASVv//AAX8h4FD/+BAonwn4FD/0HBgnAAogoBgP/HAk/8AFDg5LEgASM/gSFwADBFQIAC8E4Iof+/5FE5/wAof5/0fAwc/8YFD8f8PAYEB54MDJ4SRDJ4KRDj/gNYaoCLAYWBLAYWCLAQWCDYJvDgYSCCwV/NYQWBGQc/+AyDg4yBj4MBgYSBAQP4OwPwbIglBQAgpBBgZiBBgYYBBgY1CU4S0DFoIRCAAo="); +hiragana['MA'] = image(55, 49, "gEP+AGEj/gAwk/4EAkAGCv+AgAPD/8AgYdCgP+EgkD/gdB/AGBg4DBv4GCj/w/wGCv////8AwQFB//4AwMBAwXwEQMDAwXgAwMHAwXAAwMPAwWAG4QvBLgQGBL4X/AwRfBKgIGCL4X8n/gLARUBn5YDMwM8NQaLBQYIoCAQSIDAQRZBRYaBDRYQhBFAIJCKIYyCDwKoBToZkBOAIJBPYKLCGwMH/h2CAwMfKoKKCI4PgSIYYB4afDJQMP/gpB+AhBMgIjB/AhC4EfAwIhCEoIGCwJdBaIIZBMgSkCjhMBgakBG4LICUgKDBAwQuBPgRKCjgGE4EQAwgEBAAIbBRAQACQgIDB"); +hiragana['MI'] = image(50, 50, "h+AAocD/gFDgP/CQl/4AFDn/gv//AAOP/E/AoXj/0HAoX4/+BAoX+DAuf+EfAoXn/gYD/P/gYEBG48f+AFDg5QMMYkf8BvE/BvE/wYE/4YEKAIYYgZSCDAMBJgQYCCgYDBFoYDBj4tCDAJlDDAMBGYYYBNYYYBn4xCg/4h6ECPgIHBPgfBDwaVBQgYvBToYYCFYauBaIIwB5/wcAfz/0PAoX8cAn/IgQFC55dBAoXxFILtC/grBGgL5BYIoAGA=="); +hiragana['MU'] = image(58, 50, "AAV/4AGEj/wAwkH/gGEgP/Aod+Dgv/wAcEj/gDgkH/AcEgP+Dgt/Dg3wn4mBHwYGBDAIyCAwP/8AGBAoQODh4GC/4sBgYGD/AcCAAO/IQQcC4IkCDgI7Bj5YBg//w/8EAIjCwIEBv/gMQPgLAMPFYP//h1BgZpC/4LCNwIxB4YoBFoIxB/AjBNIMH/v+n5UB/4qBn/fIoIJBv+PLYUPQwPhOIUD/gvBGYMH/3/BAX/457CBAP/84GBDgIlB/YGBCYJwB/qECDgKREwBCC34YBDgfvLYP+HIM/+YYCIwM/MoIYB/hGBMoQEBz4nBKQfDAwODGQXwKQQMB/P4j4GBAQP+ngtBUgIRBg6aBRwKiBwOAf4TNBAobjCAogAEA"); +hiragana['ME'] = image(57, 50, "gEP+AGEg/4AwkD/gGEgP+Dgv/Awt/wAGEn/Agf/BIUf8EP/40CHAMf/4tBAYP4AQImBCIP8n4GB4EH//+AwXgEwP/v4CB/EBAYIPBg4jBAwX8BYJFBCQRKDFYIGBJQJxBIgUfAQIrBAYMPCAIfBBQR8CAwR8DMAZ8Cv4GCGIQGDGIU/AwR8BAwKqCWoU/FoS1Cj4tCHASEBWogGBUAQKBAwItBHARpB8BlBBQKuCAQIKBO4SqCBQX8AwX4h/9/wGC/kP/n/DYSlCv+P/ArB4K+B4/4SIV+j/jWIX8n0P+JSBDoMOMwJWBAwOCMwM//ZOCMwI4C75nB/5bC45nBv+DAwPhTgXAb4PAoCfCQQifBYoYAHA"); +hiragana['MO'] = image(60, 50, "AAX//4GEv4HFj4GB/wGCg4GB//4AwMBAwX/4AcEDwcPAwYWBgYGDCwQVC54tCCoX8F4PgFYP4CYI+BgE//0P/gaB/ARB4F/4ApBwAVBg4OBj/8EgITB4AiB4InBBwQgBCAIOCPQPjD4MPJ4MH/0/+ALBwARB84kBBwQ0Bv/gBwc/+5bBj5tEHAR8Bn5lBBwInBBxY2CBwcDWIQOEGwIODJwIOFIoRKC4CNCBQP3AgKwCDIIOBKIQKB8/8IQJgBj4OB8E/MAfD/ytBEgX8J4KeBZwWDIgJCBCoP4ZgIzCAYIqBeYRQB8DnCK4gGBGoIDBwAyBF4IKCCQWBAwIVBEoPgF4RFBg/4F4Q2BAAQOBTwIADHoQADbIQAIA"); +hiragana['YA'] = image(54, 50, "gEf+AGEv/AAocB/4MEg/8DUv///Aj//wEDAwIcBAwMP//8BgIGBn//+IFBAwICB54GCDQQAC/0HAgXAn45BD4IDBn45Bv4MBAYPgGYJKCFAIbB8EAgf+DQRbEv/4LYYaBOQU/4EPCwIhCCYJrCgf8CYkP+BlBCYQaBv6GDOwQaECYIaEKwIaD4JWDgP+CYIaCg/4NQYTB8Z+BFwef+4aCMgN/74aCn/z/zXCIAOH/IaCh5CB44aBJoU+a4QyBwFwDQLGBCAOBX4adBGIJMBRIQaBUYI4CDQJnDFYJ7EDQKzCDQYECAA4"); +hiragana['YU'] = image(52, 49, "AAMf+AFDgP+Bgk/8AFDgYMM/gkD/4AC+EBAof/BkA5FhEAg45Cg/AgF/AQMBBIMP/4DB//gE4Xwn5dBn4GB74IBgY0Fv4FD8AfBAoYfB/gbBIAIiBg///A7B/+A/4rBCQIxBBAISB/ghBCQeBEoIMBCQI0BBgQSCDIYSB54MBgIlB+AMCj0H/0PBgIABHQQMBOgP4BgZBBBwTDCMYIMDKIIMRWQQmDAwUMYYqyBAoaxBN4IMEV4QMCcggMBWwbZCAweA"); +hiragana['YO'] = image(55, 50, "AAMHAwsP+AGEn/gAwl/4AFDgP/BgkD/whF/AGEj4oFEIsA/+AEIgoFg/8EIooFJQ3/JRcHJSgoGJQxEEg//FIkfAws/Cgv/AwUGJQX/HwMP8AoB74GBj/gh/+IoU/4BzBBQJBCJQIKBNQRzBv+AWoIIDJAP4SoMBIgIkBOYMDHoKTBAIIRBXgQBBB4IfBEIQYBFALgCCwMP/iVCJAXwJ4QfDcAX/4JRBSoRvBEIZ2DcAQGCFQIhBPoIYBcAQGBDAJqBCgQ6Bg7rIAAY="); +hiragana['RA'] = image(48, 50, "gEP4AFDj//wAFE/gFE/4TCn4FBBgQFCBgQRC//gBgN/BYUP/EBAog3BGIIFCgH/BAIFCh4FEgQFEBoXwAqsfAoIuBAoROBEwIFBIwP+AoPnLIWALwZfBNQf/+AFE/AFBEIM/AoR6Bh/8OoIzBg4FBRgQFCL4UD/wlBAoikCAoM/W4QFBj5dCAoMGAohpDg4FEHYJ1EAog5DDgJWCb4Y/Cg7RDaARFCAoZFBAobiEeoruCAoQtCAoI+DAAgA="); +hiragana['RI'] = image(40, 49, "ngEDn/AAg9/4Ef/AEBwF//4EBwP//4HBw4EB4F/x4EB8F/z4EB+H/n4EDAQIjBCwUPAgUAAgX+gEH/n//gEDHIMDAg3wAgP+AgvgAhBeBAhmAAiJ3BAhf8AgRUBAhBXBAAJtBAgSgCVgRcBAAJXCEwIEDj5SCBoJDCBAKSBBASSBXwKICAgQmCAgIcCv4SCAgI0DeAY="); +hiragana['RU'] = image(51, 50, "gf/AAXAgF/AoX8gEPBgeAgIFD/EAn4MEg4FD8EACQoACn4lBAAUf/4FDDYOAAoQuBHwIACv/wDwgkEh/+DwoFDDw5ECDwRLDMwg5BLIZMBNgh/FGgIeB+AVB4AeBEYJmBBAJQBDgPBOocf/AoCVIU/Kwc/+5WDg/+Kwl/5/wh4mBh/4/A2CFgMOAoJDC8GBMgUHGAJQCCQKpCBgISBgf+SQMPCQN/4H/4YSBGIIwBCgMBDoTMCn/AEIROCLoKFEAIJvBTwZvCTAarFNIQFCXASyCYoYxBAoYAEA="); +hiragana['RE'] = image(56, 50, "gEf8AGF+AGigP/wAGDg//GYQGBh//C4M/AYICB/AGDv///gGC+P/AwQKB+YGB/wNC+//w4GDBYMDAwn4AwQ3BFQIGF8AGF4AGFgAGEAYMDHwIGBAYIGDn5XBAwhlBAwd/Axh6CAwSPBAwMHAxEDAwqdBAwidDAw5IBOoQGDU4QGDUAIGE//fAwufCgrmCh4iCAwk4nwGE/EcAwbSBjAGFegReCUgIGJOYIUEQIYGCIYOAAwPgAwIAIA="); +hiragana['RO'] = image(50, 50, "AAf4gEB/4AC8EAv4FC/kAj4MDwEHAofwDAgSBDAoACn/+AocfAokP/4FDE4OAApED//AAohJBAAI5BAocAIQIFEHghFCD4QFCBoU/KIQMBNQZ9BOAhOCQYYFE/B8CE4QFBM4JGB4YuDj/7AocD/xIE/+fP4c/84FDh/8QoZyBj5mE4aFDn5yEDAIFDGIIFDIgIXDDwKREv4eEv4eBiAFCDwMH+A8BIQLnEEgLnDSooqBQYQFCDgQ2DAoolCJAgAD"); +hiragana['WA'] = image(51, 50, "AAV/4AFDh/4AocB/4DBj/ggE/AQMD/0Ag/8DgWAgH/AQMP+ASB//AgISBAoIDC4Ef///+ASBh4FB/4SBgYFC+E/4IFC/8H/F///9//g/8f/3/x/+j/nAQPwv/j/H/wf+I4N/KAJlBv+P9/4MoMP/f9/xlBAIIqBwAUBn/vFwIdBg40BNIIOBIIR7B+BbC8B7BKoX4uAyCAwM+GQX5//f8IyCn/z/hHCK4N/4/8h/8/4EB/4lBF4P/z5wB8f+RYJjBPoPAFwO/BQP4IQX/wJkCTAUfVYf4gf4BgS4BbQRiCcgbSCAAILEcALkCAAM/DoYeCC4ZLBfoIeD/ASEDAhoBAoYlBDwcAg/ABggAEA="); +hiragana['N'] = image(54, 50, "AAVgAYUP8EHwAGCv/Av4RD/8D/wFCgf8g/8DQf4j/4AwU/8E/+AaDwF//4VBgIfB/4GCD4MPAwcf+YFB/4jBn4FC/4jBAof/4AYC//n/+DBYeD/wZC/f/FgIrCGIQsCKYU/444CKYP/z4xCvxOBv+/8EBQQP4B4KFCCoJeCNIYPBQgQKBj53CAYSbBCYQDBHgJbCTYUDOQZHBM4QTBTYX/GQQxBP4Y8BDQRGBTYY4Eh5MDHgZTDAojdEbAYGEHgIGEv7/DHgIhFfAh1EEIg8GEIg8GTYYhDHhYAF"); /// ///////////////////////////////////////// -let kana = katakana.KI; +let kana = katakana.KA; let scroll = 0; -function drawWheel () { - if (scroll > 20 || scroll < -20) { - scroll = 0; - next(); - } -} let hiramode = false; let curkana = 'KA'; function next () { @@ -658,6 +124,7 @@ function next () { } curkana = 'KA'; kana = hiramode ? hiragana[curkana] : katakana[curkana]; + updateWatch(ohhmm); } function prev () { @@ -669,7 +136,6 @@ function prev () { curkana = oldk; kana = katakana[curkana]; return; - } else { } } oldk = k; @@ -677,37 +143,18 @@ function prev () { } curkana = oldk; kana = katakana[curkana]; + updateWatch(ohhmm); } const kanacolors = { A: [] }; -const clocktop = false; function updateWatch (hhmm) { - if (!hhmm) { - hhmm = ohhmm; - } + g.setFontAlign(-1, -1, 0); g.setBgColor(0, 0, 0); g.setColor(0, 0, 0); - if (false) { - g.fillRect(0, 0, g.getWidth(), g.getHeight()); - g.setColor(0.3, 0.3, 0.3); - g.setColor(1, 0, 0); - - g.fillRect(stripe_pos, 0, stripe_pos + stripe_width, h); - - g.fillRect(stripe2_pos, 0, stripe2_pos + stripe_width, h); - - for (i = 0; i < h; i += 8) { - g.setColor(0.15, 0.15, 0.15); - g.fillRect(0, i, g.getWidth(), i + 3); - g.setColor(0.4, 0.4, 0.4); - g.fillRect(stripe_pos, i, stripe_pos + stripe_width, i + 3); - g.fillRect(stripe2_pos, i, stripe2_pos + stripe_width, i + 3); - } - } else { var whitecolor = false; if (curkana.indexOf('A') != -1) { g.setColor(1, 0, 0); @@ -723,27 +170,15 @@ function updateWatch (hhmm) { g.setColor(0, 1, 1); } g.fillRect(0, 0, w, h); - } - // GOOD FONT SIZE g.setFont("Vector", 62); - g.setFont('Vector', 50); - const bignumbers = false; - if (bignumbers) { - g.setColor(1, 1, 1); - g.drawString(hhmm, 12, 12); - g.setColor(0, 0, 0); - g.drawString(hhmm, 10, 10); - } else { + g.setFont('Vector', 50); if (whitecolor) { g.setColor(0, 0, 0); } else { g.setColor(0.5, 0.5, 0.5); } - if (clocktop) { - x = 26; y = 26; - } else { - x = 26; y = h - 42; - } + x = 26; + y = h - 42; g.drawString(hhmm, x - 3, y - 3); if (whitecolor) { g.setColor(1, 1, 1); @@ -751,63 +186,58 @@ function updateWatch (hhmm) { g.setColor(0, 0, 0); } g.drawString(hhmm, x, y - 1); - } - // drawKana(hira_a, 0, 60); - drawKana(hiragana.KA, g.getWidth() / 6, 60); + + drawKana(4 + (g.getWidth() / 6), 60); + drawMonthDay(); Bangle.drawWidgets(); } -function drawKana (img, x, y) { + +function drawMonthDay() { + g.setFont('Vector', 20); + g.setColor(1,1,1); + g.setFontAlign(-1, -1, 0); + g.drawString(month, 4, y-20); + g.setFontAlign(1, -1, 0); + g.drawString(day, w, y-20); +} + +function getPhoneme(k) { + switch (k) { + case "TU": return "TSU"; + case "TI": return "CHI"; + case "SI": return "SHI"; + } + return k; +} + +function drawKana (x, y) { g.setColor(0, 0, 0); - - // g.fillRect(0,0,g.getWidth(), h); - if (clocktop) { - g.fillRect(0, h / 2.5, g.getWidth(), h); - } else { - g.fillRect(0, 0, g.getWidth(), 6 * (h / 8) + 1); - } - - if (false) { - g.drawImage(hira_a, x, y); - g.setColor(1, 1, 1); - g.setFont('Vector', 30); - g.drawString(curkana, x + 32, y + 4); - } else { - if (clocktop) { - g.setColor(1, 1, 1); - g.drawImage(kana, x + 8, y + 12, { scale: 3.4 }); - g.setColor(1, 1, 1); - g.setFont('Vector', 30); - g.drawString(curkana, 0, y + 16); - g.drawString(hiramode ? 'H' : 'K', w - 20, y + 16); - } else { - g.setColor(1, 1, 1); - g.drawImage(kana, x + 8, 26, { scale: 3.4 }); - g.setColor(1, 1, 1); - g.setFont('Vector', 30); - g.drawString(curkana, 4, 32); - g.drawString(hiramode ? 'H' : 'K', w - 20, 32); - } - } + g.fillRect(0, 0, g.getWidth(), 6 * (h / 8) + 1); + g.setColor(1, 1, 1); + g.drawImage(kana, x + 20, 40, { scale: 1.6 }); + g.setColor(1, 1, 1); + g.setFont('Vector', 24); + g.drawString(getPhoneme(curkana), 4, 32); + g.drawString(hiramode ? 'H' : 'K', w - 20, 32); } var ohhmm = ''; function tickWatch () { const now = Date(); + month = now.getMonth() + 1; + day = now.getDate(); function zpad (n) { return (n < 10) ? '0' + n : n; } const hhmm = zpad(now.getHours()) + ':' + zpad(now.getMinutes()); if (hhmm !== ohhmm) { updateWatch(hhmm); + ohhmm = hhmm; } } Bangle.on('touch', function (tap, top) { - if (top.y < h / 3) { - // clocktop = !clocktop; - return; - } if (top.x < w / 4) { prev(); } else if (top.x > (w - (w / 4))) { @@ -816,10 +246,13 @@ Bangle.on('touch', function (tap, top) { hiramode = !hiramode; } kana = hiramode ? hiragana[curkana] : katakana[curkana]; - tickWatch(); + updateWatch(ohhmm); }); +g.clear(true); Bangle.loadWidgets(); tickWatch(); -setInterval(tickWatch, 1000); +setInterval(tickWatch, 1000 * 60); +// show launcher when button pressed +Bangle.setUI('clock'); diff --git a/apps/kanawatch/fontmaker.zip b/apps/kanawatch/fontmaker.zip new file mode 100644 index 0000000000000000000000000000000000000000..39c7d5d5373d785cf9e543ee4a7e6c04cc81f351 GIT binary patch literal 65124 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 literal 0 HcmV?d00001 diff --git a/apps/kanawatch/metadata.json b/apps/kanawatch/metadata.json index 09bfc2d36..9a145d4d1 100644 --- a/apps/kanawatch/metadata.json +++ b/apps/kanawatch/metadata.json @@ -2,7 +2,7 @@ "id": "kanawatch", "name": "Kanawatch", "shortName": "Kanawatch", - "version": "0.01", + "version": "0.03", "type": "clock", "description": "Learn Hiragana and Katakana", "icon": "app.png", From f4cf75a541d1f5839b695eb5b71955de041193a5 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 28 Jun 2022 01:42:12 +0200 Subject: [PATCH 26/34] Update screenshot --- apps/kanawatch/metadata.json | 2 +- apps/kanawatch/screenshot.jpg | Bin 21235 -> 0 bytes apps/kanawatch/screenshot.png | Bin 0 -> 2992 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 apps/kanawatch/screenshot.jpg create mode 100644 apps/kanawatch/screenshot.png diff --git a/apps/kanawatch/metadata.json b/apps/kanawatch/metadata.json index 9a145d4d1..8593c8f82 100644 --- a/apps/kanawatch/metadata.json +++ b/apps/kanawatch/metadata.json @@ -25,7 +25,7 @@ ], "screenshots": [ { - "url": "screenshot.jpg" + "url": "screenshot.png" } ] } diff --git a/apps/kanawatch/screenshot.jpg b/apps/kanawatch/screenshot.jpg deleted file mode 100644 index ac7447ee82e33bca916317ffcb7af8948c0bf990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21235 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 Dnfa#} diff --git a/apps/kanawatch/screenshot.png b/apps/kanawatch/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ed879aa1a3b8bef32bb80f4c08b1443530a177 GIT binary patch literal 2992 zcmc&$=|7Z>8s=f7LAIGt7;9!IOR|?r7?WMu!@PE3MrpCNJds@nS+fi?vW>*CX7EHv zmQW^ZrV@pWUdt%rc+c;5{(|%2e7NuHcVG8)eY&p?cY=)-Rsenk&cVSUfHO0;+sEhs z6fe(yuW6cd-v`c6JFF4Mvmwdv92|UCamME_hq?bK_#RQE&u{XCeec_*{0WR~V}n+h z(DL?LPc*$=sE4YTT2oWQQrpD>xPzzBA)^Bt%SxPZ3t>A^GF0)dmx)oAGPAr7lv$yo z%b*)FTAc8F{X6`Hz&r3gH#%f-T_X%`ap3h;=g-a$9pghOlAOrfwEM08f>u|Vd@$d;*nlML|D06 zzvZ!C@^|jKlPZD01AZ{~p`!1c4U% zJ!MIk7Cp_n-y4&+iq%eTCfL5t^DgmvhW?>(Y%mYAx-I3llDi-FEx{5ZRq*Qb?@NM5$sz42xp17GRwGy&@8FJevc){AFRq61>BUd7fI-ssr1U zr9y^xS3V-f<4C~vR!ih1Jj&>Q5cRV+-DTQf&Swm*9}s`~NDInPS&I*7(x}d6Ml2Bd z?azjr8)@vz8ukAEV9Vr)XqQDlPo4c2dl5<4*gB0NL(&m6h;u#af(;(k@wJK=YY?LZ zLyTWgd$|b$2BJ|LD-xU85}x%Do$w&VZ125(__D?7SgT(-;lE@rd|5&4T>)UA=ldV> zDF__x3ojin`|-y_dId~5*dC!%1IfRd2_<11s�Pi)X@SJ7PR%+Tce2<*}39l{e#% zPUgwTaWk5=4m^mtSnWUcc$(`dB=*7v&xPIhe*KDxk$vgNG6FyJsjEDf6LY_YE&L;$ z{WT$Sea0y5k>4daO=e#Bul08JA*?^bNtVcH^X^Hq$~f$Rzn|s!z}Yp9CMHEncNB&5 z50^k3RGcMRo#Ug*>cD~Gfm*JLPZ#pJ`&1xWoQ~luTy9(60wSyxSF??363U!5jyGui z{kJS(hOZ{j+xG7v#CU6L?)ELq>&_rwJ-zSjAw6?$))C+C>NK{qOylhQ@U0hDBZ;Gq zLTpt*;Ly^x6>WO<$J2#_f6Jx6kBg8X=+#TGJcT!+T-_6a&E-60{xsbqSX8nQ`4XL`Ew^B^}RW%e1o0%_KnU} zx6vJ!BGRS_s0dLGALp#NquN~~r4!LM@-yH=Xb`Hc(eC(Y#9Iyj$xC>d?Gap-2zLyE zp%4-L4rbUH>?R?9c%?7hF}-kUt!Ms|$c9W}4|xMOwMzk5T zxoxVatOD97sL@kDmxD*DjRKav3el^e5UjDhoFzXq;VSmG9@Y{}6L}_h&plNnXJT}S zqT%O@bN5by*)#1tU48ByIy6Ib3_mwk9g)I_Z}tlhggpkL@9EW=F0Nt0H<1YO6XZ&- z`emeU2VBpQ{PWnd_>ZXM;)8NZzNRzL_Zd%IwkP*G=BnnT6PP*Lz_$_RwSJk6fECbu z;fBNzGB|9aN{18IbLZ|l-Q>>-HdKxBTKv=1t+~KZ*3e|+hMMO;J(&C_ah$j{A}1e;eTz{n+0+wRTAF*Uk1L%W zXc;Nx7i$jJy7!@B;*qr+wQ_Lw^h)mPV)(JL+)&Er_D8d(!Ll@)A-=lAAQAQ+$*zBF z`tCnFS5Tk=QVp+UJM8c*6yCFe-RgDrg!LGP5~}E~9T_}C*Uy^3 zPM`@ckcW5nXzi6(%HaaX6?2_IgUd{vZw+FiZ!U6s1Pv;E`fX}V>wJjHcOZJ8SJmpI zw=bG+q*Zo#JpbxTf$_L==}hcamu!UA4;P$oAtY$1gs|YpeK>Ze-9XN3BxU|sS0c}= z;@oIJNmzU`%PjZ6+=N1`a>c3a>nMWsBf)E(jnuC8!91E{2Se;`awIdAz|f<1bBd*% zdi68ZftieKPXDVs;wtx|Y_0EI$QvFd3l{0{1@Pg8(RSYbI|6B#RT%8BwJ1%5Q;t=J zuvId#6MhPbA)7I^_V|~_zEKszRuBL?;_V?$)T)r!#t$vN{b-txA%D@UpzXqeO9Gc` zlrtUK$^c5QAR~4+KPxW7(ev$eJasTSv#{6S9kj>uXI?h}PefwXlzzfYDe7Sh?(TSF z&vlRf_w<$Ojtw>Wz!bNn8V9Lrq@_s3fwF?0ftE8Ow`YxHfW5!H;zUc8D0 zr(){(qUiPsQ=GW0FAJU7^-WKU*X&t7ds?W<-E&&}DXy}lEp6)zR99Dn@77<)trKWw z${~7u5`5>%9*33vkmf>c#@TOdu=O0EJZ?zzS3G(d>{1Og`FcWiP`>Uq;oO`aa!WFY zCmojP8^z&Li#zd*d=_Kp=*?HgnAGB@ED&Bb#6o+eb<&jw5_xvt0POh~+RU#n(XSDC r+JOgY3HiY|{QHiy^P>vGNswTL^R&j#U}O6J3(kQvu`+&Ugn#gF@6nHi literal 0 HcmV?d00001 From 98bc3bf9bd78c6cbbac1f98782ef312a3dc8cc6d Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 28 Jun 2022 01:56:11 +0200 Subject: [PATCH 27/34] minor fies --- apps/kanawatch/app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/kanawatch/app.js b/apps/kanawatch/app.js index 26123378d..d08b644a0 100644 --- a/apps/kanawatch/app.js +++ b/apps/kanawatch/app.js @@ -196,9 +196,9 @@ function drawMonthDay() { g.setFont('Vector', 20); g.setColor(1,1,1); g.setFontAlign(-1, -1, 0); - g.drawString(month, 4, y-20); + g.drawString(month, 4, 112); g.setFontAlign(1, -1, 0); - g.drawString(day, w, y-20); + g.drawString(day, w, 112); } function getPhoneme(k) { @@ -206,6 +206,7 @@ function getPhoneme(k) { case "TU": return "TSU"; case "TI": return "CHI"; case "SI": return "SHI"; + case "HU": return "FU"; } return k; } From 3ead5bbcacd09301ba4442c0f84a4ec679100230 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:59:08 +1200 Subject: [PATCH 28/34] Add files via upload --- apps/widscrlock/ChangeLog | 1 + apps/widscrlock/widget.js | 10 +++------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/widscrlock/ChangeLog b/apps/widscrlock/ChangeLog index e6d9f3512..94a8dccec 100644 --- a/apps/widscrlock/ChangeLog +++ b/apps/widscrlock/ChangeLog @@ -1,2 +1,3 @@ 0.01: 25/Jun/2022 Added Screenlock widget to depository. 0.02: 26/Jun/2022 Tidied up graphics. Fixed versioning style... +0.03: 28/Jun/2022 Tidied up code. \ No newline at end of file diff --git a/apps/widscrlock/widget.js b/apps/widscrlock/widget.js index 27ba2df07..cbb71e4cc 100644 --- a/apps/widscrlock/widget.js +++ b/apps/widscrlock/widget.js @@ -1,14 +1,10 @@ // Screenlock Widget (() => { - var widX = 0; - var widY = 0; function draw() { // Draw icon. g.reset(); - widX = this.x; - widY = this.y; - g.drawImage(atob("GBiDAkkkkiSSSUkkkkkkiSSSSSUkkkkiSSf/ySSUkkkSSf///ySSkkiST/ySf+SQUkiST+SST+SAUkSSfySSSfwACkSSfySSSewACiSSfySSSWwAASSSfySSSGwAASSSfySSQGwAASST///+222AASST///2222AASST//+A222AASST//wAG22AASST/+AAA22AASST/2wAG22AAUST+22A222ACkiT222A222ACkiSG22A22wAUkkQA22222ACkkkiAG222wAUkkkkSAAAAASkkkkkkSQACSkkkg=="),widX,widY); + g.drawImage(atob("GBiDAkkkkiSSSUkkkkkkiSSSSSUkkkkiSSf/ySSUkkkSSf///ySSkkiST/ySf+SQUkiST+SST+SAUkSSfySSSfwACkSSfySSSewACiSSfySSSWwAASSSfySSSGwAASSSfySSQGwAASST///+222AASST///2222AASST//+A222AASST//wAG22AASST/+AAA22AASST/2wAG22AAUST+22A222ACkiT222A222ACkiSG22A22wAUkkQA22222ACkkkiAG222wAUkkkkSAAAAASkkkkkkSQACSkkkg=="),scrlock.x,scrlock.y); } // add widget. @@ -18,7 +14,7 @@ draw:draw // Draw widget. }; - setInterval(()=>WIDGETS.widscrlock.draw(), 60000); + var scrlock = WIDGETS.widscrlock; function restoreTimeout(){ // Restore LCDTimeout settings. @@ -27,7 +23,7 @@ var options = []; Bangle.on('touch', function(button, xy) { - if(xy.x>=widX && xy.x<=widX+23 && xy.y>=widY && xy.y<=widY+23) { + if(xy.x>=scrlock.x && xy.x<=scrlock.x+23 && xy.y>=scrlock.y && xy.y<=scrlock.y+23) { options = Bangle.getOptions(); // Store current Timeout settings. Bangle.setLCDTimeout(0.1); // Lock screen. setTimeout(restoreTimeout, 1000); From f308ee7802ce2d9f95c2f52742645839b5db3394 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Tue, 28 Jun 2022 12:06:11 +1200 Subject: [PATCH 29/34] Add files via upload --- apps/widscrlock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widscrlock/ChangeLog b/apps/widscrlock/ChangeLog index 94a8dccec..84e926362 100644 --- a/apps/widscrlock/ChangeLog +++ b/apps/widscrlock/ChangeLog @@ -1,3 +1,3 @@ 0.01: 25/Jun/2022 Added Screenlock widget to depository. 0.02: 26/Jun/2022 Tidied up graphics. Fixed versioning style... -0.03: 28/Jun/2022 Tidied up code. \ No newline at end of file +0.03: 28/Jun/2022 Tidied up code. From 579e57f82e042f6af4bca47c9b5e6f9e4ef6acc5 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 28 Jun 2022 08:41:12 +0200 Subject: [PATCH 30/34] Do not show widget at wrong position Better readability of IF statement --- apps/widbaroalarm/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widbaroalarm/widget.js b/apps/widbaroalarm/widget.js index 229bac721..2febd1eb2 100644 --- a/apps/widbaroalarm/widget.js +++ b/apps/widbaroalarm/widget.js @@ -73,7 +73,7 @@ function showAlarm(body, key, type) { */ function doWeNeedToAlarm(key) { const tsNow = Math.round(Date.now() / 1000); // seconds - return setting(key) == undefined || setting(key) == 0 || setting(key) < tsNow; + return setting(key) == undefined || setting(key) == 0 || tsNow > setting(key); } function isValidPressureValue(pressure) { @@ -262,7 +262,7 @@ function draw() { } g.reset(); - if (this.x == undefined) + if (this.x == undefined || this.y != 0) return; // widget not yet there g.clearRect(this.x, this.y, this.x + this.width - 1, this.y + 23); From a7e99ede91880a97ee92bb37d7914e87cb71e1d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Jun 2022 09:53:59 +0200 Subject: [PATCH 31/34] Update 0.03 - Show storage stats for free, used and trash --- apps/info/ChangeLog | 3 ++- apps/info/info.app.js | 17 +++++++++++++---- apps/info/metadata.json | 5 +++-- apps/info/screenshot_1.png | Bin 3399 -> 3589 bytes apps/info/screenshot_2.png | Bin 3825 -> 3903 bytes apps/info/screenshot_3.png | Bin 3620 -> 3236 bytes apps/info/screenshot_4.png | Bin 0 -> 3334 bytes 7 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 apps/info/screenshot_4.png diff --git a/apps/info/ChangeLog b/apps/info/ChangeLog index 400e7a119..093dd4606 100644 --- a/apps/info/ChangeLog +++ b/apps/info/ChangeLog @@ -1,2 +1,3 @@ 0.01: Release -0.02: Recfactoring and show weather data. \ No newline at end of file +0.02: Recfactoring and show weather data +0.03: Show sizes for used, free and trash through storage.getStats \ No newline at end of file diff --git a/apps/info/info.app.js b/apps/info/info.app.js index 9de80affc..ade3f3ebb 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -32,13 +32,22 @@ var screens = [ name: "Software", items: [ {name: "Firmw.", fun: () => ENV.VERSION}, + {name: "Git", fun: () => ENV.GIT_COMMIT}, {name: "Boot.", fun: () => getVersion("boot.info")}, {name: "Settings.", fun: () => getVersion("setting.info")}, - {name: "Storage.", fun: () => ""}, - {name: " Total", fun: () => ENV.STORAGE>>10}, - {name: " Free", fun: () => require("Storage").getFree()>>10}, ] - } + }, + { + name: "Storage [kB]", + items: [ + {name: "Total", fun: () => storage.getStats().totalBytes>>10}, + {name: "Free", fun: () => storage.getStats().freeBytes>>10}, + {name: "Trash", fun: () => storage.getStats().trashBytes>>10}, + {name: "", fun: () => ""}, + {name: "#File", fun: () => storage.getStats().fileCount}, + {name: "#Trash", fun: () => storage.getStats().trashCount}, + ] + }, ]; diff --git a/apps/info/metadata.json b/apps/info/metadata.json index 97aeb687a..ac56cd5c3 100644 --- a/apps/info/metadata.json +++ b/apps/info/metadata.json @@ -1,7 +1,7 @@ { "id": "info", "name": "Info", - "version": "0.02", + "version": "0.03", "description": "An application that displays information such as battery level, steps etc.", "icon": "info.png", "type": "app", @@ -11,7 +11,8 @@ "screenshots": [ {"url":"screenshot_1.png"}, {"url":"screenshot_2.png"}, - {"url":"screenshot_3.png"}], + {"url":"screenshot_3.png"}, + {"url":"screenshot_4.png"}], "storage": [ {"name":"info.app.js","url":"info.app.js"}, {"name":"info.img","url":"info.icon.js","evaluate":true} diff --git a/apps/info/screenshot_1.png b/apps/info/screenshot_1.png index 25f5b0a8bea17a3edd50da81e9196af01a22756b..6661c122c698bd35591f64cbd078c098e4b55ff1 100644 GIT binary patch literal 3589 zcmb_f=|9wc|NYJwl%=v}-wMMJW<-=VdzvWwzKybzY(osmP?lUW$WFFqhH31}Fs|Ho zE)qu8%O1v3AxhnIKl=RxzXzZ9d2-H!&+GL*=e*u27D!`GHX$|u060xe4DK_K^uKqG zg)!@zS6vtY3cYWv57dr|d|{BfObzs`B3N3vxXtgOLRAWeZ@BmcrY7*A zQ+CPY8J7stC%=CD_;EU>BS)$M7lR`w`UmJi%n*`pZaH=OAN@a364*aa3+XQ_i_@Z+ zm8b42!g-q{j{+6@2ZR@wjEjR4UaQMW zE#*##&+_3B&)bcRX5N*T+^Tm0{W_{XsJckty{r~ub9p4x4bP%2X*4}^P(3fhrrhV* zXF=mh{`T@^z1G3qxi#+Py12M|LXdr#B~+`u(og9~>4wd>fBX6A7NFTAG4;u`;S13V zFFQA(SkYfH*D4Zq$=iA7-i}pHYhjpV*_6sJ#`0X2m+XLdv&ApX^CEi#*q2Oti9ZF; z?usC;HAW?aT{xZYP_+wri0^PC= zI>Zq$0FvKoeO+Dxv#~{7_>1onbs%AI&WRba??jn&{69HRgl|UQvC#!&+2un+`8L5V zF){je9-^0(jW*gM*2OAES}fNbE`WBljy);H`Z`)KSQW}bAxp6EmGazBR!-7&KVpuH zWAQ(NQ=JrpuxrK+Ob#*`uy9)&1c!3IC3A2rP3!J>epYVu3~fDwuviA{P6wVAK5D!v zBELwS9i%FnL?G4NG50b%Hs1$*J-~H*(DvK-&ODQkbn?J1^x|1a%&RMiUbcpCJqYH;$P~A_a@u1rKl<1i^jgU-bUA_*~g1D zrhF@L$Emabu({MRVp6D*-sJyhsABqWNmZXbbHSOOsQeGvVW*1D86(=;)wZ{z`Vd6T zJo}@W-?Z?Z8+(BfVYh~_R`>OLZMBE_9EyMLF?@cQ-kAH~nMqtKg^y{8cxwd1r8L1q zmH0T0!p@A9GKDuGJ!k1asMQ8KBVMe*V=!|vj19Fk^DIhM;Gy5~>)(+52U2I1E4j-`VgyB1|T-RVAa7tHiAS*g1m)>CigDeXEqqL~KR0?1nIbXJtKUEv#Mv*4}QuD-Lvj>_8Z%AviMnlmuzR_dWUZ|X>vWUjPnk&jt zulGKdL__Qs?hdfDAURNQpSy{$;xuj0c_tA>Nr#dW)`*U~!aT!;O9q|f6%<1G=QfTI zKFc($?X^oMI|_RAJWh0LTWJH1ti_As$IZ3pZ}%CvwBMw@8J8V=S8=hLo(=go`;vLg zj47@B%M%Py`nl-U*;?b&$z46qLpARWJBP!-y>&w48@46!>z1UVg81>y5BZVcT*$Dd zq3&|IXS3!Fg-twaqFQJ8Ml@VmbKoEy;V3<%CU`>#Xk2^%@?IvW!rNF}27FH7NQMWI zj`l?*7@$ak-1Z9GRi%)5Ip0K0j`RlnF5dQK@~`u95}4bMYYu$b&Mi$!NyX_i@RgHq z#~Uy>vN5^8_!Yz6S965wDlveIqSRN}w;15UKt(T}A^U%k>oN`hO8mKVB3Jj6O>TZ% zfD%xpn)119v8{2r{k8~mFsog8PzrTb8rPrygrGvapu!ofrK`GP%zENXchoJ*vAJS5 z-adXoi`e{w!0{e%@t0{>NPY14q`a_H9p11+Nrv@_F>pI&*AHW(QCDkNcdFmCCmcrD zkOQWN$_}-OpAWxkxvVwzpQ&g}`KC#{1pKoxupCx%)g-3jPfs#=(x*&W+cVuE_BEXB z!Ok8fKhuvktvsYfZ@DIc=eWNPKE&-4Mw}BKp9+Fh&@Ut~alZo#8oQzHx0f9}&^I4? zBgoOO1TdMSJKF&f`Ey;ckUe~bK!~LeW`R*hU9qh%rrtgJ3O|?yZOKVPxZ@01VzEG} zio|@!@;aN#vNgWf?s$lr;Xm54 zP#FL4M&D7qngT(zarPb~-(81SLrO6K{{=_bK0gp73et!({hzZRmTl*BJPGvvNt}Hz z++!Jw2)`nXs3cA&O=ccMdkcepMVag$FUsqEM@rFT54I*=JofL4+Y8qYy!(O<@_u-e zNp>QMUe{chEj@ms4kjly{ob3Hc1|BP3t$c|?KJ}sUF3b46l?e-saAP?Vc<7qkmTxB z5?{7$TQJ;`bCBVa_3s@>2RWcer?U6q*82Dg#WzlXiladhuLaAj+2OA0Ifwp=uMQyv z))7syo12rRwmI$>@AJFyn@=rR_ZuyUvj}MLJT>?@OUiwIlNPCxU(#=&pWk7A$%4}< zXw-MnW$S}}mBWyEF&EF3IwfZ1!Enlu2RmCYj_*6Sl-jIeLb6PwtvI{eZ68%nVrmjD zrs)%O2prTm@_8H7vc~jL8XSmU2$;_pVROvNo>w8R-Q^fA#K zB*_VD0n6wvGb6l^P|y^OOy?M(649wOhM6=d%=OFV$yZ@XB6;s=e+q;2kOT0=U(@#?jIaAq3=6q25)^~uuV+!i7rVG4c0ED0vyBY{Q?OZ=Iu~bPnuNQ<-#+7qN+oyJvhoHj z!urjQ4M9h-=2ZQWt>GqN;=^-GZ5L`;|J9nbVt;ggEaAq-@CG*o9RV13d&Q|t2tE8B zl_ls9#*|v%Dek2dAHbY?#&J@=5(XiKiR#g3P>0^LX;Wu#Drzc#9=k0H&j*#!jo8Dm zXXmK6I7Ly)>2(KinZb1jbpq+IOp zvSvAgv^p@cFa4=vdDFl_wHc=Ih=YE8!*W{^Q7HbPD}QBk?vW5Mre?Elp{>-Bg-4w2 zX368of!|Nrc5nia{ig(lnR>tluJHJUwJuO^R#V7pVxcQ-kdO=yDF%aoXwxS{6BxO# zXOP#z$b^{Uqb&_R5U4<+%zUm219aYtJ}h8V3i6Vr%ExnZgu61WtyABb1^!F>)qhGDzlZod6t7{8iSl+VXaohAXk|Z(~Y1K7~^XB ze0OHF_}d`xoMx_WS0ZP0%m+@2)cn#G&e^-OuS{AO7OMo5^EA#&@>5sV4M&iPd@|Rj zR+T|wC*gY`@Kc;%>F(Enjo3TR;#)Uc0gxoh87Gb;cn4MKtFqtnjL*wNGs`TJR>;4IH_^ z+Yf1JS_@nzq!Uj+z;{6tgJj#C$S}=`=?;>1l`Oy8r`oWm=cvRngWopKvMb8-vILd6 z=^D9d!g6>O-;EGUvR=?~hq?WbB&H8UZbL!5TZ24&UHv*XD5aha?PQM(sJ!H^9!1uM zP!)LIvKSg!(H%ANE@OLp)4a70Ii%CzkoUyCwV=3uL;i literal 3399 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 BcGmy^ diff --git a/apps/info/screenshot_2.png b/apps/info/screenshot_2.png index 517a83299fe937020cdbd4e427cc4e7de98ae6e0..3d91fcabe9564e39488a1b88ef3b55d387199aca 100644 GIT binary patch literal 3903 zcmbtX=Tp-Qu>B>00HI2iqVy)6(2EMvL{LDamrz2JCRIQnV7Z`F5u^wrp((u@loBZc zA(RM65?U-Y6ChUzpvd*{X5N4BKJ1>^nfc_yyK+ z9I&OEUkLLjVM}r^rT+Kl1fA-DxXFBxiC&vuKza#dMWjV$gH!*i?2EHR9j&f*Bop?B zHkD9qMIjodX}ngvz5(RFpwN78F8^g_yjjRz6f+l!JJLkX;!koB=LjdA9Z?%?jGY+z zX>*vpb}V#n04`GZfsIZuKpi2}t)DVt`4AB(zDT5xYCvxAt$^vzYXeMrC>P+;qf&FR zHqDLTQkITFA7;7~D7ipbJEm)wz!32*cM z@(XU&se|DH%nt9@iT;)XD5#h1E*jtX{Dilc*Dc23OjoSL`9zo`%JNJbNspEgQ9D=s zOXm7$P#H*Pafy{OoH?ilFSzm5LDtMs?ylR`!wM4rvR*$+q};d9>(eQ`@o10IL~Z6O z5lnYsvSBuU$(CEwY4*l}kzE?)`>XvT#lU4DvbaK-M<+9Rx?-HJ_SPF15JN353t`_|($@~yDbFFT?~lQE z4_W({Qb2#AfVg;XVE6oo=Zk76Z!YZ44m)L8`Y7r+7!{a8%uMMP@JtQixHd@;Qny*G zpKKP1huj;y&y*u^s?bG-Rdt8e3fwAcV zr#jiFa?*R3Q817w*6oxHDlaKzVFe~j-R1Apx~qtFb02-6q?@NE2~OAJH?t2SXbj&+f=up zfxC01a}z%FmsT8%B8gyBRqW)hw3;n6mF6pY=DCc?%?&UN+#zp6Ja%t2vWPWxdoS;{ z0Slye+C!ZORJQN)!1L}MCn0XoS$$7a6l$}l;V@0jRwEY54Wonrnp)<>jveOM#Y6K zb!6J=|IEV$qtMb7_Lj~{A!YjHA8q2x60G!!o_Jarn7Fu9Ik4+>Ezxcg#TF(Ji0_fc z)J@s~9hdt}XoQO}%F?zOB&$g0Hkt5YvM0`#O1N0nH?sMw**| zO-Sv5-xf-e5{y5f)y^4VlkNuw`yi3kAKgRNw6G;uM*0>~^x3WUy#Qc`nV*phs2;;8 zYT7|4!lxM4T+J0>0E)*$af`ieNalBvJTcNO=(61xO5nS=^{DDx>Cq6Vo@SM-p?X;} zzI`k!aK1C>VF{0jMj+hd2q>NL!@OZaPKmh7JjG}N94-#ua89WTaJS;}b zJhQE`ead*{14T4=Wd82(TV;!U#y`{bh$n&|Tb>qAe^ZyT^5GKc2#u8nr6hSC$zjFW z)eW>0ZsxtDQPH53D9ZQ6=U^=?LD58I-Fo9qO&A_m0J^_S*YGnB(-gIs6C{O>#Lw#$ zm9kNw<2)RkSN{7kD5m(iPI(~x_pY-+Q`v&yr~Oc`bG{-JvPsP7A@q*Z-!t^=vqO8+ zv-73!=>I16553$yg?&Lwk#%^cVnxM9`ErFfC(=+gNO~g1W1*9`HTnn zl(Od6Bs+RGJ*}xI3xNBOb%)~`8q^=Vy zHi++R*uf0uJhsTYUTmDHVg6;kO-FNE*+!vBKQo1fgQa~IiPYMe1s(9(upN)nQ=+u? z_y@_d@PB9wRk1WD)%T(0#ArVAlr|(^LB72!*56JLo2c9^{%sVmGYL#zm$K_i$ky>JX zou}sPF(5z*y6X1>r$BUSCH}HwvtPA3vt%qhU&gZhEY@@N9ZYl21GF{6A;#tOf?opl zZj}QZL0$jArfLP;M@A24L&T(8F$&?NW#x=V%HORK_KBjJQ+!Mk&>9kWOpt0sC z>9Xr5?l}UtO!f8ybhH^!qAG1AYw^Q+#(Qm%{v8gTgD!quoAk#VF9f`{Yp?>a8QEb0 zTo9LH-mS|(puo-J8h#$^wTD-5{sKWzqCr&%N!U{K%i4N_;d0}@GqwDlt0r%? zuqrpkjU-(ttE^EL8*bh)QEAP)z|P?v-}QfNjYbKpCGrNFTS9yO;qqUk-SaC}TYHXd0S&c#t&(K9U~~ zM#1C5uR&A%`rKDy6z*Ff)17q})b{3d6Xa?eWHa0W3&u_X(-hPL*x(lhtH0kuV9i`* zHda!ak^m=8vEedBmLJP^V)%zu-EC|!;*#n8&a`Q#I{+g(Ct0~xV6L))|-(9#PE|Y<1G#kh*(MHMW26v=P2km7e-8l z=5wuOkq%o+L=ti=_bhBd_{;bd?a&?>RH~y15Bf%s<~L%%}c{9cnK3@2S!CQtI-sOAA0Xd1{go z%A0?G$}u*xbV4_O|NQFzpAcka>&kYu#Cg7h&wg6edcNde?a_D#;o{`rz(5lmWkJ`v zWlEu=ikke{d+|LR0%V|T#j3t;-*MjGQRCCl!=4#8S&?-5=Fq(e7q^`7oZG!(y6oj? zNn(dZW{%F{AAEE)y!yrfJ8P1glGI<#FTSzeWXW?gjI8p8&T=kwX%TX(i?7CjsW7ts zv&Nb48<-|!5iqqZaud`&o>MVUXc)?kpdPoJNj2QC*mK*~l-vRlXDwx!{_W`&kWo9! zSS7`=A{@Ef_tcS3Vm*+^KODUrs94g&d(9hx5qXWv@m)6pDK>fSSoIGXA(!S}cFDh) zM8`*>6H7VOJ6u024(FC?VPkP^2ooT|&mZdx%CRmi(!}0hKQe@$XIDo@$Dk`Yo-_y2 zJYI#tvHAbvp%WnmJ)mO!#(62Sx?5M&b|AI41kq7O4${6XuijLK&k}d;v<1=TlWi;z zmtB}CW7DKM9{XQ|&lD7fs;JJFb)#~$uoc+NoSX-uuBNS^3yWRExcT+^DV(vvb6q)+ zKpB7d>BYTUYfox(4eI#z=H&OOP%`{v*dfeJt#qPWnkCR1%jAFWIT(z&b}_c!9R#`; z&!m<5|F6YUNpI`k*V+dvs#}6UMwZUmiTU6QlB&FJvv~WahK_i;7XzqXzAQVPKsh)8sEuNJAF%1H#_1sDI=xg^~e}4;+4k0i`m=K z9m@UZZby7ni~R_`K99|(<9E|vtqS=84bL;lk^8HR^~!_b2ifUF`G;wTo7q6X*FOUs zc!0*~kv?iOm37lFWILurIV{uQ6Yg!Ghf?tVT)&OYr3AxprWoCQCIc#yX0HHZ!txnt z{Gwpx_~5`TAGq3A&MhywaTQ=n&oMB4Gth&Xj*0b?=`Fd-4Jvl6P%D9J1-i{3Igs)1bSD!#?t7PX}z!WYV} zwQk`%oPi7Y9jGfm{js4}-m6N_GGkmXMeumeRBg|n-*HiuS(EL4xfRf1{d)Q7=?=&a fNugbs|AP$alSU6ERq9VaV&JOzb+cwuMEd^#Lq%2U literal 3825 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 C7%aU2 diff --git a/apps/info/screenshot_3.png b/apps/info/screenshot_3.png index 6802495f5edb75442a3b7e397ddc19bfe8a4710a..86bbb67cfe08f568866c1e352a3dc285f13d50fd 100644 GIT binary patch literal 3236 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 literal 3620 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 Qdiy{&mUb467rj&d5BxC2SO5S3 diff --git a/apps/info/screenshot_4.png b/apps/info/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b59b1efa0310fc12ff47493d0bc44293afc25c GIT binary patch literal 3334 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 literal 0 HcmV?d00001 From 81aac3b16422f1cfbfe5c4a4ce5e7f23fba74c7b Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Jun 2022 10:08:52 +0200 Subject: [PATCH 32/34] Performance improvements BW clock. --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/app.js | 36 +++++++++++++++++++----------------- apps/bwclk/metadata.json | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index f9bc5e65a..ef4edcff0 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -7,4 +7,5 @@ 0.07: Improved positioning. 0.08: Select the color of widgets correctly. Additional settings to hide colon. 0.09: Larger font size if colon is hidden to improve readability further. -0.10: HomeAssistant integration if HomeAssistant is installed. \ No newline at end of file +0.10: HomeAssistant integration if HomeAssistant is installed. +0.11: Performance improvements. \ No newline at end of file diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 4b7deb21e..804c79e4a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -63,12 +63,11 @@ Graphics.prototype.setMediumFont = function(scale) { Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom( - E.toString(require('heatshrink').decompress(atob('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'))), + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+MB//5wH//DAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAACDAAAYMAABgwAAGDPAAYP8ABv/AAH/gAH/sAB/gwAHmDBAAYN8ABh/wAH/4AB/8AB/8wAH+DAAcYMAABgwAAGDAAAYAAABgAAAAAAAAAAAAAAAAACAMAB/A8AP8B4A44DgHBgHAcHAcPgMA++AwD74DgPBwOBwHAYHAPBw4AeD/gA4H8AAgPAAAAAAAAAAAfgAAD/AHAcOA8Bg4HgGBg8AYGHgBw48ADnHgAP48AAPHgAAA8AAAHjAAA8/AAHn+AA84cAHjAwA4MDAHAwMA4DhwHAH+AIAPwAAAeAAAAAAAAAAAAA8AAcP8AH9/4A//DgHD4HAcHgcBgPAwGAcDAYA4MBwBxwHADnAOAH4AYD/gAAP8AAA/4AAABwAAACAAAAAB8AAAHwAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAH//wD+AP4fAAH3wAAHcAAAEgAAAAAAAAAAAAAgAAAHAAABfAAAcfAAHwfwH8Af//AAP/gAAAAAAAAAAAAAAAAAAAAAAAAcAAAAzAAADeAAAPwAAH8AAAf4AAAPwAAAzAAAHAAAAIAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAH/8AAf/wAADAAAAMAAAAwAAADAAAAMAAAAwAAAAAAAAAAAAAAHIAAAdgAAB+AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAPAAAP8AAP/AAP/AAP/AAB/AAAHgAAAAAAAAAAAAAAAAAAAAAAP/+AB//8APAB4A4ADgHAAHAYAAMBgAAwGAADAcAAcBwABwDwAeAH//wAP/+AAAAAAAAAAAAAAAAgAAAHAAAA4AAAHAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAACAAwA8AHAHwA8A4AHwHAA7AcAHMBgA8wGAHjAcA8MBwHgwDg8DAP/gMAP8AwAPADAAAAAAAAAAAAAYAYABwBgAHgGBgHAYOAcBh4AwGPgDAZ2AMBuYBwHxwOAeD/4BwH/AGAHwAAAAAAAAAAAABwAAAfAAAH8AAB+wAA/jAAPwMAD8AwAfADABwAMAAAAwAAD/8AAP/wAAAwAAADAAAAAAAAAAAAAAAAAAEAH/w4Af/D4B8cDgGDgHAYMAcBgwAwGDADAYOAcBg4BwGBwOAYH/wBgH+AAAPgAAAAAAAAAAAAAAAB//AAf//ADw8+AOHA4Bw4BwHDAHAYMAMBgwAwHDgHAcOAcA4cDgDg/8AAB/gAAB4AAAAAAAAAABgAAAGAAAAYAAMBgADwGAB/AYAfgBgP4AGH8AAZ/AAB/gAAH4AAAcAAAAAAAAAAAAAAAEAAPD+AD/f8AP/g4Bw8BwHDwHAYGAMBgYAwHBgDAcPAcA5+DgD//+AH5/wAAB8AAAAAAAAAAAAAAAA/gAAH/AwA8eDgDAcHAcBwcBgDAwGAMDAYAwMBwHBwHAYHAODh4Af//AA//4AAf8AAAAAAAAAAAAAAAAAAAAABwcAAHBwAAYDAAAAAAAAAAAAAAAAAAAAAAAAADgByAOAH4AwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB4AAAPwAABzgAAOHAABwOAAOAcAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAIAA4BwABwOAADhwAAHOAAAPwAAAeAAAAwAAAAAAAAAAAAAAAAAAAAAAAAABgAAAeAAAD4AAAcAAABwAAAGAPnAYB+cBgPAAHA4AAePAAA/4AAB/AAAAAAAAAAAAAAAAAAAAAAAH8AAD/8AAfj4ADgBwAcADgDgAHAMD4MBwfw4HDjhgYMGGBgwYYGDBhgYOOGBw/w4DD/jgMAOMA4AYABwBgADwOAAH/wAAH+AAAAAAAAAAAAAAEAAADwAAB/AAA/wAAf4AAP9gAH+GAB/AYAHgBgAfAGAB/gYAA/xgAAf+AAAP8AAAH+AAAD8AAABwAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwHBwHAePgcA//DwB/P+AAgfwAAAYAAAAAAA/+AAH/8AB+D8APAB4A4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAAHAcAAcA4ADgDwAeAHwHwAPAeAAMBgAAAAAAAAAAAAAAAf//8B///wGAADAYAAMBgAAwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAHgDwAP/+AAf/wAAP4AAAAAAAAAAAAAAAB///wH///AYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYAAMBgAAwAAAAAAAAAAAAAAH///Af//8BgGAAGAYAAYBgABgGAAGAYAAYBgABgGAAGAYAAYAAABgAAAAAAAAA/8AAH/8AB+D8APABwA4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAYHAcBgcA4GDgDwYeAHh/wAGH8AAAfAAAAAAAAAAAAAAAAf//8B///wAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAB///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAOAAAAcAAAAwAAADAAAAMAAABwH//+Af//wB//+AAAAAAAAAAAAAAAAAAAAf//8B///wAAwAAAHgAAA/AAAHOAAA4eAAHA8AA4B4AHADwB4AHgHAAPAYAAcBAAAQAAAAAAAAAAAAAAH///Af//8B///wAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAAAAAAAAB///wH///APwAAAPwAAAPwAAAHwAAAH4AAAH4AAAH4AAADwAAA/AAAPwAAD8AAA/AAAPgAAH4AAB+AAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///AfAAAAeAAAA+AAAA+AAAA8AAAB8AAAB4AAAD4AAADwAAAHwAAAHgH///Af//8AAAAAAAAAAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAB///wH///AYAwABgDAAGAMAAYAwABgDAAGAMAAYAwABwHAAHAcAAPHgAAf8AAA/gAAAAAAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwAJwHAB3AOAD4A8AHgB8B+AD//8AD/4wAB8AAAAAAAAAAAH///Af//8BgDAAGAMAAYAwABgDAAGAMAAYAwABgDgAHAfgAcB/gA8efgB/wfAD+AcAAAAQAAAAAAAAAACAMAB+A8AP8D4A44DgHBgHAcHAcBgcAwGAwDAYDgMBwOAwHAYHAOBwcA8HjgB4P8ADgfgAAAYAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAf//8B///wH///AYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAf//AB//+AAAA8AAAA4AAABwAAAHAAAAMAAAAwAAADAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAYAAAB8AAAH+AAAD/AAAB/gAAA/wAAAf4AAAPwAAAPAAAD8AAB/gAA/wAAf4AAP8AAH+AAAfAAABgAAAEAAAAfAAAB/gAAB/4AAAf8AAAH/AAAD/AAAB8AAB/wAB/4AA/4AA/4AAH8AAAfgAAB/4AAAf8AAAH/AAAD/wAAA/AAAH8AAH/gAD/gAD/wAB/wAAHwAAAYAAAAAAAQGAADAcAA8B8AHgB8B8AB4PAAD74AAD+AAAHwAAA/gAAPvgAB4PAAfAfAHwAeAcAA8BgAAwAAABAQAAABwAAAHwAAAHwAAAPwAAAPgAAAPgAAAP/wAB//AAfAAAH4AAA+AAAPgAAB4AAAGAAAAQAAAAAAAAGAABAYAAcBgADwGAA/AYAPsBgB8wGAfDAYHwMBg+AwGPgDAb4AMB+AAwHwADAcAAMBAAAwAAAAAAAAAAAAAAAAAAAAAAAD/////////wAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAB4AAAH+AAAH/gAAB/4AAAf+AAAH8AAADwAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAA//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAA4AAABwAAADgAAAHAAAAOAAAAQAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAee8ADxxwAOGDAAwYMADDgwAMODAAwwcADjDgAHt8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wAHgeAAYAYADgBwAMADAAwAMADAAwAOAHAA4AcAB4HgAD/8AAH/gAADwAAAAAAAAAAAAH8AAB/4AAP/4ABwDgAOAHAA4AcADAAwAMADAAwAMADgBwAPAPAAeB4AA4HAABAAAAAAAAAP8AAB/4AAf/4ABwDgAOAHAA4AMADAAwAMADAAwAMADgBwAHAOAf//4B///wH///AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAcw4ADjBwAOMHAAwwMADDAwAMMDAA4wcADjDwAHseAAPxwAAfGAAAAAAAAAAADAAAAMAAAH//8A///wH///AYwAABjAAAGMAAAYwAAAAAAAAB/gAAP/AwD//HgOAcOBwA4cHABhwYAGDBgAYMGABhwcAOHA4Bw8D///gf//8B///AAAAAAAAAAAAAAAAAAAH///Af//8AB8AAAGAAAA4AAADAAAAMAAAAwAAADgAAAPAAAAfgAAA//wAA//AAAAAAAAAAAAAAAAAAABz//wHP//AY//8AAAAAAAAAAAAAAMAAAAwAAAP5////n///gAAAAAAAAAAAAAAAAAAf//8B///wAAGAAAA8AAAH4AAB5wAAPDgAB4HAAPAOAA4AcACAAwAAABAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAA//8AD//wAHgAAA4AAADAAAAMAAAAwAAADgAAAPAAAAf/8AA//wAHAAAA4AAADAAAAMAAAAwAAADgAAAPAAAAf/8AA//wAAAAAAAAAAAAAAAAAAAA//8AD//wAHwAAAYAAADgAAAMAAAAwAAADAAAAOAAAA8AAAB+AAAD//AAD/8AAAAAAAAAAAAAAAAH4AAB/4AAP/wABwDgAOAHAA4AcADAAwAMADAAwAMADgBwAOAHAAeB4AA//AAB/4AAA8AAAAAAAAAAAAAAAAH///wf///A8DwADADAAcAOABgAYAGABgAYAGABwA4AHADgAPA8AAf/gAA/8AAAeAAAAAAAAAAAAB/gAAP/AAD//AAOAcABwA4AHABgAYAGABgAYAGABgAcAOAA4BwAD///wf///B///8AAAAAAAAAAAAAAAAAAAP//AA//8AB8AAAOAAAA4AAADAAAAMAAAAwAAAAAAAABgYAAPh4AB/HgAOcHAAwwcADDgwAMGDAAwYMADhwwAOHHAAeP4AA4fgABA4AAAAAADAAAAMAAAAwAAA//+AD//+AP//8ADABwAMADAAwAMADAAwAAAAAAAAAAD/gAAP/4AA//4AAAHgAAAHAAAAcAAAAwAAADAAAAMAAABwAAAOAA//wAD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAD+AAAB/AAAA/gAAAfAAAB8AAA/wAAf4AAP8AAD+AAAPAAAAgAAACAAAAPAAAA/wAAA/4AAAP8AAAH8AAAHwAAH+AAD/AAD/AAAPgAAA/gAAA/wAAAf4AAAH8AAAHwAAH/AAD/gAD/gAAPwAAAwAAAAAAQAMADAA4AcAB4HgADw8AAHvgAAH4AAAPAAAD+AAAeeAADw8AA8A8ADgBwAMADAAAAAAEAAAAcAAAB+AAAB+AAAB/ADAA/h8AAf/wAAf4AAH8AAD+AAB/AAA/wAAH4AAAcAAAAAAAAAAAQAMADAAwA8ADAHwAMA/AAwPMADB4wAMODAAzwMADeAwAPgDAA8AMADgAwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAP///9//////8P/wAAADAAAAMAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAwAAADAAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAB4AAAPgAAA4AAABwAAAHAAAAcAAAA4AAADgAAAOAAAB4AAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH//gOf/+Ax//wAAAAAAAAAAAAAAAAAAAD+AAA/+AAH/8AA8A4ADgBwAMAHAHwAPgfAA+AcADAAwAcADgDgAHgeAAOBwAAQAAAAAAAAAwDAADAMAAMBwA///AH//8A///wHAwDAcDAMBgMAwGAwDAcDAMA4AAwB4ADADAAMAAAAAAAAAADDhgAe/vAA//4AB4PAAGAMAA4A4ADABgAMAGAAwAYADABgAOAOAAcBwAB4PAAP/+AB7+8ADBBgAAAAAEAAAAcAAAB8BmAB8GYAD8ZgAD9mAAD+YAAD/8AAf/wAH+YAA+ZgAPhmAD4GYAeAAABgAAAEAAAAAAAAAAAAAH/x/8f/H/x/8f/AAAAAAAAAAAAAAAAHAAB9+HAP/8eBz5w8GHDBwYcODBhwYMGDBgwcOHHA848cDx//gDH98AAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAP/4AB8HwAPAHgB4AOAHH8cA4/44DnBzgM4DuAzAGYDMAZgMwBmA7gM4DnBzgGMGcAcABwA4AOAB4DwAD/+AAH/wAAD4AAAAAAAE4AAA/wAADbAAANsAAA2wAAD/AAAH8AAAAAAAAAAAAAAAAAAIAAADwAAAfgAADjgAA8HAADGMAAA8AAAH8AAB44AAOBwAAwDAAAAAAAAAAAAAAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAfgAAB+AAAAAAAAAAAAAAAAAAAAA/AAAP/AABwOAAGAYAAz8wADPzAAMkMAAyYwADP7AAOYcAAcDgAA88AAB/gAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAP8AABw4AAGBgAAYGAABgYAAHDgAAOcAAA/wAAA8AAAAAAAAAAAAAAAAAADBgAAMGAAAwYAADBgAAMGAAAwYAA/5gAD/mAAP+YAADBgAAMGAAAwYAADBgAAMGAAAAAAAAAAAAAAAAwMAAHBwAA4HAADA8AAMGwAAw7AADnMAAH4wAAPDAAAAAAAAAAAAgEAADAYAAMwwAA3DAADcMAAPwwAA5/AADD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///8H///wAB8AAAA4AAADgAAAGAAAAYAAABgAAAOAAABwAAAeAAf/+AB//4AAAAAAAAAAAAAAAAAAAA/gAAH/AAA/+AAH/8AAf/wAB//AAH/8AAf///x////H///8AAAAB////H///8f///wAAAAAAAAAAAAAAACAAAAcAAABwAAAGAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMwAAB7AAAH8AAADgAAAAAAAAAAAAAAAAAACAAAAYAAADAAAAP/wAA//AAAAAAAAAAAAAAAAAAAAAAPAAAD+AAAMMAAAwwAADDAAAOcAAAfgAAA8AAAAAAAAAAAAAAAAADAMAAOBwAAeOAAAfwAAA8AAAxjAADwcAADngAAH4AAAPAAAAIAAAAAAAAAAAAAAAAQAAADAAAAYAAAB//AgH/8PAAAB4AAAOAAADwAAAeAAADgAAA8AAAHgAAA4AAAPAAABwBwAeAfADwPsAcD4wBgeDAABgMAAAP8AAA/wAAAMAAAAAAAAAAAAAAAAAAAAQAAADAAAAcAAAB//AgH/8PAAAB4AAAOAAADwAAAeAAADgAAA8AAAHgAAA4AAAPAAABwAAAeGAwDw4HAcHA8BgYHwABgbAAGDMAAcYwAA/DAAB4MAAAAAAAAAAIBgABgHAAGMMAAZwYABvBgAH8ODAefwcBw+HgAAA8AAAHAAAB4AAAPAAADwAAAeAAADgAAA8AAAHgHAA4D8APA+wB4PjACB4MAAGAwAAA/wAAB/AAAAwAAAAAAAAAAAAAPAAAD+AAAf8AADg4AAcDgOPgGA58AYDngBgAAAOAAAB4AAAfAAAB4AAAAAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAAAAAAAAcAAAPwAAH+AAD/AAB/sHw/wwfP4DDG8AMMb4AwfP8DA4H+MAAD/wAAB/gAAA/wAAAfAAAAMAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAGABgAYAGAB///wH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAf/AAD/+AA/B+AHgA8AcABwDgADgOAAOAwAAYPAAB88AAH7wAAZ/gADjOAAOAcABwB4APAD4D4AHgPAAGAwAAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAAAAAf//8B///wGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAADAYAAMAAAAAAAAAAAAAAB///wH///AYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYAAMBgAAwAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAYAAABgAB///wH///AYBgMBgGAwGAYDAYBgMBgGAwGAADAYAAMBwABwHAAHAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAAAAAAH///Af//8B8AAAB4AAAD4AAAD4AAADwAAAHwAAAHgAAAPgAAAPAAAAfAAAAeAf//8B///wAAAAAAAAAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwABwHAAHAOAA4A8AHgB8B8AD//gAD/4AAB8AAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAA/+AAH/8AB+D8APAB4A4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAAHAcAAcA4ADgDwAeAHwHwAP/+AAP/gAAHwAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwABwHAAHAOAA4A8AHgB8B8AD//gAD/4AAB8AAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAADgYAAHHgAAO8AAAfgAAA8AAAHwAAA/gAAHHAAA4OAABAQAAAAAAAAAAAAAAAAP/jAB//8Afg/gDwA+AOAH4BwA9wHAHnAYA8MBgHAwGA4DAYHAMBw4BwHPAHAP4A4A/AHgB8B8AP//gBz/4ACB8AAAAAAAAAAAH//wAf//gAAAPAAAAOAAAAcAAABwAAADAAAAMAAAAwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4AAADwAAADgAAAHAAAAcAAAAwAAADAAAAMAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AAAA8AAAA4AAABwAAAHAAAAMAAAAwAAADAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gAAAPAAAAOAAAAcAAABwAAADAAAAMAAAAwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAEAAAAcAAAB8AAAB8AAAD8AAAD4AAAD4AAAD/8AAf/wAHwAAB+AAAPgAAD4AAAeAAABgAAAEAAAAAAAAAAAAAH///Af//8AGAMAAYAwABgDAAGAMAAYAwABgDAAGAMAAcBwAA4OAAD/4AAH/AAAHwAAAAAAAAAAAAAAAAf//wD///APAAABwAAAGAAHAYDAMBgcAwHBwDAePgcA/+BwB/ceAAg/4AAB+AAAAAAAAAAAAAAAAAA+AAHH8AA894AHjjggcMGDhgwYPmHBgGYcGABhg4AHGHAAPb4AA//4AA//gAAAAAAAAAAAAAAAAD4AAcfwADz3gAeOOABwwYAGDBgGYcGD5hwYOGGDggcYcAA9vgAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPPeAZ444DnDBgcYMGDhhwYOGHBgcYYOA5xhwBj2+AAP/+AAP/4AAAAAAAAAAAAAAAAB8AAOP4AB57wHPHHAY4YMBjBgwGMODAcw4MAzDBwDOMOAce3wBB//wAB//AAAAAAAAAAAAAAAAAHwAA4/gAHnvAY8ccBzhgwGMGDAAw4MADDgwGMMHAc4w4Bx7fAAH//AAH/8AAAAAAAAAAAAAAAAAHwAA4/gAHnvAA8ccHzhgw/MGDDGw4MMbDgw/MMHB44w4AB7fAAH//AAH/8AAAAAAAAAAAAAAAAB8AAOP4AB47wAHHHAA4YMADBgwAMGDAAwYcADBhwAOGOAAebwAA/+AAD/8AAfb4ABxjgAOGHAAwYMADBgwAMGDAA4YcADhhwAHmOAAP5wAAPmAAAAAAAAAAAAP4AAD/wAAf/wADgHAAcAOABwA4MGAB8wYAH/BgAZ4HADgAeAeAA8DwABwOAACAAAAAAAAAD8AAA/8AAH/4AA5hwAHGDgwcYODxhgYDmGBgAYYGABxg4AHGHgAPY8AAfjgAA+MAAAAAAAAAAAAPwAAD/wAAf/gADmHAAcYOABxg4AGGBgOYYGDxhgYMHGDgAcYeAA9jwAB+OAAD4wAAAAAAAAAAAA/AAAP/AAB/+ACOYcA5xg4HHGDg4YYGDhhgYHGGBgOcYOAZxh4AD2PAAH44AAPjAAAAAAAAAAAAH4AAB/4AAP/wBhzDgHOMHAY4wcADDAwAMMDAAwwMBzjBwHOMPAAex4AA/HAAB8YAAAAAAAAAAOAAAA+f/+AZ//4AH//gAAAAAAAAAAAAAAAAAAAJ//4Hn//g+f/+DAAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAGAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/gAB+/AAHAcAA4A4DDABgNMAGA+wAYDzABgPOAOB+YAwG/4PAA//4AA//AAAAAAAAAAAAAAAAP//AA//8Bx8AAHGAAAY4AABjAAAHMAAAMwAAAzgAAHPAAAYfgAAA//wAA//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAOAcABwA4OHADg+YAGA5gAYAGABgAcAOABwA4ADwPAAH/4AAP/AAAHgAAAAAAAAAAAAPwAAD/wAAf/gADgHAAcAOABwA4BGABgeYAGDxgAYMHADgAcAOAA8DwAB/+AAD/wAAB4AAAAAAAAAAAAD8AAA/8AAH/4AI4BwDnADgccAODhgAYOGABgcYAGA5wA4BnADgAPA8AAf/gAA/8AAAeAAAAAAAAAAAAB+AAAf+AAD/8AccA4BzgBwGOAHAYwAMBzAAwDMADAM4AcBzgBwGHgeAAP/wAAf+AAAPAAAAAAAAAAAAAfgAAH/gAA//AGHAOAc4AcBjgBwAMADAAwAMADAAwHOAHAc4AcAB4HgAD/8AAH/gAADwAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5wAB//AAP/4ABwHgAOA/AA4PcADB4wAMODAAxwMADuBwAPwHAAfB4AB//AAP/4AAY8AAAAAAAAAAAAf8AAB//AAH//AAAA8AAAA4MAADg+AAGA4AAYAAABgAAAOAAABwAH/+AAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAAPAAAAOAAAA4BgABg+AAGDwAAYIAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AIADwDgADgcAAODgAAYOAABgcAAGA4AA4BgAHAAf/4AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AYAB4BwABwGAAHAAAAMAAAAwGAADAcAAcBwADgAP/8AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAAfgAAAfwAAAP4cIAH/zgAH++AB/DAA/gAAfwAAP8AAB+AAAHAAAAAAAAAAAAAAAAA/////////wPA8AAwAwAHADgAYAGABgAYAGABgAcAOABwA4ADwPAAH/4AAP/AAAHgAAAAAABAAAAHAAAAfgAAwfgADgfwA+AP4fAAH/8AAH+AAB/A4A/gDgfwAMP8AAB+AAAHAAAAAAAA=='), 32, - atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), + atob("BgkLGhAZEgYMDAwQBwwHCxELEA8REBEOEBEICREVEQ8ZEhEUExAOFBMHDREOGBMUERQSEREUERoREBELCwsTEg4QEQ8REAoREQcHDgcYEREREQoPCxEOFQ8PDwwHDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCQ8QEhAHDw4WCQ8RABEODRELCw4REgYLCQoPGxobDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGg8QEBAQBwcHBxAREREREREPEREREREPEQ8="), 28+(scale<<8)+(1<<16) ); - return this; }; function imgLock(){ @@ -146,7 +145,7 @@ function imgWatch() { /* * INFO ENTRIES - * List of [Data, Icon, left/right, HomeAssistant Trigger] + * List of [Data, Icon, left/right, Function to execute] */ var infoArray = [ function(){ return [ null, null, "left", null ] }, @@ -165,7 +164,11 @@ try{ var triggers = require("ha.lib.js").getTriggers(); triggers.forEach(trigger => { infoArray.push(function(){ - return [trigger.display, trigger.getIcon(), "left", trigger.trigger] + return [trigger.display, trigger.getIcon(), "left", function(){ + var ha = require("ha.lib.js"); + ha.sendTrigger("TRIGGER_BW"); + ha.sendTrigger(trigger.trigger); + }] }); }) } catch(ex){ @@ -463,9 +466,9 @@ Bangle.on('charging',function(charging) { }); Bangle.on('touch', function(btn, e){ - var left = parseInt(g.getWidth() * 0.2); + var left = parseInt(g.getWidth() * 0.3); var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.3); var lower = g.getHeight() - upper; var is_left = e.x < left; @@ -501,20 +504,19 @@ Bangle.on('touch', function(btn, e){ if(is_center){ var infoEntry = getInfoEntry(); - var trigger = infoEntry[3]; - if(trigger != null){ - try{ - require("ha.lib.js").sendTrigger("TRIGGER_BW"); - Bangle.buzz(80, 0.6).then(()=>{ - require("ha.lib.js").sendTrigger(trigger); + var fun = infoEntry[3]; + if(fun != null){ + Bangle.buzz(80, 0.6).then(()=>{ + try{ + fun(); setTimeout(()=>{ Bangle.buzz(80, 0.6); }, 250); - }); - }catch(ex){ - print(ex); - // Without ha -> nop. + } catch(ex){ + // In case it fails, we simply ignore it. + } } + ); } } }); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 95fb7e608..834712743 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.10", + "version": "0.11", "description": "BW Clock.", "readme": "README.md", "icon": "app.png", From 72870d6d6c7494f14876403b360e966151574c08 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Jun 2022 10:10:46 +0200 Subject: [PATCH 33/34] Minor design changes --- apps/bwclk/app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 804c79e4a..4c4359a4f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -63,11 +63,12 @@ Graphics.prototype.setMediumFont = function(scale) { Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom( - atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+MB//5wH//DAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAACDAAAYMAABgwAAGDPAAYP8ABv/AAH/gAH/sAB/gwAHmDBAAYN8ABh/wAH/4AB/8AB/8wAH+DAAcYMAABgwAAGDAAAYAAABgAAAAAAAAAAAAAAAAACAMAB/A8AP8B4A44DgHBgHAcHAcPgMA++AwD74DgPBwOBwHAYHAPBw4AeD/gA4H8AAgPAAAAAAAAAAAfgAAD/AHAcOA8Bg4HgGBg8AYGHgBw48ADnHgAP48AAPHgAAA8AAAHjAAA8/AAHn+AA84cAHjAwA4MDAHAwMA4DhwHAH+AIAPwAAAeAAAAAAAAAAAAA8AAcP8AH9/4A//DgHD4HAcHgcBgPAwGAcDAYA4MBwBxwHADnAOAH4AYD/gAAP8AAA/4AAABwAAACAAAAAB8AAAHwAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAH//wD+AP4fAAH3wAAHcAAAEgAAAAAAAAAAAAAgAAAHAAABfAAAcfAAHwfwH8Af//AAP/gAAAAAAAAAAAAAAAAAAAAAAAAcAAAAzAAADeAAAPwAAH8AAAf4AAAPwAAAzAAAHAAAAIAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAH/8AAf/wAADAAAAMAAAAwAAADAAAAMAAAAwAAAAAAAAAAAAAAHIAAAdgAAB+AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAPAAAP8AAP/AAP/AAP/AAB/AAAHgAAAAAAAAAAAAAAAAAAAAAAP/+AB//8APAB4A4ADgHAAHAYAAMBgAAwGAADAcAAcBwABwDwAeAH//wAP/+AAAAAAAAAAAAAAAAgAAAHAAAA4AAAHAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAACAAwA8AHAHwA8A4AHwHAA7AcAHMBgA8wGAHjAcA8MBwHgwDg8DAP/gMAP8AwAPADAAAAAAAAAAAAAYAYABwBgAHgGBgHAYOAcBh4AwGPgDAZ2AMBuYBwHxwOAeD/4BwH/AGAHwAAAAAAAAAAAABwAAAfAAAH8AAB+wAA/jAAPwMAD8AwAfADABwAMAAAAwAAD/8AAP/wAAAwAAADAAAAAAAAAAAAAAAAAAEAH/w4Af/D4B8cDgGDgHAYMAcBgwAwGDADAYOAcBg4BwGBwOAYH/wBgH+AAAPgAAAAAAAAAAAAAAAB//AAf//ADw8+AOHA4Bw4BwHDAHAYMAMBgwAwHDgHAcOAcA4cDgDg/8AAB/gAAB4AAAAAAAAAABgAAAGAAAAYAAMBgADwGAB/AYAfgBgP4AGH8AAZ/AAB/gAAH4AAAcAAAAAAAAAAAAAAAEAAPD+AD/f8AP/g4Bw8BwHDwHAYGAMBgYAwHBgDAcPAcA5+DgD//+AH5/wAAB8AAAAAAAAAAAAAAAA/gAAH/AwA8eDgDAcHAcBwcBgDAwGAMDAYAwMBwHBwHAYHAODh4Af//AA//4AAf8AAAAAAAAAAAAAAAAAAAAABwcAAHBwAAYDAAAAAAAAAAAAAAAAAAAAAAAAADgByAOAH4AwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB4AAAPwAABzgAAOHAABwOAAOAcAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAIAA4BwABwOAADhwAAHOAAAPwAAAeAAAAwAAAAAAAAAAAAAAAAAAAAAAAAABgAAAeAAAD4AAAcAAABwAAAGAPnAYB+cBgPAAHA4AAePAAA/4AAB/AAAAAAAAAAAAAAAAAAAAAAAH8AAD/8AAfj4ADgBwAcADgDgAHAMD4MBwfw4HDjhgYMGGBgwYYGDBhgYOOGBw/w4DD/jgMAOMA4AYABwBgADwOAAH/wAAH+AAAAAAAAAAAAAAEAAADwAAB/AAA/wAAf4AAP9gAH+GAB/AYAHgBgAfAGAB/gYAA/xgAAf+AAAP8AAAH+AAAD8AAABwAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwHBwHAePgcA//DwB/P+AAgfwAAAYAAAAAAA/+AAH/8AB+D8APAB4A4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAAHAcAAcA4ADgDwAeAHwHwAPAeAAMBgAAAAAAAAAAAAAAAf//8B///wGAADAYAAMBgAAwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAHgDwAP/+AAf/wAAP4AAAAAAAAAAAAAAAB///wH///AYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYAAMBgAAwAAAAAAAAAAAAAAH///Af//8BgGAAGAYAAYBgABgGAAGAYAAYBgABgGAAGAYAAYAAABgAAAAAAAAA/8AAH/8AB+D8APABwA4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAYHAcBgcA4GDgDwYeAHh/wAGH8AAAfAAAAAAAAAAAAAAAAf//8B///wAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAB///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAOAAAAcAAAAwAAADAAAAMAAABwH//+Af//wB//+AAAAAAAAAAAAAAAAAAAAf//8B///wAAwAAAHgAAA/AAAHOAAA4eAAHA8AA4B4AHADwB4AHgHAAPAYAAcBAAAQAAAAAAAAAAAAAAH///Af//8B///wAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAAAAAAAAB///wH///APwAAAPwAAAPwAAAHwAAAH4AAAH4AAAH4AAADwAAA/AAAPwAAD8AAA/AAAPgAAH4AAB+AAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///AfAAAAeAAAA+AAAA+AAAA8AAAB8AAAB4AAAD4AAADwAAAHwAAAHgH///Af//8AAAAAAAAAAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAB///wH///AYAwABgDAAGAMAAYAwABgDAAGAMAAYAwABwHAAHAcAAPHgAAf8AAA/gAAAAAAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwAJwHAB3AOAD4A8AHgB8B+AD//8AD/4wAB8AAAAAAAAAAAH///Af//8BgDAAGAMAAYAwABgDAAGAMAAYAwABgDgAHAfgAcB/gA8efgB/wfAD+AcAAAAQAAAAAAAAAACAMAB+A8AP8D4A44DgHBgHAcHAcBgcAwGAwDAYDgMBwOAwHAYHAOBwcA8HjgB4P8ADgfgAAAYAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAf//8B///wH///AYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAf//AB//+AAAA8AAAA4AAABwAAAHAAAAMAAAAwAAADAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAYAAAB8AAAH+AAAD/AAAB/gAAA/wAAAf4AAAPwAAAPAAAD8AAB/gAA/wAAf4AAP8AAH+AAAfAAABgAAAEAAAAfAAAB/gAAB/4AAAf8AAAH/AAAD/AAAB8AAB/wAB/4AA/4AA/4AAH8AAAfgAAB/4AAAf8AAAH/AAAD/wAAA/AAAH8AAH/gAD/gAD/wAB/wAAHwAAAYAAAAAAAQGAADAcAA8B8AHgB8B8AB4PAAD74AAD+AAAHwAAA/gAAPvgAB4PAAfAfAHwAeAcAA8BgAAwAAABAQAAABwAAAHwAAAHwAAAPwAAAPgAAAPgAAAP/wAB//AAfAAAH4AAA+AAAPgAAB4AAAGAAAAQAAAAAAAAGAABAYAAcBgADwGAA/AYAPsBgB8wGAfDAYHwMBg+AwGPgDAb4AMB+AAwHwADAcAAMBAAAwAAAAAAAAAAAAAAAAAAAAAAAD/////////wAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAB4AAAH+AAAH/gAAB/4AAAf+AAAH8AAADwAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAA//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAA4AAABwAAADgAAAHAAAAOAAAAQAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAee8ADxxwAOGDAAwYMADDgwAMODAAwwcADjDgAHt8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wAHgeAAYAYADgBwAMADAAwAMADAAwAOAHAA4AcAB4HgAD/8AAH/gAADwAAAAAAAAAAAAH8AAB/4AAP/4ABwDgAOAHAA4AcADAAwAMADAAwAMADgBwAPAPAAeB4AA4HAABAAAAAAAAAP8AAB/4AAf/4ABwDgAOAHAA4AMADAAwAMADAAwAMADgBwAHAOAf//4B///wH///AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAcw4ADjBwAOMHAAwwMADDAwAMMDAA4wcADjDwAHseAAPxwAAfGAAAAAAAAAAADAAAAMAAAH//8A///wH///AYwAABjAAAGMAAAYwAAAAAAAAB/gAAP/AwD//HgOAcOBwA4cHABhwYAGDBgAYMGABhwcAOHA4Bw8D///gf//8B///AAAAAAAAAAAAAAAAAAAH///Af//8AB8AAAGAAAA4AAADAAAAMAAAAwAAADgAAAPAAAAfgAAA//wAA//AAAAAAAAAAAAAAAAAAABz//wHP//AY//8AAAAAAAAAAAAAAMAAAAwAAAP5////n///gAAAAAAAAAAAAAAAAAAf//8B///wAAGAAAA8AAAH4AAB5wAAPDgAB4HAAPAOAA4AcACAAwAAABAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAA//8AD//wAHgAAA4AAADAAAAMAAAAwAAADgAAAPAAAAf/8AA//wAHAAAA4AAADAAAAMAAAAwAAADgAAAPAAAAf/8AA//wAAAAAAAAAAAAAAAAAAAA//8AD//wAHwAAAYAAADgAAAMAAAAwAAADAAAAOAAAA8AAAB+AAAD//AAD/8AAAAAAAAAAAAAAAAH4AAB/4AAP/wABwDgAOAHAA4AcADAAwAMADAAwAMADgBwAOAHAAeB4AA//AAB/4AAA8AAAAAAAAAAAAAAAAH///wf///A8DwADADAAcAOABgAYAGABgAYAGABwA4AHADgAPA8AAf/gAA/8AAAeAAAAAAAAAAAAB/gAAP/AAD//AAOAcABwA4AHABgAYAGABgAYAGABgAcAOAA4BwAD///wf///B///8AAAAAAAAAAAAAAAAAAAP//AA//8AB8AAAOAAAA4AAADAAAAMAAAAwAAAAAAAABgYAAPh4AB/HgAOcHAAwwcADDgwAMGDAAwYMADhwwAOHHAAeP4AA4fgABA4AAAAAADAAAAMAAAAwAAA//+AD//+AP//8ADABwAMADAAwAMADAAwAAAAAAAAAAD/gAAP/4AA//4AAAHgAAAHAAAAcAAAAwAAADAAAAMAAABwAAAOAA//wAD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAD+AAAB/AAAA/gAAAfAAAB8AAA/wAAf4AAP8AAD+AAAPAAAAgAAACAAAAPAAAA/wAAA/4AAAP8AAAH8AAAHwAAH+AAD/AAD/AAAPgAAA/gAAA/wAAAf4AAAH8AAAHwAAH/AAD/gAD/gAAPwAAAwAAAAAAQAMADAA4AcAB4HgADw8AAHvgAAH4AAAPAAAD+AAAeeAADw8AA8A8ADgBwAMADAAAAAAEAAAAcAAAB+AAAB+AAAB/ADAA/h8AAf/wAAf4AAH8AAD+AAB/AAA/wAAH4AAAcAAAAAAAAAAAQAMADAAwA8ADAHwAMA/AAwPMADB4wAMODAAzwMADeAwAPgDAA8AMADgAwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAP///9//////8P/wAAADAAAAMAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAwAAADAAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAB4AAAPgAAA4AAABwAAAHAAAAcAAAA4AAADgAAAOAAAB4AAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH//gOf/+Ax//wAAAAAAAAAAAAAAAAAAAD+AAA/+AAH/8AA8A4ADgBwAMAHAHwAPgfAA+AcADAAwAcADgDgAHgeAAOBwAAQAAAAAAAAAwDAADAMAAMBwA///AH//8A///wHAwDAcDAMBgMAwGAwDAcDAMA4AAwB4ADADAAMAAAAAAAAAADDhgAe/vAA//4AB4PAAGAMAA4A4ADABgAMAGAAwAYADABgAOAOAAcBwAB4PAAP/+AB7+8ADBBgAAAAAEAAAAcAAAB8BmAB8GYAD8ZgAD9mAAD+YAAD/8AAf/wAH+YAA+ZgAPhmAD4GYAeAAABgAAAEAAAAAAAAAAAAAH/x/8f/H/x/8f/AAAAAAAAAAAAAAAAHAAB9+HAP/8eBz5w8GHDBwYcODBhwYMGDBgwcOHHA848cDx//gDH98AAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAP/4AB8HwAPAHgB4AOAHH8cA4/44DnBzgM4DuAzAGYDMAZgMwBmA7gM4DnBzgGMGcAcABwA4AOAB4DwAD/+AAH/wAAD4AAAAAAAE4AAA/wAADbAAANsAAA2wAAD/AAAH8AAAAAAAAAAAAAAAAAAIAAADwAAAfgAADjgAA8HAADGMAAA8AAAH8AAB44AAOBwAAwDAAAAAAAAAAAAAAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAfgAAB+AAAAAAAAAAAAAAAAAAAAA/AAAP/AABwOAAGAYAAz8wADPzAAMkMAAyYwADP7AAOYcAAcDgAA88AAB/gAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAP8AABw4AAGBgAAYGAABgYAAHDgAAOcAAA/wAAA8AAAAAAAAAAAAAAAAAADBgAAMGAAAwYAADBgAAMGAAAwYAA/5gAD/mAAP+YAADBgAAMGAAAwYAADBgAAMGAAAAAAAAAAAAAAAAwMAAHBwAA4HAADA8AAMGwAAw7AADnMAAH4wAAPDAAAAAAAAAAAAgEAADAYAAMwwAA3DAADcMAAPwwAA5/AADD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///8H///wAB8AAAA4AAADgAAAGAAAAYAAABgAAAOAAABwAAAeAAf/+AB//4AAAAAAAAAAAAAAAAAAAA/gAAH/AAA/+AAH/8AAf/wAB//AAH/8AAf///x////H///8AAAAB////H///8f///wAAAAAAAAAAAAAAACAAAAcAAABwAAAGAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMwAAB7AAAH8AAADgAAAAAAAAAAAAAAAAAACAAAAYAAADAAAAP/wAA//AAAAAAAAAAAAAAAAAAAAAAPAAAD+AAAMMAAAwwAADDAAAOcAAAfgAAA8AAAAAAAAAAAAAAAAADAMAAOBwAAeOAAAfwAAA8AAAxjAADwcAADngAAH4AAAPAAAAIAAAAAAAAAAAAAAAAQAAADAAAAYAAAB//AgH/8PAAAB4AAAOAAADwAAAeAAADgAAA8AAAHgAAA4AAAPAAABwBwAeAfADwPsAcD4wBgeDAABgMAAAP8AAA/wAAAMAAAAAAAAAAAAAAAAAAAAQAAADAAAAcAAAB//AgH/8PAAAB4AAAOAAADwAAAeAAADgAAA8AAAHgAAA4AAAPAAABwAAAeGAwDw4HAcHA8BgYHwABgbAAGDMAAcYwAA/DAAB4MAAAAAAAAAAIBgABgHAAGMMAAZwYABvBgAH8ODAefwcBw+HgAAA8AAAHAAAB4AAAPAAADwAAAeAAADgAAA8AAAHgHAA4D8APA+wB4PjACB4MAAGAwAAA/wAAB/AAAAwAAAAAAAAAAAAAPAAAD+AAAf8AADg4AAcDgOPgGA58AYDngBgAAAOAAAB4AAAfAAAB4AAAAAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAHwBgAf4GAAP8YAAH/gAAD/AAAB/gAAA/AAAAcAAAAAAAAAAAAAAcAAAPwAAH+AAD/AAB/sHw/wwfP4DDG8AMMb4AwfP8DA4H+MAAD/wAAB/gAAA/wAAAfAAAAMAAAAAAABAAAA8AAAfwAAP8AAH+AAD/YAB/hgAfwGAB4AYAGABgAYAGAB///wH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAf/AAD/+AA/B+AHgA8AcABwDgADgOAAOAwAAYPAAB88AAH7wAAZ/gADjOAAOAcABwB4APAD4D4AHgPAAGAwAAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAAAAAf//8B///wGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAADAYAAMAAAAAAAAAAAAAAB///wH///AYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYAAMBgAAwAAAAAAAAAAAAAAH///Af//8BgMAwGAwDAYDAMBgMAwGAwDAYDAMBgMAwGAwDAYDAMBgAAwGAADAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAYAAABgAB///wH///AYBgMBgGAwGAYDAYBgMBgGAwGAADAYAAMBwABwHAAHAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAAAAAAH///Af//8B8AAAB4AAAD4AAAD4AAADwAAAHwAAAHgAAAPgAAAPAAAAfAAAAeAf//8B///wAAAAAAAAAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwABwHAAHAOAA4A8AHgB8B8AD//gAD/4AAB8AAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAA/+AAH/8AB+D8APAB4A4ADgHAAHAcAAcBgAAwGAADAYAAMBgAAwHAAHAcAAcA4ADgDwAeAHwHwAP/+AAP/gAAHwAAAAAAAP/gAB//AAfg/ADwAeAOAA4BwABwHAAHAYAAMBgAAwGAADAYAAMBwABwHAAHAOAA4A8AHgB8B8AD//gAD/4AAB8AAAAAAAD/4AAf/wAH4PwA8AHgDgAOAcAAcBwABwGAADAYAAMBgAAwGAADAcAAcBwABwDgAOAPAB4AfAfAA//4AA/+AAAfAAAAAAAAAAAADgYAAHHgAAO8AAAfgAAA8AAAHwAAA/gAAHHAAA4OAABAQAAAAAAAAAAAAAAAAP/jAB//8Afg/gDwA+AOAH4BwA9wHAHnAYA8MBgHAwGA4DAYHAMBw4BwHPAHAP4A4A/AHgB8B8AP//gBz/4ACB8AAAAAAAAAAAH//wAf//gAAAPAAAAOAAAAcAAABwAAADAAAAMAAAAwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4AAADwAAADgAAAHAAAAcAAAAwAAADAAAAMAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AAAA8AAAA4AAABwAAAHAAAAMAAAAwAAADAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gAAAPAAAAOAAAAcAAABwAAADAAAAMAAAAwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAEAAAAcAAAB8AAAB8AAAD8AAAD4AAAD4AAAD/8AAf/wAHwAAB+AAAPgAAD4AAAeAAABgAAAEAAAAAAAAAAAAAH///Af//8AGAMAAYAwABgDAAGAMAAYAwABgDAAGAMAAcBwAA4OAAD/4AAH/AAAHwAAAAAAAAAAAAAAAAf//wD///APAAABwAAAGAAHAYDAMBgcAwHBwDAePgcA/+BwB/ceAAg/4AAB+AAAAAAAAAAAAAAAAAA+AAHH8AA894AHjjggcMGDhgwYPmHBgGYcGABhg4AHGHAAPb4AA//4AA//gAAAAAAAAAAAAAAAAD4AAcfwADz3gAeOOABwwYAGDBgGYcGD5hwYOGGDggcYcAA9vgAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPPeAZ444DnDBgcYMGDhhwYOGHBgcYYOA5xhwBj2+AAP/+AAP/4AAAAAAAAAAAAAAAAB8AAOP4AB57wHPHHAY4YMBjBgwGMODAcw4MAzDBwDOMOAce3wBB//wAB//AAAAAAAAAAAAAAAAAHwAA4/gAHnvAY8ccBzhgwGMGDAAw4MADDgwGMMHAc4w4Bx7fAAH//AAH/8AAAAAAAAAAAAAAAAAHwAA4/gAHnvAA8ccHzhgw/MGDDGw4MMbDgw/MMHB44w4AB7fAAH//AAH/8AAAAAAAAAAAAAAAAB8AAOP4AB47wAHHHAA4YMADBgwAMGDAAwYcADBhwAOGOAAebwAA/+AAD/8AAfb4ABxjgAOGHAAwYMADBgwAMGDAA4YcADhhwAHmOAAP5wAAPmAAAAAAAAAAAAP4AAD/wAAf/wADgHAAcAOABwA4MGAB8wYAH/BgAZ4HADgAeAeAA8DwABwOAACAAAAAAAAAD8AAA/8AAH/4AA5hwAHGDgwcYODxhgYDmGBgAYYGABxg4AHGHgAPY8AAfjgAA+MAAAAAAAAAAAAPwAAD/wAAf/gADmHAAcYOABxg4AGGBgOYYGDxhgYMHGDgAcYeAA9jwAB+OAAD4wAAAAAAAAAAAA/AAAP/AAB/+ACOYcA5xg4HHGDg4YYGDhhgYHGGBgOcYOAZxh4AD2PAAH44AAPjAAAAAAAAAAAAH4AAB/4AAP/wBhzDgHOMHAY4wcADDAwAMMDAAwwMBzjBwHOMPAAex4AA/HAAB8YAAAAAAAAAAOAAAA+f/+AZ//4AH//gAAAAAAAAAAAAAAAAAAAJ//4Hn//g+f/+DAAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAGAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/gAB+/AAHAcAA4A4DDABgNMAGA+wAYDzABgPOAOB+YAwG/4PAA//4AA//AAAAAAAAAAAAAAAAP//AA//8Bx8AAHGAAAY4AABjAAAHMAAAMwAAAzgAAHPAAAYfgAAA//wAA//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAOAcABwA4OHADg+YAGA5gAYAGABgAcAOABwA4ADwPAAH/4AAP/AAAHgAAAAAAAAAAAAPwAAD/wAAf/gADgHAAcAOABwA4BGABgeYAGDxgAYMHADgAcAOAA8DwAB/+AAD/wAAB4AAAAAAAAAAAAD8AAA/8AAH/4AI4BwDnADgccAODhgAYOGABgcYAGA5wA4BnADgAPA8AAf/gAA/8AAAeAAAAAAAAAAAAB+AAAf+AAD/8AccA4BzgBwGOAHAYwAMBzAAwDMADAM4AcBzgBwGHgeAAP/wAAf+AAAPAAAAAAAAAAAAAfgAAH/gAA//AGHAOAc4AcBjgBwAMADAAwAMADAAwHOAHAc4AcAB4HgAD/8AAH/gAADwAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5wAB//AAP/4ABwHgAOA/AA4PcADB4wAMODAAxwMADuBwAPwHAAfB4AB//AAP/4AAY8AAAAAAAAAAAAf8AAB//AAH//AAAA8AAAA4MAADg+AAGA4AAYAAABgAAAOAAABwAH/+AAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAAPAAAAOAAAA4BgABg+AAGDwAAYIAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AIADwDgADgcAAODgAAYOAABgcAAGA4AA4BgAHAAf/4AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AYAB4BwABwGAAHAAAAMAAAAwGAADAcAAcBwADgAP/8AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAAfgAAAfwAAAP4cIAH/zgAH++AB/DAA/gAAfwAAP8AAB+AAAHAAAAAAAAAAAAAAAAA/////////wPA8AAwAwAHADgAYAGABgAYAGABgAcAOABwA4ADwPAAH/4AAP/AAAHgAAAAAABAAAAHAAAAfgAAwfgADgfwA+AP4fAAH/8AAH+AAB/A4A/gDgfwAMP8AAB+AAAHAAAAAAAA=='), + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+cB//5wH//nAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAQcAADhwAAOHBAA4c8ADh/wAP/+AB/+AA//wAH+HAAe4cMBDh/wAOP/AA//wAP/wAH/3AAf4cABzhwAAOHAAA4cAADgAAAOAAAAAAAAAAAAAAAAAAAAwAH8HwA/4PgD/geAePA8BwcBw/BwH78DgfvwOB+HA4HAeBwcA8HDgB4f+ADg/wAGB+AAAAAAAAAAAAAAAH4AAA/wBwHngPAcOB4Bw4PAHDh4AcOPAA/x4AD/PAADx4AAAPAAAB5wAAPPwAB5/gAPOPAB4wcAPDBwB4MHAPA4cA4B/gBAH8AAAHAAAAAAAAAAAAAPAAHD/AB/f+AP/x4B4+DwHB4HAcDwcBwHhwHAPHAcAccB4A5wDgB+AGA/4AAH/AAAf+AAAA8AAABgAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAHAAAAcwAAA/gAAb8AAB/gAAH+AAAD+AAAOwAABxAAADAAAAAAAAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAB//AAH/8AAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAABwAAAHIAAAfgAAB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA/wAA//AA//AA//AAH/AAAfAAABAAAAAAAAAAAAAAAAAAAf/wAH//wA///gDgAOAcAAcBwABwHAAHAcAAcBwABwHgAPAPAB4Af//AA//4AA/+AAAAAAAAAAAAAAAAMAAABwAAAOAAAB4AAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAAwAcAPADwB8AfAPAB8B4APwHAB/AcAPcBwB5wHAPHAcB4cA8PBwD/4HAH/AcAHwBwAAAAAAAAAAAAGAHAAcAcAB4BwYDwHDwHAceAcBz4BwHfgHAf3AcB+eDwHw/+AeB/wBwD+AAAAAAAAAAAAAAAAABwAAAfAAAP8AAD/wAA/nAAP4cAD+BwAfgHAB4AcAEA//AAD/8AAP/wAABwAAAHAAAAMAAAAAAAAAAAAAEAH/w4Af/D4B/8HgHDgPAcOAcBw4BwHDgHAcOAcBw8DwHB4eAcH/wBgP+AAAPwAAAAAAAAAAAAAAAB//AAf//AD//+AOHB4Bw4BwHDgHAcOAcBw4BwHDgHAcPA8A4eHgDh/8AEB/gAAD4AAAAAAAAAABwAAAHAAAAcAAMBwADwHAB/AcA/4BwP8AHH/AAd/gAB/wAAH8AAAeAAAAAAAAAAAAAAAEAAPD+AB/f8AP//4B4+DwHDwHAcHAcBwcBwHBwHAcPAcB/+DgD//+AH5/wACB8AAAAAAAAAAAAAAAAEAAAD+AAAf+DAD74OAODw8BwHBwHAOHAcA4cBwDBwHAcHAeBw8A+ePgB//8AD//gAB/wAAAAAAAAAAAAAAAAAAAAAHBwAAcHAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AcgDgB+AOAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAeAAAD8AAAf4AADzwAAeHgADwPAAGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAOAcAA8DgAB4cAABzgAAD8AAAHgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAHgAAA+AAAHgAAAcAAABwD5wHAfnAcD8cBweAAHzwAAP+AAAfwAAAcAAAAAAAAAAAAAAAAAAB/AAA//AAH/+AA8A8AHAA4A4ABwDg+HAcH8OBw444GDBhgYMGGBgwYYHDjjgcP8OBw/44DgDhAOAGAAeAYAA+HgAB/8AAB/gAAAAAAAAAAAAABAAAA8AAAfwAAP/AAH/gAD/4AB/zgAf4OAB8A4AHwDgAf4OAA/84AAP/gAAH/AAAD/gAAB/AAAA8AAAAQAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBweBwHj4HAP/58Afz/gAcH8AAAPAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB8B8ADwHgADAYAAAAAAAAAAAAAAAH///Af//8B///wHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAeAA8A8AHgB8B+AD//gAH/8AAD/AAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOAAHA4AAcDgABwOAAHA4AAcDgABwOAAHAAAAcAAAAAAAAAP/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwGBwHgYPAOBg4A+GPgB4f8ADh/gAAH4AAAAAAAAAAAAAAAH///Af//8B///wAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAeAAAA8AAABwAAAHAAAAcAAABwH///Af//4B///AAAAAAAAAAAAAAAAAAAAf//8B///wH///AAHgAAA/AAAH+AAA88AAHh8AA8D4AHgDwA8AHgHgAPAYAAcBAAAwAAABAAAAAAAAAAH///Af//8B///wAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAAAAAAAAAAAAH///Af//8B///wB/AAAB/AAAA/AAAA/gAAA/gAAA/gAAA/AAAD8AAA/AAAfwAAH8AAB/AAAfgAAP4AAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wD8AAAD4AAAH4AAAHwAAAPwAAAPgAAAPgAAAfAAAAfAAAA/Af//8B///wH///AAAAAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAH///Af//8B///wHAOAAcA4ABwDgAHAOAAcA4ABwDgAHAeAAeBwAA+fAAD/4AAD/AAADgAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAnAcAHcA4AfgDwA+AH4P4AP//wAf/3AAP4AAAAAAAAAAAf//8B///wH///AcA4ABwDgAHAOAAcA4ABwDgAHAOAAcB+AB4H+AD59/AP/h8AP8BwAOABAAAAAAAAAAAAAwAD4HwA/4fAD/geAePA8BwcBwHBwHAcDgcBwOBwHA4HAcDgcA4HDwD4eeAHw/4AOD/AAIDwAAAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAH///Af//8B///wHAAAAcAAABwAAAHAAAAcAAABwAAAGAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAGAAAAfAAAB/gAAB/wAAA/4AAAf8AAAP/AAAH8AAADwAAA/AAAf8AAP+AAP/AAH/gAB/wAAH4AAAcAAABAAAAHwAAAf4AAA/+AAAP/gAAH/wAAB/wAAA/AAAf8AAf/AAP/gAP/gAB/gAAH4AAAf+AAAf/AAAH/wAAB/8AAAfwAAB/AAB/8AA/+AA/+AAf+AAB/AAAHAAAAAAAAAAAAQGAADAeAA8B8AHwD8B+AD4PgAH74AAH/AAAPwAAA/gAAP/gAD8fAAfA/AH4A+AeAA8BwABwEAABAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAABAcAAcBwADwHAA/AcAP8BwD/wHAfnAcH4cBx+BwHPwHAf8AcB/ABwH4AHAeAAcBgABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAAeAAAB/gAAH/4AAB/+AAAf/gAAH/AAAB8AAAAQAAAAAAAAAAAAAAOAAAA4AAADgAAAP/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xwAOGHAA44MADjgwAOOHAA44YADjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wH//+AAcA4ADgBwAOAHAA4AcADgBwAOAHAA8A8AB8PgAD/8AAH/gAAH4AAAAAAAAAAAAH4AAB/4AAP/wAB4HgAPAPAA4AcADgBwAOAHAA4AcADgBwAPAPAAeB4AA4HAABgYAAAAAAAAAAAAfgAAH/gAB//gAHgeAA8A8ADgBwAOAHAA4AcADgBwAOAHAAcA4B///wH///Af//8AAAAAAAAAAAAAAAAH4AAB/4AAP/wAB7HgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAwAAAAAAAAAAAAwAAADAAAB///AP//8B///wHMAAAYwAABjAAAGMAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAB///wH///AAf/8ABwAAAOAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAAAAAc//8Bz//wHP//AAAAAAAAAAAAAAHAAAAcAAAH+f///5///7H//8AAAAAAAAAAAAAAH///Af//8B///wAAPAAAB+AAAP8AAB54AAfDwAD4HgAOAPAAwAcACAAwAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAAD4AAAH//AAP/8AB//wAHAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAADgAAAPAAAAf/8AA//wAB//AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAeB4ADwDwAOAHAA4AcADgBwAOAHAA4AcADwDwAHw+AAP/wAAf+AAAfgAAAAAAAAAAAAAAAB///8H///wP///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAD//wAP//AAf/8ABwAAAOAAAA4AAADgAAAOAAAAAAAAAYGAAD4cAAfx4AD3DwAOOHAA44cADjhwAOGHAA4ccADxzwAHj+AAOP4AAYOAAAAAAAwAAADAAAAMAAAP//wA///gD///AAwAcADABwAMAHAAwAcADAAwAAAAAAAAAAD/gAAP/4AA//4AAA/gAAAPAAAAcAAABwAAAHAAAAcAAABwAAAOAA//8AD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/AAAB8AAA/wAAf8AAP+AAD/AAAPgAAAwAAAAAAAAIAAAA8AAAD/AAAH/gAAD/wAAA/wAAA/AAAf8AAP+AAP+AAA/AAAD+AAAH/AAAD/gAAA/wAAA/AAAf8AAP/AAP/AAA/gAADgAAAAAAAAAAEADAAwAOAHAA+B8AB8PgAB74AAD/AAAH4AAA/wAAHvgAB8PgAPgfAA4AcADAAwAAABABAAAAHAAAAfgAAA/wAAA/wAwAf4fAAP/8AAP/AAB/gAA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAEADAAwAOAPAA4B8ADgPwAOD/AA4ecADnxwAO8HAA/gcAD8BwAPAHAA4AcACAAwAAAAAAAAAAAAAAAAAAAAAAAAAA8AB////f//////n/+AAAA4AAADgAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////z////AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHwAAAcAAABwAAAHgAAAOAAAA8AAABwAAAHAAAB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn//gOf/+A5//4AAAAAAAAAAAAAAAAAAAD/AAA//AAH/+AA+B8ADgBwAOAHAHwAPgfAA+B8AD4A4AcADwDwAHgeAAOBwAAQCAAAAAAAAAAAADgcAAOBwAA4HAD//8A///wD///AeDgcBwOBwHA4HAcDgcB4GBwD4AHAHgAcAOAAAAAAAAAAAAAMAGAB7+8AD//gAHx8AAcBwADgDgAOAOAA4A4ADgDgAOAOAA4A4ABwHAAHg8AA//4AH//wAMOGAAAAAAQAAABwAAAHwMYAPwxgAfjGAAfsYAAf7gAAf/wAB//AAf/8AH7GAA/MYAPwxgB8DGAHAAAAQAAAAAAAAAAAAAf/D/5/8P/n/w/+AAAAAAAAAAAAAAAAAAAABwAAffhwD//Hgf+cfBzwwcGHDhwYcOHBxw4cHDhxwfOPvA8//4Bx//AADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAP/wAB//gAPAPAB4AOAPDw8A4/xwHH/jgc4HOBzgc4HMAzgcwDOBzgc4HPDjgOcOeA4whwBwAOAHwD4APw/AAf/4AAf+AAAPAAAAAAAATgAAD/AAANsAAA2wAADTAAAP8AAAfwAAAAAAAAAAAAAAAAAAgAAAPAAAB+AAAOeAADw8AAOIwAADxAAAfgAADngAA8PAADgMAAEAQAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAB+AAAH4AAAAAAAAAAAAAAAAAAAAD8AAA/8AAHh4AAYDgAD/3AAN/MAA0QwADRjAAN/MAA7hwABwOAADhwAAH+AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAD/AAAeeAABw4AAGDgAAYOAABw4AAH/AAAP8AAAfAAAAAAAAAAAAAAAAAAAwYAADBgAAMGAAAwYAADBgAAMGAAP+YAA/5gAD/mAAAwYAADBgAAMGAAAwYAADBgAAAAAAAAAAAAAAAMDAABwcAAPDwAAwPAADB8AAMOwAA5zAAB+MAADwwAAAAAAAAAAAIBAAAwGAADMcAANwwAA/DAAD8MAAO/wAAx+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///B///8H//AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAAAAAAP4AAB/4AAP/gAB//AAH/8AAf/wAB//AAH///8f///x////AAAAAAAAAB////H///8f///wAAAAAAAAAAAAAAABAAAAOAAAB4AAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzAAAPMAAA/wAAAeAAAAAAAAAAAAAAAAAAAIAAABgAAAMAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAA8AAAP4AAAwwAADDAAAMMAAA5wAAB+AAADwAAAAAAAAAAAAAAAAAMAwAA8HAAB44AAD/AAAD4AADGMAAOBwAAeOAAA/wAAA+AAABgAAAAAAAAAAAAAAABAAAAMAAABwAAAH/8CAf/wcAAAHgAAA8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgCAA8A8APAfwB4H7AHB+MAAHAwAAQ/wAAD/AAAAwAAADAAAAAAAAAAAAAAAAAAAAEAAAAwAAAHAAAAf/wIB//BwAAAeAAADwAAAeAAAHgAAA8AAAHgAAB4AAAPAAAD4AAAeAAADwAAA8GAwHg4HAcHA8AAYHwABg7AAGHMAAf4wAA/DAAA4MAAAAAAAAAAYBgABgHAAGMOAAZwYABvBgAH8OCAe/wcBx+HgABg8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgHAA8B8APAfwB4HzADB8MAAHAwAAQ/wAAD/AAAAwAAAAAAAAAAAAAAAAAA4AAAP4AAB/wAAPHgABwOA4/A4Dn4DgOfAOAAAA4AAAHgAAB8AAAHgAAAYAAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAAAAAABwAAA/AAAf8AAP/AAH/wfD/nD+/wcMb4BwxvgHD+/wcHx/5wEAf/AAAP+AAAH/AAAD8AAABwAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAcAOABwA4AHADgAf//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAYAAMAAAAAAAAAAA/4AAP/4AD//4APAHgB4APAPAAeA4AA4DgADg+AAPz4AA//gAD/+AAOe4AA4BwAHAHgA8APgPgAeA8AAYDAAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcAAcBwABwAAAAAAAAAAAAAAH///Af//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwABwHAAHAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAABgAAAGAAH///Af//8B///wHAYHAcBgcBwGBwHAYHAcBgcBwABwHAAHAeAA8A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAAAAAf//8B///wH///APwAAAPgAAAfgAAAfAAAA/AAAA+AAAA+AAAB8AAAB8AAAD8B///wH///Af//8AAAAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAB/wAAf/wAH//wAeAPADwAeAeAA8BwABwHAAHAcAAcBwABwHAAHAcAAcBwABwDgAOAPAB4Afg/AA//4AB//AAA/gAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAGDgAA8eAAB7wAAD+AAAHwAAAfAAAD+AAAe8AADw4AAGBAAAAAAAAAAAAAAAAAf8MAH//4B///AHgD4A8AfgHgD/AcAecBwDxwHAeHAcDwcBw+BwHHgHAc8AcA/gDgD8AeAH4PwA//+AH//wAMP4AAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4Af//wAAAHgAAAPAAAAcAAABwAAAHAAAAcAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAAAAf//8B///wH///ABwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHg8AAP/gAAf8AAA/gAAAAAAAAAAAAAAAA///AP//8A///wHgAAAcAAcBwABwHBwHAcHAcB4+BwD/4PAH954APn/gAAP8AAAOAAAAAAAAAAAAAD4AAcfwADz/gAfOOCBww4PHHBg+ccGAZxw4AHHDAAcYcAA//gAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPP+AB844AHDDgAccGAZxwYPnHDg8ccMDBxhwAD/+AAP/+AAP/4AAAAAAAAAAAAAAAAA+AAHH8AA8/4BnzjgOcMOBxxwYOHHBg4ccOBxxwwDnGHAGP/4AA//4AA//gAAAAAAAAAAAAAAAAHwAA4/gAHn/A8+ccDzhhwMOODA444MBjjhwHOOGAM4w4Dx//AOH//AAH/8AAAAAAAAAAAAAAAAAfAADj+AAef8Bz5xwHOGHAc44MADjgwAOOHAY44YBzjDgHH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xweOGHD844MMzjgwzOOHD844YHjjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAHwAAx/gAHn/AAc4cADjhwAOMDAA4wcADjBwAOMHAA4w4AB//AAH/4AAP/wAB/fgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAAAAAAAAAA/AAAP/AAB/+AAPA8AB4B4AHADgwcAPzBwA/8HADngcAOMB4B4ADwPAAHA4AAMDAAAAAAAAAAAAA/AAAP/AAB/+AAPY8AB5h4OHGDg+cYOB5xg4AnGDgAcYOAB5h4AD+PAAH44AAPjAAAGAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgOcYOD5xg4OHGDggeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAAAD8AAA/8AAH/4AY9jwDnmHgecYODhxg4OHGDg8cYOB5xg4BnmHgCP48AAfjgAA+MAAAYAAAAAAAAAAAAB+AAAf+AAD/8Acex4BzzDwHOMHAA4wcADjBwAOMHAc4wcBzzDwGH8eAAPxwAAfGAAAMAAAAAAAAAAAOAAAA+f/+A5//4An//gAAAAAAAAAAAAAAAAAAAJ//4Dn//g+f/+DgAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAHAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/AAB//AAPA8AA4A4DDgDgPMAOA/wA4D7ADgPOAOB+8B4C/+/AA//4AB//AAAHAAAAAAAAAAAAP//AA//8Bx//wPHAAAw4AADjgAAGOAAAc4AAAzgAAPPAAA4f/8AA//wAB//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAPA8CB4B4OHADg+cAOA5wA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AnADgecAOD5wA4OHADgAeAeAA+HwAB/+AAD/wAAD8AAAAAAAAAAAAD8AAA/8AAH/4AY8DwDngHgecAODhwA4OHADg8cAOB5wA4BngHgCPh8AAf/gAA/8AAA/AAAAAAAAAAAAB+AAAf+AAD/8AceB4DzwDwMOAHA44AcBjgBwHOAHAM4AcDzwDwOHw+AAP/wAAf+AAAfgAAAAAAAAAAAAfgAAH/gAA//AHHgeAc8A8BzgBwAOAHAA4AcADgBwHOAHAc8A8Bh8PgAD/8AAH/gAAH4AAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAA7cAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5gAB//AAP/4AB4PgAPB/AA4PcADh5wAOPHAA54cADvBwAP4PAAfD4AB//AAP/4AAZ+AAAAAAAAAAAAf8AAB//AAH//AAAH8AAAB4OAADg+AAOB4AA4AgADgAAAOAAABwAH//gAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4BgADgeAAOD4AA4MAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AYAfwDgAHgcAAODgAA4OAADg8AAOB4AA4BgAHACf/+AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AcAP4BwADwHAAHAAAAcAAABwAAAHAcAAcBwADgGP//AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAA/wAAA/wAAAf4cAAP/zgAP/+AB/jgA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAAAAAAA//////////////A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAABAAAAHAAAAfgAAw/wADg/wA+Af4fAAP/8AAP/AAB/g4A/wDgf4AOP+AAB/AAAHgAAAQAAA=='), 32, - atob("BgkLGhAZEgYMDAwQBwwHCxELEA8REBEOEBEICREVEQ8ZEhEUExAOFBMHDREOGBMUERQSEREUERoREBELCwsTEg4QEQ8REAoREQcHDgcYEREREQoPCxEOFQ8PDwwHDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCQ8QEhAHDw4WCQ8RABEODRELCw4REgYLCQoPGxobDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGg8QEBAQBwcHBxAREREREREPEREREREPEQ8="), + atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), 28+(scale<<8)+(1<<16) ); + return this; }; function imgLock(){ From 596a8183c0f6643d96778eb2f4719262d639b725 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 28 Jun 2022 10:19:29 +0100 Subject: [PATCH 34/34] fixing versions/etc o remove lint warnings --- apps/agenda/ChangeLog | 1 + apps/android/ChangeLog | 2 +- apps/circlesclock/app.js | 6 ++---- apps/football/metadata.json | 2 +- apps/invader/ChangeLog | 1 + 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/agenda/ChangeLog b/apps/agenda/ChangeLog index 56dfffa0d..ae650deeb 100644 --- a/apps/agenda/ChangeLog +++ b/apps/agenda/ChangeLog @@ -1 +1,2 @@ 0.01: Basic agenda with events from GB +0.02: Added settings page to force calendar sync diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog index ee927c752..acdeeaaa0 100644 --- a/apps/android/ChangeLog +++ b/apps/android/ChangeLog @@ -9,4 +9,4 @@ 0.08: Handling of alarms 0.09: Alarm vibration, repeat, and auto-snooze now handled by sched 0.10: Fix SMS bug -0.11: Use default Bangle formatter for booleans +0.12: Use default Bangle formatter for booleans diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 83a0aa027..fc501a5d0 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -591,7 +591,6 @@ function getWeatherIconByCode(code) { default: return weatherRainy; } - break; case 6: return weatherSnowy; case 7: @@ -607,9 +606,8 @@ function getWeatherIconByCode(code) { default: return weatherCloudy; } - break; - default: - return undefined; + default: + return undefined; } } diff --git a/apps/football/metadata.json b/apps/football/metadata.json index 253026c39..43e7ac1bf 100644 --- a/apps/football/metadata.json +++ b/apps/football/metadata.json @@ -2,7 +2,7 @@ "id": "football", "name": "football", "shortName": "football", - "version": "1.00", + "version": "1.01", "type": "app", "description": "Classic football game of the CASIO chronometer", "icon": "app.png", diff --git a/apps/invader/ChangeLog b/apps/invader/ChangeLog index 5560f00bc..6c5a33e59 100644 --- a/apps/invader/ChangeLog +++ b/apps/invader/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.11: Changes...