From 5c4651a3d9b50ac81c65ba5a0fc7a124469657c5 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 17 Jan 2015 09:09:36 +0800 Subject: [PATCH 01/12] auto launch koreader when opening PDF/DJVU/EPUB/FB2 files in pocketbook --- Makefile | 26 +++++++++---- README.md | 12 +++++- base | 2 +- frontend/device/pocketbook/device.lua | 56 ++++++++++++++------------- platform/pocketbook/extensions.cfg | 10 +++++ platform/pocketbook/koreader.app | 10 ++++- 6 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 platform/pocketbook/extensions.cfg diff --git a/Makefile b/Makefile index d41e9d94e..34f5687bb 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,13 @@ KOR_BASE?=base VERSION=$(shell git describe HEAD) REVISION=$(shell git rev-parse --short HEAD) -# subdirectory we use to build the installation bundle -export PATH:=$(CURDIR)/$(KOR_BASE)/toolchain/android-toolchain/bin:$(PATH) +# set PATH to find CC in managed toolchains +ifeq ($(TARGET), android) + PATH:=$(CURDIR)/$(KOR_BASE)/$(ANDROID_TOOLCHAIN)/bin:$(PATH) +else ifeq ($(TARGET), pocketbook) + PATH:=$(CURDIR)/$(KOR_BASE)/$(POCKETBOOK_TOOLCHAIN)/bin:$(PATH) +endif + MACHINE?=$(shell PATH=$(PATH) $(CC) -dumpmachine 2>/dev/null) INSTALL_DIR=koreader-$(MACHINE) @@ -187,24 +192,31 @@ pbupdate: all rm -f koreader-pocketbook-$(MACHINE)-$(VERSION).zip # Pocketbook launching script mkdir -p $(INSTALL_DIR)/applications + mkdir -p $(INSTALL_DIR)/system/bin + mkdir -p $(INSTALL_DIR)/system/config + cp $(POCKETBOOK_DIR)/koreader.app $(INSTALL_DIR)/applications + cp $(POCKETBOOK_DIR)/koreader.app $(INSTALL_DIR)/system/bin + cp $(POCKETBOOK_DIR)/extensions.cfg $(INSTALL_DIR)/system/config + cp -rfL $(INSTALL_DIR)/koreader $(INSTALL_DIR)/applications # create new package cd $(INSTALL_DIR) && \ zip -9 -r \ ../koreader-pocketbook-$(MACHINE)-$(VERSION).zip \ - koreader applications -x "koreader/resources/fonts/*" \ + applications system -x "koreader/resources/fonts/*" \ "koreader/resources/icons/src/*" "koreader/spec/*" # generate koboupdate package index file zipinfo -1 koreader-pocketbook-$(MACHINE)-$(VERSION).zip > \ - $(INSTALL_DIR)/koreader/ota/package.index - echo "koreader/ota/package.index" >> $(INSTALL_DIR)/koreader/ota/package.index + $(INSTALL_DIR)/applications/koreader/ota/package.index + echo "applications/koreader/ota/package.index" >> \ + $(INSTALL_DIR)/applications/koreader/ota/package.index # update index file in zip package cd $(INSTALL_DIR) && zip -u ../koreader-pocketbook-$(MACHINE)-$(VERSION).zip \ - koreader/ota/package.index + applications/koreader/ota/package.index # make gzip pbupdate for zsync OTA update cd $(INSTALL_DIR) && \ tar czafh ../koreader-pocketbook-$(MACHINE)-$(VERSION).tar.gz \ - -T koreader/ota/package.index --no-recursion + -T applications/koreader/ota/package.index --no-recursion androidupdate: all mkdir -p $(ANDROID_LAUNCHER_DIR)/assets/module diff --git a/README.md b/README.md index 7b1c3c4f3..a5b7151d2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ KOReader KOReader is a document viewer application, originally created for Kindle e-ink readers. It currently runs on Kindle 5 (Touch), Kindle Paperwhite, -Kobo and Android (2.3+) devices. Developers can also run Koreader emulator +Kobo, PocketBook 840 and Android (2.3+) devices. Developers can also run Koreader emulator for development purpose on desktop PC with Linux or Windows operating system. Main features for users @@ -120,6 +120,16 @@ To build installable package for Kobo: make TARGET=kobo clean koboupdate ``` +To build installable package for PocketBook you need first to obtain the SDK +from PocketBook: +``` +make pocketbook-toolchain +``` +then similarly with Kindle and Kobo building run this command: +``` +make TARGET=pocketbook clean pbupdate +``` + To run, you must call the script `reader.lua`. Run it without arguments to see usage notes. Note that the script and the `luajit` binary must be in the same directory. diff --git a/base b/base index 64ed78a30..877d3b55c 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 64ed78a30fd240216123543dd8267ec08c43b70f +Subproject commit 877d3b55cb3d687de2a2e4422395e6624c202c60 diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index 3d69ce409..e66f67f70 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -11,6 +11,8 @@ local EVT_KEYPRESS = 25 local EVT_KEYUP = 26 local EVT_KEYRELEASE = 26 local EVT_KEYREPEAT = 28 +local EVT_FOREGROUND = 151 +local EVT_BACKGROUND = 152 local KEY_POWER = 0x01 local KEY_DELETE = 0x08 @@ -34,50 +36,52 @@ local KEY_COVERCLOSE = 0x03 local function yes() return true end local PocketBook = Generic:new{ - -- both the following are just for testing similar behaviour - -- see ffi/framebuffer_mxcfb.lua model = "PocketBook", isPocketBook = yes, - - isTouchDevice = yes, - display_dpi = 212, - touch_dev = "/dev/input/event1", -- probably useless - emu_events_dev = "/var/dev/shm/emu_events", + isInBackGroud = false, } function PocketBook:init() - -- this example uses the mxcfb framebuffer driver: - self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = DEBUG} - - self.input = require("device/input"):new{ - device = self, - debug = DEBUG, - event_map = { - [25] = "LPgBack", - [24] = "LPgFwd", - [1002] = "Power", - } - } - -- we inject an input hook for debugging purposes. You probably don't want - -- it after everything is implemented. self.input:registerEventAdjustHook(function(_input, ev) DEBUG("ev", ev) if ev.type == EVT_KEYDOWN or ev.type == EVT_KEYUP then ev.code = ev.code ev.value = ev.type == EVT_KEYDOWN and 1 or 0 ev.type = 1 -- EV_KEY + elseif ev.type == EVT_BACKGROUND then + isInBackGroud = true + self:onPowerEvent("Power") + elseif isInBackGroud and ev.type == EVT_FOREGROUND then + isInBackGroud = false + self:onPowerEvent("Power") end end) - -- no backlight management yet - os.remove(self.emu_events_dev) os.execute("mkfifo " .. self.emu_events_dev) self.input.open(self.emu_events_dev, 1) Generic.init(self) end --- maybe additional implementations are needed for other models, --- testing on PocketBook Lux 2 for now. +local PocketBook840 = PocketBook:new{ + isTouchDevice = yes, + hasKeys = yes, + display_dpi = 250, + emu_events_dev = "/var/dev/shm/emu_events", +} -return PocketBook +function PocketBook840:init() + self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = DEBUG} + self.input = require("device/input"):new{ + device = self, + event_map = { + [25] = "LPgBack", + [24] = "LPgFwd", + [1002] = "Power", + } + } + PocketBook.init(self) +end + +-- should check device model before return to support other PocketBook models +return PocketBook840 diff --git a/platform/pocketbook/extensions.cfg b/platform/pocketbook/extensions.cfg new file mode 100644 index 000000000..5977d0ee0 --- /dev/null +++ b/platform/pocketbook/extensions.cfg @@ -0,0 +1,10 @@ +pdf:@PDF_file:1:koreader.app:ICON_PDF +djvu:@DJVU_file:1:koreader.app:ICON_DJVU +epub:@EPUB_file:1:koreader.app:ICON_EPUB +fb2:@FB2_file:1:koreader.app:ICON_FB2 +mobi:@MOBI_file:1:koreader.app:ICON_MOBI +zip:@ZIP_file:1:koreader.app:ICON_ZIP +cbz:@ZIP_file:1:koreader.app:ICON_ZIP + + + diff --git a/platform/pocketbook/koreader.app b/platform/pocketbook/koreader.app index 7ecea0c2b..60e09e8b1 100755 --- a/platform/pocketbook/koreader.app +++ b/platform/pocketbook/koreader.app @@ -2,7 +2,7 @@ export LC_ALL="en_US.UTF-8" # working directory of koreader -KOREADER_DIR=/mnt/ext1/koreader +KOREADER_DIR=/mnt/ext1/applications/koreader # update to new version from OTA directory NEWUPDATE="${KOREADER_DIR}/ota/koreader.updated.tar" @@ -21,7 +21,13 @@ export TESSDATA_PREFIX="data" # export dict directory export STARDICT_DATA_DIR="data/dict" -./reader.lua /mnt/ext1 2> crash.log +if [ `echo $@ | wc -c` -eq 1 ]; then + args="/mnt/ext1/" +else + args="$@" +fi + +./reader.lua "$args" 2> crash.log if pidof reader.lua > /dev/null 2>&1 ; then killall -TERM reader.lua From 4b6d2e155c4ae9dbd039b066c5fcd5673fa10e47 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 17 Jan 2015 23:16:45 +0800 Subject: [PATCH 02/12] fix wrong exclusion of unused files when building pbupdate --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 34f5687bb..39210bf9f 100644 --- a/Makefile +++ b/Makefile @@ -203,8 +203,8 @@ pbupdate: all cd $(INSTALL_DIR) && \ zip -9 -r \ ../koreader-pocketbook-$(MACHINE)-$(VERSION).zip \ - applications system -x "koreader/resources/fonts/*" \ - "koreader/resources/icons/src/*" "koreader/spec/*" + applications system -x "applications/koreader/resources/fonts/*" \ + "applications/koreader/resources/icons/src/*" "applications/koreader/spec/*" # generate koboupdate package index file zipinfo -1 koreader-pocketbook-$(MACHINE)-$(VERSION).zip > \ $(INSTALL_DIR)/applications/koreader/ota/package.index From 96e9bb07019273ca2cc9f00c050a771d964d3d8f Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 17 Jan 2015 23:17:46 +0800 Subject: [PATCH 03/12] partial refresh screen when koreader goes to forground --- frontend/device/pocketbook/device.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index e66f67f70..89a38651f 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -38,7 +38,7 @@ local function yes() return true end local PocketBook = Generic:new{ model = "PocketBook", isPocketBook = yes, - isInBackGroud = false, + isInBackGround = false, } function PocketBook:init() @@ -49,11 +49,13 @@ function PocketBook:init() ev.value = ev.type == EVT_KEYDOWN and 1 or 0 ev.type = 1 -- EV_KEY elseif ev.type == EVT_BACKGROUND then - isInBackGroud = true + isInBackGround = true self:onPowerEvent("Power") - elseif isInBackGroud and ev.type == EVT_FOREGROUND then - isInBackGroud = false + elseif isInBackGround and ev.type == EVT_FOREGROUND then + isInBackGround = false self:onPowerEvent("Power") + elseif not isInBackGround and ev.type == EVT_FOREGROUND then + self.screen:refreshPartial() end end) From a5b90588ae762b6986a6db99ce2d9edcdffd11a6 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 17 Jan 2015 23:54:49 +0800 Subject: [PATCH 04/12] add powerd for PocketBook device --- frontend/device/generic/powerd.lua | 11 ++++++++++ frontend/device/pocketbook/device.lua | 1 + frontend/device/pocketbook/powerd.lua | 31 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 frontend/device/pocketbook/powerd.lua diff --git a/frontend/device/generic/powerd.lua b/frontend/device/generic/powerd.lua index 9463d7960..2de9b5f1e 100644 --- a/frontend/device/generic/powerd.lua +++ b/frontend/device/generic/powerd.lua @@ -37,6 +37,17 @@ function BasePowerD:read_int_file(file) end end +function BasePowerD:read_str_file(file) + local fd = io.open(file, "r") + if fd then + local str = fd:read("*all") + fd:close() + return str + else + return "" + end +end + function BasePowerD:setIntensity(intensity) intensity = intensity < self.fl_min and self.fl_min or intensity intensity = intensity > self.fl_max and self.fl_max or intensity diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index 89a38651f..33194092b 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -74,6 +74,7 @@ local PocketBook840 = PocketBook:new{ function PocketBook840:init() self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = DEBUG} + self.powerd = require("device/pocketbook/powerd"):new{device = self} self.input = require("device/input"):new{ device = self, event_map = { diff --git a/frontend/device/pocketbook/powerd.lua b/frontend/device/pocketbook/powerd.lua new file mode 100644 index 000000000..564c8914e --- /dev/null +++ b/frontend/device/pocketbook/powerd.lua @@ -0,0 +1,31 @@ +local BasePowerD = require("device/generic/powerd") +local ffi = require("ffi") +local inkview = ffi.load("inkview") + +ffi.cdef[[ +int IsCharging(); +]] + +local PocketBookPowerD = BasePowerD:new{ + battCapacity = nil, + is_charging = nil, + batt_capacity_file = "/sys/devices/platform/sun5i-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery/capacity", + is_charging_file = "/sys/devices/platform/sun5i-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery/status", +} + +function PocketBookPowerD:init() +end + +function PocketBookPowerD:getCapacityHW() + self.battCapacity = self:read_int_file(self.batt_capacity_file) + return self.battCapacity +end + +function PocketBookPowerD:isChargingHW() + self.is_charging = self:read_str_file(self.is_charging_file) + return self.is_charging == "Charging" + -- or we can query using SDK method `IsCharging` + --return inkview.IsCharging() == 1 +end + +return PocketBookPowerD From 73e02735e564a7b3d0a673014caacb9f76cfe6d5 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 18 Jan 2015 00:17:17 +0800 Subject: [PATCH 05/12] add missing pocketbook-toolchain target in Makefile --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 39210bf9f..a4c436996 100644 --- a/Makefile +++ b/Makefile @@ -234,6 +234,9 @@ androiddev: androidupdate android-toolchain: $(MAKE) -C $(KOR_BASE) android-toolchain +pocketbook-toolchain: + $(MAKE) -C $(KOR_BASE) pocketbook-toolchain + pot: mkdir -p $(TEMPLATE_DIR) $(XGETTEXT_BIN) reader.lua `find frontend -iname "*.lua"` \ From 6a06cfaea5313fdff6aa73b512064b1b25802c45 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 18 Jan 2015 00:58:08 +0800 Subject: [PATCH 06/12] refactor out flush settings when device goes into screensaver --- frontend/device/generic/device.lua | 4 ++++ frontend/ui/uimanager.lua | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 3a78029de..1793be962 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -1,3 +1,4 @@ +local Event = require("ui/event") local util = require("ffi/util") local DEBUG = require("dbg") @@ -69,10 +70,12 @@ function Device:getPowerDevice() end function Device:intoScreenSaver() + local UIManager = require("ui/uimanager") if self.charging_mode == false and self.screen_saver_mode == false then self.screen:saveCurrentBB() self.screen_saver_mode = true end + UIManager:sendEvent(Event:new("FlushSettings")) end function Device:outofScreenSaver() @@ -97,6 +100,7 @@ function Device:onPowerEvent(ev) self.screen:setRotationMode(0) Screensaver:show() self:prepareSuspend() + UIManager:sendEvent(Event:new("FlushSettings")) UIManager:scheduleIn(10, self.Suspend) elseif (ev == "Power" or ev == "Resume") and self.screen_saver_mode then DEBUG("Resuming...") diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 1f4f2531c..0ccac2850 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -39,7 +39,6 @@ function UIManager:init() } if Device:isKobo() then self.event_handlers["Suspend"] = function(input_event) - self:sendEvent(Event:new("FlushSettings")) Device:onPowerEvent(input_event) end self.event_handlers["Resume"] = function(input_event) @@ -64,7 +63,6 @@ function UIManager:init() end elseif Device:isKindle() then self.event_handlers["IntoSS"] = function() - self:sendEvent(Event:new("FlushSettings")) Device:intoScreenSaver() end self.event_handlers["OutOfSS"] = function() From d94d7d3aa7f5d4a0e652a773444453a6e30b3e88 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 18 Jan 2015 04:34:19 +0800 Subject: [PATCH 07/12] fix PgFwd/PgBack cannot turn page in PDF scroll mode --- frontend/apps/reader/modules/readerpaging.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index a5cbaa447..39d672896 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -29,10 +29,10 @@ function ReaderPaging:init() self.key_events = { GotoNextPage = { {Input.group.PgFwd}, doc = "go to next page", - event = "GotoPageRel", args = 1 }, + event = "PagingRel", args = 1 }, GotoPrevPage = { {Input.group.PgBack}, doc = "go to previous page", - event = "GotoPageRel", args = -1 }, + event = "PagingRel", args = -1 }, GotoFirst = { {"1"}, doc = "go to start", event = "GotoPercent", args = 0}, From 291f088d94d98e1f9c635787465332ce71390668 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 18 Jan 2015 14:26:33 +0800 Subject: [PATCH 08/12] update koreader-base for multi-touch support on PocketBook --- base | 2 +- frontend/device/pocketbook/device.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base b/base index 877d3b55c..9b1b46b5c 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 877d3b55cb3d687de2a2e4422395e6624c202c60 +Subproject commit 9b1b46b5c0de218ac741837a5e00dda500ec8081 diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index 33194092b..ff3cde905 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -43,7 +43,7 @@ local PocketBook = Generic:new{ function PocketBook:init() self.input:registerEventAdjustHook(function(_input, ev) - DEBUG("ev", ev) + --DEBUG("ev", ev.type, ev.code, ev.value) if ev.type == EVT_KEYDOWN or ev.type == EVT_KEYUP then ev.code = ev.code ev.value = ev.type == EVT_KEYDOWN and 1 or 0 From 49e672d599362fc082b82c47bb4ee60e366adf61 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 18 Jan 2015 14:59:11 +0800 Subject: [PATCH 09/12] totally disable rotation gesture to change screen orientation --- .../apps/reader/modules/readerrotation.lua | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/frontend/apps/reader/modules/readerrotation.lua b/frontend/apps/reader/modules/readerrotation.lua index 8810f8146..30d32c358 100644 --- a/frontend/apps/reader/modules/readerrotation.lua +++ b/frontend/apps/reader/modules/readerrotation.lua @@ -7,7 +7,6 @@ local GestureRange = require("ui/gesturerange") local _ = require("gettext") local ReaderRotation = InputContainer:new{ - ROTATE_ANGLE_THRESHOLD = 15, current_rotation = 0 } @@ -25,21 +24,6 @@ function ReaderRotation:init() event = "Rotate", args = 90 }, } end - if Device:isTouchDevice() then - self.ges_events = { - RotateGes = { - GestureRange:new{ - ges = "rotate", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight(), - }, - rate = 0.3, - } - }, - } - end end -- TODO: reset rotation on new document, maybe on new page? @@ -50,15 +34,4 @@ function ReaderRotation:onRotate(rotate_by) return true end -function ReaderRotation:onRotateGes(arg, ges) - if ges.angle and ges.angle > self.ROTATE_ANGLE_THRESHOLD then - if Screen:getScreenMode() == "portrait" then - self.ui:handleEvent(Event:new("SetScreenMode", "landscape")) - else - self.ui:handleEvent(Event:new("SetScreenMode", "portrait")) - end - end - return true -end - return ReaderRotation From 78df8736aa686fc4356f0ab6131cc67c3d3dd3f5 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 19 Jan 2015 12:23:05 +0800 Subject: [PATCH 10/12] more sensitive tap gesture detection --- base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base b/base index 9b1b46b5c..694a0838a 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 9b1b46b5c0de218ac741837a5e00dda500ec8081 +Subproject commit 694a0838ae23b580c307818ed28c958a27937ba2 From 29c15518b03a81e107a8d0edb17ea94935ed97cb Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 19 Jan 2015 12:50:59 +0800 Subject: [PATCH 11/12] fix wrong PgBack/PgFwd key binding --- frontend/device/pocketbook/device.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index ff3cde905..e33a4c4ca 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -78,8 +78,8 @@ function PocketBook840:init() self.input = require("device/input"):new{ device = self, event_map = { - [25] = "LPgBack", - [24] = "LPgFwd", + [24] = "LPgBack", + [25] = "LPgFwd", [1002] = "Power", } } From 6ad9d3cfed394518b11986419c7ab704a6e740e6 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 19 Jan 2015 21:13:27 +0800 Subject: [PATCH 12/12] support PocketBook firmware versions under 5.* --- base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base b/base index 694a0838a..3991f1018 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 694a0838ae23b580c307818ed28c958a27937ba2 +Subproject commit 3991f1018422e15d160ebf7a1fd44856a356045c