From d4365810a28c7f64ca01048f33b5c63fedf1f195 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 24 Feb 2021 20:21:34 +0000 Subject: [PATCH 0001/1183] first go --- src/jsjit.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/jsjit.h | 21 +++++++++ src/jsjitc.h | 23 ++++++++++ 3 files changed, 166 insertions(+) create mode 100644 src/jsjit.c create mode 100644 src/jsjit.h create mode 100644 src/jsjitc.h diff --git a/src/jsjit.c b/src/jsjit.c new file mode 100644 index 0000000000..0ad7b63aad --- /dev/null +++ b/src/jsjit.c @@ -0,0 +1,122 @@ +/* + * This file is part of Espruino, a JavaScript interpreter for Microcontrollers + * + * Copyright (C) 2013 Gordon Williams + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * ---------------------------------------------------------------------------- + * Recursive descent JIT + * ---------------------------------------------------------------------------- + */ + +#include "jsjit.h" +#include "jsjitc.h" + +JsVar *jsjStringPool; + +NO_INLINE void jsjFactor() { + if (lex->tk==LEX_ID) { + const char *v = jslGetTokenValueAsString(); + int offset = jsvGetStringLength(jsjStringPool); + jsvAppendStringBuf(jsjStringPool, v, strlen(v)+1); // include trailing 0 + JSP_ASSERT_MATCH(LEX_ID); + jsjcLiteral32(1, offset); // TODO: store token values + jsjcCall(jspGetNamedVariable); + return a; + } else if (lex->tk==LEX_INT) { + int64_t v = stringToInt(jslGetTokenValueAsString())); + JSP_ASSERT_MATCH(LEX_INT); + jsjcLiteral64(1, (uint64_t)v); + jsjcCall(jsvNewFromLongInteger); // TODO: could do 32 bit here + return v; + } else if (lex->tk==LEX_FLOAT) { + double v = stringToFloat(jslGetTokenValueAsString()); + JSP_ASSERT_MATCH(LEX_FLOAT); + jsjcLiteral64(1, *((uint64_t*)&v)); + jsjcCall(jsvNewFromFloat); + } else if (lex->tk=='(') { + JSP_ASSERT_MATCH('('); + if (!jspCheckStackPosition()) return 0; + // Just parse a normal expression (which can include commas) + JsVar *a = jspeExpression(); + if (!JSP_SHOULDNT_PARSE) JSP_MATCH_WITH_RETURN(')',a); + return a; + } else if (lex->tk==LEX_R_TRUE) { + JSP_ASSERT_MATCH(LEX_R_TRUE); + jsjcLiteral32(1, 1); + jsjcCall(jsvNewFromBool); + } else if (lex->tk==LEX_R_FALSE) { + JSP_ASSERT_MATCH(LEX_R_FALSE); + jsjcLiteral32(1, 0); + jsjcCall(jsvNewFromBool); + } else if (lex->tk==LEX_R_NULL) { + JSP_ASSERT_MATCH(LEX_R_NULL); + jsjcLiteral32(1, JSV_NULL); + jsjcCall(jsvNewWithFlags); + } else if (lex->tk==LEX_R_UNDEFINED) { + JSP_ASSERT_MATCH(LEX_R_UNDEFINED); + jsjcLiteral32(1, 0); + } else if (lex->tk==LEX_STR) { + JsVar *a = jslGetTokenValueAsVar(); + JSP_ASSERT_MATCH(LEX_STR); + jsvUnLock(a); + }/* else if (lex->tk=='{') { + if (!jspCheckStackPosition()) return 0; + return jspeFactorObject(); + } else if (lex->tk=='[') { + if (!jspCheckStackPosition()) return 0; + return jspeFactorArray(); + } else if (lex->tk==LEX_R_FUNCTION) { + if (!jspCheckStackPosition()) return 0; + JSP_ASSERT_MATCH(LEX_R_FUNCTION); + return jspeFunctionDefinition(true); + } else if (lex->tk==LEX_R_THIS) { + JSP_ASSERT_MATCH(LEX_R_THIS); + return jsvLockAgain( execInfo.thisVar ? execInfo.thisVar : execInfo.root ); + } else if (lex->tk==LEX_R_DELETE) { + if (!jspCheckStackPosition()) return 0; + return jspeFactorDelete(); + } else if (lex->tk==LEX_R_TYPEOF) { + if (!jspCheckStackPosition()) return 0; + return jspeFactorTypeOf(); + } */else if (lex->tk==LEX_R_VOID) { + JSP_ASSERT_MATCH(LEX_R_VOID); + // jsjUnaryExpression(); // FIXME + jsjcCall(jsvUnLock); + return 0; + } + JSP_MATCH(LEX_EOF); + return 0; +} + +JsVar *jsjParse() { + jsjFactor(); + return 0; +} + +JsVar *jsjEvaluateVar(JsVar *str) { + JsLex lex; + assert(jsvIsString(str)); + JsLex *oldLex = jslSetLex(&lex); + jslInit(str); + JsVar *v = jsjParse(); + jslKill(); + jslSetLex(oldLex); + return v; +} + +JsVar *jsjEvaluate(const char *str) { + JsVar *evCode; + evCode = jsvNewNativeString((char*)str, strlen(str)); + if (!evCode) return 0; + JsVar *v = 0; + if (!jsvIsMemoryFull()) + v = jsjEvaluateVar(evCode,); + jsvUnLock(evCode); + + return v; +} + diff --git a/src/jsjit.h b/src/jsjit.h new file mode 100644 index 0000000000..2c63be7272 --- /dev/null +++ b/src/jsjit.h @@ -0,0 +1,21 @@ +/* + * This file is part of Espruino, a JavaScript interpreter for Microcontrollers + * + * Copyright (C) 2013 Gordon Williams + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * ---------------------------------------------------------------------------- + * Recursive descent JIT + * ---------------------------------------------------------------------------- + */ +#ifndef JSJIT_H_ +#define JSJIT_H_ + +#include "jsparse.h" + +JsVar *jsjEvaluate(const char *str); + +#endif /* JSJIT_H_ */ diff --git a/src/jsjitc.h b/src/jsjitc.h new file mode 100644 index 0000000000..033784b40e --- /dev/null +++ b/src/jsjitc.h @@ -0,0 +1,23 @@ +/* + * This file is part of Espruino, a JavaScript interpreter for Microcontrollers + * + * Copyright (C) 2013 Gordon Williams + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * ---------------------------------------------------------------------------- + * Recursive descent JIT + * ---------------------------------------------------------------------------- + */ +#ifndef JSJITC_H_ +#define JSJITC_H_ + +#include "jsjit.h" + +void jsjcLiteral32(int reg, uint32_t data); +void jsjcLiteral64(int reg, uint64_t data); +void jsjcCall(void *c); + +#endif /* JSJIT_H_ */ From 9b5f7a6683371cf068b1c6406971dfc0fdd8520a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Sun, 6 Jun 2021 18:19:10 +0100 Subject: [PATCH 0002/1183] misc --- src/jsjit.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/jsjit.c b/src/jsjit.c index 0ad7b63aad..74a2fb8d7d 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -62,7 +62,13 @@ NO_INLINE void jsjFactor() { } else if (lex->tk==LEX_STR) { JsVar *a = jslGetTokenValueAsVar(); JSP_ASSERT_MATCH(LEX_STR); + int offset = jsvGetStringLength(jsjStringPool); + int len = jsvGetStringLength(a); + jsvAppendStringVarComplete(jsjStringPool, a); jsvUnLock(a); + jsjcLiteral32(1, len); + jsjcLiteral32(2, offset); + jsjcCall(jsvNewStringOfLength); }/* else if (lex->tk=='{') { if (!jspCheckStackPosition()) return 0; return jspeFactorObject(); From 3f62edcfc4af5d1e08a1c9638bb71ff175eed43e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 16 Feb 2022 16:56:22 +0000 Subject: [PATCH 0003/1183] first stab at having all intermediate + binary files in a different folders - hopefully allow more than one build at the same time eventually --- Makefile | 43 ++++++++++++++++++++++++----------- bin/README.md | 1 + build/README.md | 1 + make/family/NRF52.make | 10 ++++---- make/misc/tensorflow.make | 2 +- scripts/get_makefile_decls.py | 4 ++-- 6 files changed, 40 insertions(+), 21 deletions(-) create mode 100644 bin/README.md create mode 100644 build/README.md diff --git a/Makefile b/Makefile index d4be094424..9e56f7c508 100755 --- a/Makefile +++ b/Makefile @@ -37,8 +37,9 @@ # CC3000=1 # If compiling for a non-linux target that has internet support, use CC3000 support # USB_PRODUCT_ID=0x1234 # force a specific USB Product ID (default 0x5740) # -# GENDIR=MyGenDir # sets directory for files generated during make -# # GENDIR=/home/mydir/mygendir +# GENDIR=MyGenDir # sets directory for intermediate files generated during make +# OBJDIR=MyObjDir # sets directory for object files generated during make +# BINDIR=MyBinDir # sets directory for binaries generated during make # SETDEFINES=FileDefines # settings which are called after definitions for board are done # # SETDEFINES=/home/mydir/myDefines # UNSUPPORTEDMAKE=FileUnsu# Adds additional files from unsupported sources(means not supported by Gordon) to actual make @@ -65,6 +66,12 @@ include make/sanitycheck.make ifndef GENDIR GENDIR=gen endif +ifndef OBJDIR +OBJDIR=obj +endif +ifndef BINDIR +BINDIR=bin +endif ifndef SINGLETHREAD MAKEFLAGS=-j5 # multicore @@ -172,9 +179,9 @@ endif # Get info out of BOARDNAME.py # --------------------------------------------------------------------------------- # TODO: could check board here and make clean if it's different? -$(shell rm -f CURRENT_BOARD.make) -$(shell python scripts/get_makefile_decls.py $(BOARD) > CURRENT_BOARD.make) -include CURRENT_BOARD.make +$(shell rm -f $(GENDIR)/CURRENT_BOARD.make) +$(shell python scripts/get_makefile_decls.py $(BOARD) > $(GENDIR)/CURRENT_BOARD.make) +include $(GENDIR)/CURRENT_BOARD.make #set or reset defines like USE_GRAPHIC from an external file to customize firmware ifdef SETDEFINES @@ -668,7 +675,13 @@ PININFOFILE=$(GENDIR)/jspininfo SOURCES += $(PININFOFILE).c SOURCES += $(WRAPPERSOURCES) $(TARGETSOURCES) -SOURCEOBJS = $(SOURCES:.c=.o) $(CPPSOURCES:.cpp=.o) $(CCSOURCES:.cc=.o) +SOURCEOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(SOURCES)) +ifdef CPPSOURCES +SOURCEOBJS += $(patsubst %.cpp,$(OBJDIR)/%.cpp.o,$(CPPSOURCES)) +endif +ifdef CCSOURCES +SOURCEOBJS += $(patsubst %.cc,$(OBJDIR)/%.cc.o,$(CCSOURCES)) +endif OBJS = $(PRECOMPILED_OBJS) $(SOURCEOBJS) @@ -795,25 +808,30 @@ quiet_link= LD $@ quiet_obj_dump= GEN $(PROJ_NAME).lst quiet_obj_to_bin= GEN $(PROJ_NAME).$2 -%.o: %.c $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h +$(OBJDIR)/%.o: %.c $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h @echo $($(quiet_)compile) + @mkdir -p $(shell dirname $@) # create directory if it doesn't exist @$(call compile) -.cc.o: %.cc $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h +$(OBJDIR)/%.cc.o: %.cc $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h @echo $($(quiet_)compile) + @mkdir -p $(shell dirname $@) # create directory if it doesn't exist @$(CC) $(CCFLAGS) $(CFLAGS) $< -o $@ -.cpp.o: $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h +$(OBJDIR)/%.cpp.o: $(PLATFORM_CONFIG_FILE) $(PININFOFILE).h @echo $($(quiet_)compile) + @mkdir -p $(shell dirname $@) # create directory if it doesn't exist @$(call compile) # case sensitive - Nordic's files are capitals -.s.o: +$(OBJDIR)/%.s.o: @echo $($(quiet_)compile) + @mkdir -p $(shell dirname $@) # create directory if it doesn't exist @$(call compile) -.S.o: +$(OBJDIR)/%.S.o: @echo $($(quiet_)compile) + @mkdir -p $(shell dirname $@) # create directory if it doesn't exist @$(call compile) ifdef LINUX # --------------------------------------------------- @@ -832,8 +850,7 @@ lst: $(PROJ_NAME).lst clean: @echo Cleaning targets - $(Q)find . -name \*.o | grep -v "./arm-bcm2708\|./gcc-arm-none-eabi" | xargs rm -f - $(Q)find . -name \*.d | grep -v "./arm-bcm2708\|./gcc-arm-none-eabi" | xargs rm -f + $(Q)rm -rf $(OBJDIR)/* $(Q)rm -f $(ROOT)/gen/*.c $(ROOT)/gen/*.h $(ROOT)/gen/*.ld $(Q)rm -f $(ROOT)/scripts/*.pyc $(ROOT)/boards/*.pyc $(Q)rm -f $(PROJ_NAME).elf diff --git a/bin/README.md b/bin/README.md new file mode 100644 index 0000000000..bdc6c1ee10 --- /dev/null +++ b/bin/README.md @@ -0,0 +1 @@ +This is where built binaries go diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000000..ad08bd1a02 --- /dev/null +++ b/build/README.md @@ -0,0 +1 @@ +Intermediate build files end up here diff --git a/make/family/NRF52.make b/make/family/NRF52.make index b2e8c7f8ad..5c0e532b0c 100644 --- a/make/family/NRF52.make +++ b/make/family/NRF52.make @@ -12,7 +12,7 @@ ifdef NRF_SDK17 # Use SDK17 NRF5X_SDK=17 NRF5X_SDK_17=1 -NRF5X_SDK_PATH=$(ROOT)/targetlibs/nrf5x_17 +NRF5X_SDK_PATH=targetlibs/nrf5x_17 DEFINES += -DNRF_SD_BLE_API_VERSION=7 DEFINES += -D__HEAP_SIZE=0 ifeq ($(CHIP),NRF52840) @@ -29,7 +29,7 @@ ifdef NRF_SDK15 # Use SDK15 NRF5X_SDK=15 NRF5X_SDK_15=1 -NRF5X_SDK_PATH=$(ROOT)/targetlibs/nrf5x_15 +NRF5X_SDK_PATH=targetlibs/nrf5x_15 DEFINES += -DNRF_SD_BLE_API_VERSION=6 DEFINES += -D__HEAP_SIZE=0 ifeq ($(CHIP),NRF52840) @@ -48,7 +48,7 @@ ifdef NRF_SDK14 # Use SDK14 NRF5X_SDK=14 NRF5X_SDK_14=1 -NRF5X_SDK_PATH=$(ROOT)/targetlibs/nrf5x_14 +NRF5X_SDK_PATH=targetlibs/nrf5x_14 DEFINES += -DNRF_SD_BLE_API_VERSION=5 DEFINES += -D__HEAP_SIZE=0 ifeq ($(CHIP),NRF52840) @@ -61,14 +61,14 @@ ifdef NRF_SDK11 # Use SDK11 NRF5X_SDK=11 NRF5X_SDK_11=1 -NRF5X_SDK_PATH=$(ROOT)/targetlibs/nrf5x_11 +NRF5X_SDK_PATH=targetlibs/nrf5x_11 DEFINES += -DNRF_SD_BLE_API_VERSION=2 SOFTDEVICE = $(SOFTDEVICE_PATH)/hex/s132_nrf52_2.0.0_softdevice.hex else # Use SDK12 NRF5X_SDK=12 NRF5X_SDK_12=1 -NRF5X_SDK_PATH=$(ROOT)/targetlibs/nrf5x_12 +NRF5X_SDK_PATH=targetlibs/nrf5x_12 DEFINES += -DNRF_SD_BLE_API_VERSION=3 SOFTDEVICE = $(SOFTDEVICE_PATH)/hex/s132_nrf52_3.1.0_softdevice.hex endif diff --git a/make/misc/tensorflow.make b/make/misc/tensorflow.make index fc496d3446..6647ae03f5 100644 --- a/make/misc/tensorflow.make +++ b/make/misc/tensorflow.make @@ -1,4 +1,4 @@ -TENSOR_ROOT := $(ROOT)/libs/tensorflow +TENSOR_ROOT := libs/tensorflow CCSOURCES += \ $(TENSOR_ROOT)/tensorflow/lite/micro/simple_memory_allocator.cc \ $(TENSOR_ROOT)/tensorflow/lite/micro/memory_helpers.cc \ diff --git a/scripts/get_makefile_decls.py b/scripts/get_makefile_decls.py index e8a792bf0f..ece333c1be 100644 --- a/scripts/get_makefile_decls.py +++ b/scripts/get_makefile_decls.py @@ -53,7 +53,7 @@ binaryName = binaryName[:binaryName.find('.bin')] if binaryName.find('.hex')>=0: binaryName = binaryName[:binaryName.find('.hex')] -print("PROJ_NAME="+binaryName) +print("PROJ_NAME=$(BINDIR)/"+binaryName) if board.chip["family"]!="LINUX": print("EMBEDDED=1") @@ -76,5 +76,5 @@ if 'bootloader' in board.info and board.info['bootloader']==1: print("USE_BOOTLOADER:=1") - print("BOOTLOADER_PROJ_NAME:=bootloader_$(PROJ_NAME)") + print("BOOTLOADER_PROJ_NAME:=$(BINDIR)/bootloader_"+binaryName) print("DEFINES+=-DUSE_BOOTLOADER") From 278a85c41c35d5a20fd47e73dafe0f2a47bd1097 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Feb 2022 20:43:56 +0000 Subject: [PATCH 0004/1183] build fixes now binaries are in bin dir --- scripts/create_espruino_image_1v3.sh | 19 ++++++++++--------- scripts/create_espruinowifi_image.sh | 19 ++++++++++--------- scripts/create_pico_image_1v3.sh | 19 ++++++++++--------- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/scripts/create_espruino_image_1v3.sh b/scripts/create_espruino_image_1v3.sh index 7865d21404..30cb52edee 100755 --- a/scripts/create_espruino_image_1v3.sh +++ b/scripts/create_espruino_image_1v3.sh @@ -17,9 +17,10 @@ cd .. # main dir BASEDIR=`pwd` BOARDNAME=ESPRUINOBOARD -ESPRUINOFILE=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` -BOOTLOADERFILE=bootloader_$ESPRUINOFILE -IMGFILE=espruino_full.bin +ESPRUINOBINARY=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` +BOOTLOADERFILE=bin/bootloader_$ESPRUINOBINARY +IMGFILE=bin/espruino_full.bin +ESPRUINOFILE=bin/$ESPRUINOBINARY rm -f $ESPRUINOFILE $BOOTLOADERFILE $IMGFILE export BOARD=ESPRUINOBOARD @@ -28,10 +29,10 @@ export BOARD=ESPRUINOBOARD export RELEASE=1 BOOTLOADER=1 make clean -BOOTLOADER=1 make || { echo 'Build failed' ; exit 1; } +BOOTLOADER=1 make || { echo 'ERROR Build failed' ; exit 255; } make clean -make || { echo 'Build failed' ; exit 1; } +make || { echo 'ERROR Build failed' ; exit 255; } BOOTLOADERSIZE=`python scripts/get_board_info.py $BOARDNAME "common.get_bootloader_size(board)"` IMGSIZE=$(expr $BOOTLOADERSIZE + $(du "$ESPRUINOFILE" | cut -f1)) @@ -42,18 +43,18 @@ echo Image Size = $IMGSIZE echo --------------------- echo Create blank image echo --------------------- -tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'Build failed' ; exit 1; } +tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'ERROR Build failed' ; exit 255; } echo Add bootloader echo --------------------- -dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } echo Add espruino echo --------------------- -dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } -cp $IMGFILE $ESPRUINOFILE || { echo 'Build failed' ; exit 1; } +cp $IMGFILE $ESPRUINOFILE || { echo 'ERROR Build failed' ; exit 255; } echo --------------------- echo Finished! Written to $IMGFILE and copied to $ESPRUINOFILE echo python scripts/stm32loader.py -p /dev/ttyUSB0 -b 460800 -ewv $ESPRUINOFILE diff --git a/scripts/create_espruinowifi_image.sh b/scripts/create_espruinowifi_image.sh index 9b7cdb8aa9..eb72fcc606 100755 --- a/scripts/create_espruinowifi_image.sh +++ b/scripts/create_espruinowifi_image.sh @@ -17,9 +17,10 @@ cd .. # main dir BASEDIR=`pwd` BOARDNAME=ESPRUINOWIFI -ESPRUINOFILE=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` -BOOTLOADERFILE=bootloader_$ESPRUINOFILE -IMGFILE=espruinowifi_full.bin +ESPRUINOBINARY=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` +BOOTLOADERFILE=bin/bootloader_$ESPRUINOBINARY +IMGFILE=bin/espruinowifi_full.bin +ESPRUINOFILE=bin/$ESPRUINOBINARY rm -f $ESPRUINOFILE $BOOTLOADERFILE $IMGFILE export BOARD=ESPRUINOWIFI @@ -27,10 +28,10 @@ export BOARD=ESPRUINOWIFI export RELEASE=1 BOOTLOADER=1 make clean -BOOTLOADER=1 make || { echo 'Build failed' ; exit 1; } +BOOTLOADER=1 make || { echo 'ERROR Build failed' ; exit 255; } make clean -make || { echo 'Build failed' ; exit 1; } +make || { echo 'ERROR Build failed' ; exit 255; } BOOTLOADERSIZE=`python scripts/get_board_info.py $BOARDNAME "common.get_espruino_binary_address(board)"` IMGSIZE=$(expr $BOOTLOADERSIZE + $(du "$ESPRUINOFILE" | cut -f1)) @@ -41,18 +42,18 @@ echo Image Size = $IMGSIZE echo --------------------- echo Create blank image echo --------------------- -tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'Build failed' ; exit 1; } +tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'ERROR Build failed' ; exit 255; } echo Add bootloader echo --------------------- -dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } echo Add espruino echo --------------------- -dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } -cp $IMGFILE $ESPRUINOFILE || { echo 'Build failed' ; exit 1; } +cp $IMGFILE $ESPRUINOFILE || { echo 'ERROR Build failed' ; exit 255; } echo --------------------- echo Finished! Written to $IMGFILE and copied to $ESPRUINOFILE echo dfu-util -a 0 -s 0x08000000 -D ${ESPRUINOFILE} diff --git a/scripts/create_pico_image_1v3.sh b/scripts/create_pico_image_1v3.sh index 395ed74a5a..6857899dc2 100755 --- a/scripts/create_pico_image_1v3.sh +++ b/scripts/create_pico_image_1v3.sh @@ -17,9 +17,10 @@ cd .. # main dir BASEDIR=`pwd` BOARDNAME=PICO_R1_3 -ESPRUINOFILE=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` -BOOTLOADERFILE=bootloader_$ESPRUINOFILE -IMGFILE=pico_full.bin +ESPRUINOBINARY=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` +BOOTLOADERFILE=bin/bootloader_$ESPRUINOBINARY +IMGFILE=bin/pico_full.bin +ESPRUINOFILE=bin/$ESPRUINOBINARY rm -f $ESPRUINOFILE $BOOTLOADERFILE $IMGFILE export BOARD=PICO_R1_3 @@ -27,10 +28,10 @@ export BOARD=PICO_R1_3 export RELEASE=1 BOOTLOADER=1 make clean -BOOTLOADER=1 make || { echo 'Build failed' ; exit 1; } +BOOTLOADER=1 make || { echo 'ERROR Build failed' ; exit 255; } make clean -make || { echo 'Build failed' ; exit 1; } +make || { echo 'ERROR Build failed' ; exit 255; } BOOTLOADERSIZE=`python scripts/get_board_info.py $BOARDNAME "common.get_espruino_binary_address(board)"` IMGSIZE=$(expr $BOOTLOADERSIZE + $(du "$ESPRUINOFILE" | cut -f1)) @@ -41,18 +42,18 @@ echo Image Size = $IMGSIZE echo --------------------- echo Create blank image echo --------------------- -tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'Build failed' ; exit 1; } +tr "\000" "\377" < /dev/zero | dd bs=1 count=$IMGSIZE of=$IMGFILE || { echo 'ERROR Build failed' ; exit 255; } echo Add bootloader echo --------------------- -dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 if=$BOOTLOADERFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } echo Add espruino echo --------------------- -dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'Build failed' ; exit 1; } +dd bs=1 seek=$BOOTLOADERSIZE if=$ESPRUINOFILE of=$IMGFILE conv=notrunc || { echo 'ERROR Build failed' ; exit 255; } -cp $IMGFILE $ESPRUINOFILE || { echo 'Build failed' ; exit 1; } +cp $IMGFILE $ESPRUINOFILE || { echo 'ERROR Build failed' ; exit 255; } echo --------------------- echo Finished! Written to $IMGFILE and copied to $ESPRUINOFILE echo dfu-util -a 0 -s 0x08000000 -D ${ESPRUINOFILE} From 4b4731704ca1535001f13a1fd9f8421a222d1ac7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Feb 2022 20:47:35 +0000 Subject: [PATCH 0005/1183] create_zip can now use multiple threads --- scripts/create_zip.sh | 151 +++++++--------------------------- scripts/create_zip_board.sh | 156 ++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+), 120 deletions(-) create mode 100755 scripts/create_zip_board.sh diff --git a/scripts/create_zip.sh b/scripts/create_zip.sh index 962ec61975..35713fd393 100755 --- a/scripts/create_zip.sh +++ b/scripts/create_zip.sh @@ -25,7 +25,7 @@ mkdir $ZIPDIR # Tidy up # Binaries -rm -f bootloader_espruino_$VERSION* espruino_$VERSION* +rm bin/*.hex bin/*.zip bin/*.app_hex # ESP8266 #rm -rf esp_iot_sdk_v2.0.0* #rm -rf xtensa-lx106-elf @@ -41,127 +41,38 @@ source scripts/provision.sh ALL echo ------------------------------------------------------ echo Building Version $VERSION echo ------------------------------------------------------ -# The following have been removed because it's too hard to keep the build going: -# STM32F3DISCOVERY OLIMEXINO_STM32 HYSTM32_32 HYSTM32_28 HYSTM32_24 RAK8211 RAK8212 RUUVITAG THINGY52 RASPBERRYPI -# -for BOARDNAME in ESPRUINO_1V3 ESPRUINO_1V3_AT ESPRUINO_1V3_WIZ PICO_1V3 PICO_1V3_CC3000 PICO_1V3_WIZ ESPRUINOWIFI PUCKJS PIXLJS BANGLEJS BANGLEJS2 MDBT42Q NUCLEOF401RE NUCLEOF411RE STM32VLDISCOVERY STM32F4DISCOVERY STM32L496GDISCOVERY MICROBIT1 MICROBIT2 ESP8266_BOARD ESP8266_4MB ESP32 WIO_LTE RAK5010 SMARTIBOT -do - echo ------------------------------ - echo $BOARDNAME - echo ------------------------------ - EXTRADEFS= - EXTRANAME= - if [ "$BOARDNAME" == "ESPRUINO_1V3" ]; then - BOARDNAME=ESPRUINOBOARD - EXTRADEFS= - fi - if [ "$BOARDNAME" == "ESPRUINO_1V3_AT" ]; then - BOARDNAME=ESPRUINOBOARD - EXTRADEFS="USE_NET=1 DEFINES=-DNO_VECTOR_FONT=1 BLACKLIST=boards/ESPRUINOBOARD.net.blocklist" - EXTRANAME=_at - fi - if [ "$BOARDNAME" == "ESPRUINO_1V3_WIZ" ]; then - BOARDNAME=ESPRUINOBOARD - EXTRADEFS="USE_NET=1 WIZNET=1 USE_CRYPTO=0 USE_DEBUGGER=0 USE_TAB_COMPLETE=0 USE_NETWORK_JS=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1' BLACKLIST=boards/ESPRUINOBOARD.net.blocklist" - # we must now disable crypto in order to get WIZnet support in on the Original board - EXTRANAME=_wiznet - fi - if [ "$BOARDNAME" == "PICO_1V3_CC3000" ]; then - BOARDNAME=PICO_R1_3 - EXTRADEFS="CC3000=1 USE_DEBUGGER=0 USE_NETWORK_JS=0 USE_TV=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1'" - EXTRANAME=_cc3000 - fi - if [ "$BOARDNAME" == "PICO_1V3_WIZ" ]; then - BOARDNAME=PICO_R1_3 - EXTRADEFS="WIZNET=1 USE_DEBUGGER=0 USE_NETWORK_JS=0 USE_TV=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1'" - EXTRANAME=_wiznet - fi - if [ "$BOARDNAME" == "PICO_1V3" ]; then - BOARDNAME=PICO_R1_3 - EXTRADEFS= - fi - - # actually build - ESP_BINARY_NAME=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` - if [ "$BOARDNAME" == "PUCKJS" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "PIXLJS" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "BANGLEJS" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "BANGLEJS2" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "SMARTIBOT" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "MDBT42Q" ]; then - ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD=1 - fi - if [ "$BOARDNAME" == "RUUVITAG" ]; then - ESP_BINARY2_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD_WITH_HEX=1 - fi - if [ "$BOARDNAME" == "THINGY52" ]; then - ESP_BINARY2_NAME=`basename $ESP_BINARY_NAME .hex`.zip - EXTRADEFS=DFU_UPDATE_BUILD_WITH_HEX=1 - fi - - echo "Building $ESP_BINARY_NAME" - echo - rm -f $BINARY_NAME - if [ "$BOARDNAME" == "ESPRUINOBOARD" ]; then - bash -c "$EXTRADEFS scripts/create_espruino_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 1; } - elif [ "$BOARDNAME" == "PICO_R1_3" ]; then - bash -c "$EXTRADEFS scripts/create_pico_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 1; } - elif [ "$BOARDNAME" == "ESPRUINOWIFI" ]; then - bash -c "$EXTRADEFS scripts/create_espruinowifi_image.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 1; } - else - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make clean" - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 1; } - fi - # rename binary if needed - if [ -n "$EXTRANAME" ]; then - NEW_BINARY_NAME=`basename ${ESP_BINARY_NAME} .bin`$EXTRANAME.bin - else - NEW_BINARY_NAME=${ESP_BINARY_NAME} - fi - # copy... - if [ "$BOARDNAME" == "ESP8266_BOARD" ]; then - tar -C $ZIPDIR -xzf ${ESP_BINARY_NAME}.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - # build a combined image - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make combined" || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - cp ${ESP_BINARY_NAME}_combined_512.bin $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - elif [ "$BOARDNAME" == "ESP8266_4MB" ]; then - tar -C $ZIPDIR -xzf ${ESP_BINARY_NAME}.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - # build a combined image - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make combined" || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - cp ${ESP_BINARY_NAME}_combined_4096.bin $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - else - echo Copying ${ESP_BINARY_NAME} to $ZIPDIR/$NEW_BINARY_NAME - cp ${ESP_BINARY_NAME} $ZIPDIR/$NEW_BINARY_NAME || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - if [ "$BOARDNAME" == "ESP32" ]; then - tar -C $ZIPDIR -xzf `basename $ESP_BINARY_NAME .bin`.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - fi - fi - # Copy second binary - if [ -n "$ESP_BINARY2_NAME" ]; then - cp ${ESP_BINARY2_NAME} $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 1; } - fi - -done - +read -r -d '' BOARDS <<'EOF' +ESPRUINO_1V3 +ESPRUINO_1V3_AT +ESPRUINO_1V3_WIZ +PICO_1V3 +PICO_1V3_CC3000 +PICO_1V3_WIZ +ESPRUINOWIFI +PUCKJS +PIXLJS +BANGLEJS +BANGLEJS2 +MDBT42Q +NUCLEOF401RE +NUCLEOF411RE +STM32VLDISCOVERY +STM32F4DISCOVERY +STM32L496GDISCOVERY +MICROBIT2 +ESP8266_BOARD +ESP8266_4MB +ESP32 +WIO_LTE +RAK5010 +SMARTIBOT +MICROBIT1 +EOF +THREADS=1 +echo $BOARDS | xargs -I{} -d " " -P $THREADS scripts/create_zip_board.sh {} +exit 1 cd $DIR sed 's/$/\r/' dist_readme.txt | sed "s/#v##/$VERSION/" > $ZIPDIR/readme.txt diff --git a/scripts/create_zip_board.sh b/scripts/create_zip_board.sh new file mode 100755 index 0000000000..6e7b02cbbc --- /dev/null +++ b/scripts/create_zip_board.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +# This file is part of Espruino, a JavaScript interpreter for Microcontrollers +# +# Copyright (C) 2013 Gordon Williams +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# ---------------------------------------------------------------------------------------- +# Creates a build of espruino for a zip file - some targets have different 'flavours' +# exit 255 allows this to work with xargs +# ---------------------------------------------------------------------------------------- +# + + +cd `dirname $0` +cd .. # Espruino + +if [ "$#" -ne 1 ]; then + echo "Usage:" + echo " scripts/create_zip_board.sh TARGET" + echo "" + echo "Targets are:" + echo "ESPRUINO_1V3 ESPRUINO_1V3_AT ESPRUINO_1V3_WIZ PICO_1V3 PICO_1V3_CC3000 PICO_1V3_WIZ " + echo "ESPRUINOWIFI PUCKJS PIXLJS BANGLEJS BANGLEJS2 MDBT42Q NUCLEOF401RE NUCLEOF411RE STM32VLDISCOVERY" + echo "STM32F4DISCOVERY STM32L496GDISCOVERY MICROBIT2 ESP8266_BOARD ESP8266_4MB ESP32 WIO_LTE RAK5010 SMARTIBOT MICROBIT1" + echo "STM32F3DISCOVERY OLIMEXINO_STM32 HYSTM32_32 HYSTM32_28 HYSTM32_24 RAK8211 RAK8212 RUUVITAG THINGY52 RASPBERRYPI" + exit 255 +fi + +BOARDNAME=$1 +VERSION=`sed -ne "s/^.*JS_VERSION.*\"\(.*\)\"/\1/p" src/jsutils.h | head -1` +echo "VERSION $VERSION" +DIR=`pwd` +ZIPDIR=$DIR/zipcontents + +# We assume all setup has been done by create_zip +OBJDIR=obj_$BOARDNAME +rm -rf $OBJDIR +mkdir $OBJDIR + +echo ------------------------------------------------------ +echo Building Version $VERSION +echo $BOARDNAME +echo ------------------------------------------------------ +EXTRADEFS="OBJDIR=$OBJDIR GENDIR=$OBJDIR " +EXTRANAME= +if [ "$BOARDNAME" == "ESPRUINO_1V3" ]; then + BOARDNAME=ESPRUINOBOARD +fi +if [ "$BOARDNAME" == "ESPRUINO_1V3_AT" ]; then + BOARDNAME=ESPRUINOBOARD + EXTRADEFS+="USE_NET=1 DEFINES=-DNO_VECTOR_FONT=1 BLACKLIST=boards/ESPRUINOBOARD.net.blocklist" + EXTRANAME=_at +fi +if [ "$BOARDNAME" == "ESPRUINO_1V3_WIZ" ]; then + BOARDNAME=ESPRUINOBOARD + EXTRADEFS+="USE_NET=1 WIZNET=1 USE_CRYPTO=0 USE_DEBUGGER=0 USE_TAB_COMPLETE=0 USE_NETWORK_JS=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1' BLACKLIST=boards/ESPRUINOBOARD.net.blocklist" + # we must now disable crypto in order to get WIZnet support in on the Original board + EXTRANAME=_wiznet +fi +if [ "$BOARDNAME" == "PICO_1V3_CC3000" ]; then + BOARDNAME=PICO_R1_3 + EXTRADEFS+="CC3000=1 USE_DEBUGGER=0 USE_NETWORK_JS=0 USE_TV=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1'" + EXTRANAME=_cc3000 +fi +if [ "$BOARDNAME" == "PICO_1V3_WIZ" ]; then + BOARDNAME=PICO_R1_3 + EXTRADEFS+="WIZNET=1 USE_DEBUGGER=0 USE_NETWORK_JS=0 USE_TV=0 DEFINES='-DNO_VECTOR_FONT=1 -DNO_DUMP_HARDWARE_INITIALISATION=1'" + EXTRANAME=_wiznet +fi +if [ "$BOARDNAME" == "PICO_1V3" ]; then + BOARDNAME=PICO_R1_3 +fi + +# actually build +ESP_BINARY_NAME=`python scripts/get_board_info.py $BOARDNAME "common.get_board_binary_name(board)"` +if [ "$BOARDNAME" == "PUCKJS" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "PIXLJS" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "BANGLEJS" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "BANGLEJS2" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "SMARTIBOT" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "MDBT42Q" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD=1 +fi +if [ "$BOARDNAME" == "RUUVITAG" ]; then + ESP_BINARY2_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD_WITH_HEX=1 +fi +if [ "$BOARDNAME" == "THINGY52" ]; then + ESP_BINARY2_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS+=DFU_UPDATE_BUILD_WITH_HEX=1 +fi + +echo "Building $ESP_BINARY_NAME" +echo "EXTRADEFS $EXTRADEFS" +echo +rm -f $BINARY_NAME +if [ "$BOARDNAME" == "ESPRUINOBOARD" ]; then + bash -c "$EXTRADEFS scripts/create_espruino_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } +elif [ "$BOARDNAME" == "PICO_R1_3" ]; then + bash -c "$EXTRADEFS scripts/create_pico_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } +elif [ "$BOARDNAME" == "ESPRUINOWIFI" ]; then + bash -c "$EXTRADEFS scripts/create_espruinowifi_image.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } +else + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make clean" + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } +fi +# rename binary if needed +if [ -n "$EXTRANAME" ]; then + NEW_BINARY_NAME=`basename ${ESP_BINARY_NAME} .bin`$EXTRANAME.bin +else + NEW_BINARY_NAME=${ESP_BINARY_NAME} +fi +# copy... +if [ "$BOARDNAME" == "ESP8266_BOARD" ]; then + tar -C $ZIPDIR -xzf bin/${ESP_BINARY_NAME}.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + # build a combined image + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make combined" || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + cp bin/${ESP_BINARY_NAME}_combined_512.bin $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } +elif [ "$BOARDNAME" == "ESP8266_4MB" ]; then + tar -C $ZIPDIR -xzf bin/${ESP_BINARY_NAME}.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + # build a combined image + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make combined" || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + cp bin/${ESP_BINARY_NAME}_combined_4096.bin $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } +else + echo Copying bin/${ESP_BINARY_NAME} to $ZIPDIR/$NEW_BINARY_NAME + cp bin/${ESP_BINARY_NAME} $ZIPDIR/$NEW_BINARY_NAME || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + if [ "$BOARDNAME" == "ESP32" ]; then + tar -C $ZIPDIR -xzf bin/`basename $ESP_BINARY_NAME .bin`.tgz || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } + fi +fi +# Copy second binary +if [ -n "$ESP_BINARY2_NAME" ]; then + cp bin/${ESP_BINARY2_NAME} $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } +fi + + From 0e0fa8f95d9af473e10645d177ecb93cc4880404 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Feb 2022 08:56:34 +0000 Subject: [PATCH 0006/1183] multi-threaded build --- scripts/create_zip.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/create_zip.sh b/scripts/create_zip.sh index 35713fd393..551f516e47 100755 --- a/scripts/create_zip.sh +++ b/scripts/create_zip.sh @@ -61,18 +61,17 @@ STM32VLDISCOVERY STM32F4DISCOVERY STM32L496GDISCOVERY MICROBIT2 +RAK5010 +SMARTIBOT ESP8266_BOARD ESP8266_4MB ESP32 -WIO_LTE -RAK5010 -SMARTIBOT MICROBIT1 EOF -THREADS=1 +THREADS=16 echo $BOARDS | xargs -I{} -d " " -P $THREADS scripts/create_zip_board.sh {} -exit 1 + cd $DIR sed 's/$/\r/' dist_readme.txt | sed "s/#v##/$VERSION/" > $ZIPDIR/readme.txt From 32f2ae4be2763f1c14bc052e56b31af8aa3f88ac Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Feb 2022 11:02:46 +0000 Subject: [PATCH 0007/1183] misc tweaks --- .gitignore | 14 +++----------- boards/ESPRUINOBOARD.net.blocklist | 12 ++++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 boards/ESPRUINOBOARD.net.blocklist diff --git a/.gitignore b/.gitignore index 6db8fd52a1..ece90db289 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,8 @@ *~ -*.tgz -*.d -*.o -*.elf -/*.hex -/*.app_hex -*.lst -*.srec -*.bin *.pyc -/*.bin.unpadded -/*.zip /gen/* +/bin/* +/obj/* /.vagrant/* /boards/*.html /boards/*.json @@ -64,6 +55,7 @@ gcc-arm-none-eabi* /targetlibs/nrf5x_17/config /targetlibs/nrf5x_17/documentation /targetlibs/raspberrypi +/js /.vscode /CURRENT_BOARD.make /topreadonly diff --git a/boards/ESPRUINOBOARD.net.blocklist b/boards/ESPRUINOBOARD.net.blocklist new file mode 100644 index 0000000000..f9695cbe5a --- /dev/null +++ b/boards/ESPRUINOBOARD.net.blocklist @@ -0,0 +1,12 @@ +[ +{"class":"E","name":"FFT"}, +{"class":"Graphics","name":"drawEllipse"}, +{"class":"Graphics","name":"fillEllipse"}, +{"class":"Graphics","name":"asImage"}, +{"class":"Storage","name":"open"}, +{"class":"StorageFile","name":"read"}, +{"class":"StorageFile","name":"readLine"}, +{"class":"StorageFile","name":"erase"}, +{"class":"StorageFile","name":"getLength"}, +{"class":"StorageFile","name":"write"} +] From 48875120c8be4dbfc7584f7eae4167327043d77d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Feb 2022 11:09:03 +0000 Subject: [PATCH 0008/1183] build dir tweaks --- make/common/NRF5X.make | 4 ++-- make/targets/ESP8266.make | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/make/common/NRF5X.make b/make/common/NRF5X.make index a65b1d9680..8fae122892 100644 --- a/make/common/NRF5X.make +++ b/make/common/NRF5X.make @@ -483,9 +483,9 @@ $(PROJ_NAME).hex: $(PROJ_NAME).app_hex else @echo Merging SoftDevice and Bootloader @# build a DFU settings file we can merge in... family can be NRF52840 or NRF52 - nrfutil settings generate --family $(BOOTLOADER_SETTINGS_FAMILY) --application $(PROJ_NAME).app_hex --app-boot-validation VALIDATE_GENERATED_CRC --application-version 0xff --bootloader-version 0xff --bl-settings-version 2 dfu_settings.hex + nrfutil settings generate --family $(BOOTLOADER_SETTINGS_FAMILY) --application $(PROJ_NAME).app_hex --app-boot-validation VALIDATE_GENERATED_CRC --application-version 0xff --bootloader-version 0xff --bl-settings-version 2 $(OBJDIR)/dfu_settings.hex @echo FIXME - had to set --overlap=replace - python scripts/hexmerge.py --overlap=replace $(SOFTDEVICE) $(NRF_BOOTLOADER) $(PROJ_NAME).app_hex dfu_settings.hex -o $(PROJ_NAME).hex + python scripts/hexmerge.py --overlap=replace $(SOFTDEVICE) $(NRF_BOOTLOADER) $(PROJ_NAME).app_hex $(OBJDIR)/dfu_settings.hex -o $(PROJ_NAME).hex endif else @echo Merging SoftDevice diff --git a/make/targets/ESP8266.make b/make/targets/ESP8266.make index d779f9289f..e74280a5fd 100644 --- a/make/targets/ESP8266.make +++ b/make/targets/ESP8266.make @@ -51,12 +51,12 @@ combined: $(ESP_COMBINED) $(PARTIAL): $(OBJS) $(LINKER_FILE) @echo LD $@ ifdef USE_CRYPTO - $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text libs/crypto/mbedtls/library/sha1.o + $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text $(OBJDIR)/libs/crypto/mbedtls/library/sha1.o ifdef USE_SHA256 - $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text libs/crypto/mbedtls/library/sha256.o + $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text $(OBJDIR)/libs/crypto/mbedtls/library/sha256.o endif ifdef USE_SHA512 - $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text libs/crypto/mbedtls/library/sha512.o + $(Q)$(OBJCOPY) --rename-section .rodata=.irom0.text $(OBJDIR)/libs/crypto/mbedtls/library/sha512.o endif endif $(Q)$(LD) $(OPTIMIZEFLAGS) -nostdlib -Wl,--no-check-sections -Wl,-static -r -o $@ $(OBJS) From a1e952399bcb29317a6d69e902a6e395022f3cdc Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Feb 2022 11:27:58 +0000 Subject: [PATCH 0009/1183] build dir fixes, report create_zip errors in a useful way --- make/targets/ESP32.make | 4 ++-- make/targets/ESP8266.make | 10 +++++----- scripts/create_zip.sh | 1 + scripts/create_zip_board.sh | 19 ++++++++++++++----- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/make/targets/ESP32.make b/make/targets/ESP32.make index 46ac9f21b8..abecc12b99 100644 --- a/make/targets/ESP32.make +++ b/make/targets/ESP32.make @@ -15,11 +15,11 @@ $(PROJ_NAME).bin: $(OBJS) $(ESP_ZIP): $(PROJ_NAME).bin $(Q)rm -rf build/$(basename $(ESP_ZIP)) $(Q)mkdir -p build/$(basename $(ESP_ZIP)) - $(Q)cp $(PROJ_NAME).bin espruino_esp32.bin + $(Q)cp $(PROJ_NAME).bin $(BINDIR)/espruino_esp32.bin @echo "** $(PROJ_NAME).bin uses $$( stat $(STAT_FLAGS) $(PROJ_NAME).bin) bytes of" $(ESP32_FLASH_MAX) "available" @if [ $$( stat $(STAT_FLAGS) $(PROJ_NAME).bin) -gt $$(( $(ESP32_FLASH_MAX) )) ]; then echo "$(PROJ_NAME).bin is too big!"; false; fi $(Q)cp $(ESP_APP_TEMPLATE_PATH)/build/bootloader/bootloader.bin \ - espruino_esp32.bin \ + $(BINDIR)/espruino_esp32.bin \ $(ESP_APP_TEMPLATE_PATH)/build/partitions_espruino.bin \ targets/esp32/README_flash.txt \ build/$(basename $(ESP_ZIP)) diff --git a/make/targets/ESP8266.make b/make/targets/ESP8266.make index e74280a5fd..002ea66851 100644 --- a/make/targets/ESP8266.make +++ b/make/targets/ESP8266.make @@ -14,11 +14,11 @@ # user setting area that sits between the two 256KB partitions, so we can merrily use it for # code. ESP_ZIP = $(PROJ_NAME).tgz -USER1_BIN = espruino_esp8266_user1.bin -USER2_BIN = espruino_esp8266_user2.bin -USER1_ELF = espruino_esp8266_user1.elf -USER2_ELF = espruino_esp8266_user2.elf -PARTIAL = espruino_esp8266_partial.o +USER1_BIN = $(OBJDIR)/espruino_esp8266_user1.bin +USER2_BIN = $(OBJDIR)/espruino_esp8266_user2.bin +USER1_ELF = $(OBJDIR)/espruino_esp8266_user1.elf +USER2_ELF = $(OBJDIR)/espruino_esp8266_user2.elf +PARTIAL = $(OBJDIR)/espruino_esp8266_partial.o ifdef FLASH_4MB ESP_FLASH_ADDONS = $(ET_DEFAULTS) $(INIT_DATA) $(ET_BLANK) $(BLANK) diff --git a/scripts/create_zip.sh b/scripts/create_zip.sh index 551f516e47..da16f9df01 100755 --- a/scripts/create_zip.sh +++ b/scripts/create_zip.sh @@ -67,6 +67,7 @@ ESP8266_BOARD ESP8266_4MB ESP32 MICROBIT1 + EOF THREADS=16 diff --git a/scripts/create_zip_board.sh b/scripts/create_zip_board.sh index 6e7b02cbbc..7f4667972e 100755 --- a/scripts/create_zip_board.sh +++ b/scripts/create_zip_board.sh @@ -31,11 +31,19 @@ if [ "$#" -ne 1 ]; then fi BOARDNAME=$1 + +if [ -z "$BOARDNAME" ]; then + echo "EMPTY BOARDNAME SUPPLIED" + exit +fi + VERSION=`sed -ne "s/^.*JS_VERSION.*\"\(.*\)\"/\1/p" src/jsutils.h | head -1` echo "VERSION $VERSION" DIR=`pwd` ZIPDIR=$DIR/zipcontents +LOGFILE=$ZIPDIR/${BOARDNAME}.error + # We assume all setup has been done by create_zip OBJDIR=obj_$BOARDNAME rm -rf $OBJDIR @@ -115,14 +123,14 @@ echo "EXTRADEFS $EXTRADEFS" echo rm -f $BINARY_NAME if [ "$BOARDNAME" == "ESPRUINOBOARD" ]; then - bash -c "$EXTRADEFS scripts/create_espruino_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } + bash -c "$EXTRADEFS scripts/create_espruino_image_1v3.sh > $LOGFILE 2>&1" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } elif [ "$BOARDNAME" == "PICO_R1_3" ]; then - bash -c "$EXTRADEFS scripts/create_pico_image_1v3.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } + bash -c "$EXTRADEFS scripts/create_pico_image_1v3.sh > $LOGFILE 2>&1" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } elif [ "$BOARDNAME" == "ESPRUINOWIFI" ]; then - bash -c "$EXTRADEFS scripts/create_espruinowifi_image.sh" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } + bash -c "$EXTRADEFS scripts/create_espruinowifi_image.sh > $LOGFILE 2>&1" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } else - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make clean" - bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make clean > $LOGFILE 2>&1" + bash -c "$EXTRADEFS RELEASE=1 BOARD=$BOARDNAME make > $LOGFILE 2>&1" || { echo "Build of '$EXTRADEFS BOARD=$BOARDNAME make' failed" ; exit 255; } fi # rename binary if needed if [ -n "$EXTRANAME" ]; then @@ -153,4 +161,5 @@ if [ -n "$ESP_BINARY2_NAME" ]; then cp bin/${ESP_BINARY2_NAME} $ZIPDIR || { echo "Build of 'BOARD=$BOARDNAME make' failed" ; exit 255; } fi +rm $LOGFILE From 08e794c37a4d393599faca586727bf671857df86 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Feb 2022 11:35:22 +0000 Subject: [PATCH 0010/1183] show build errors --- scripts/create_zip.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/create_zip.sh b/scripts/create_zip.sh index da16f9df01..30f33c056d 100755 --- a/scripts/create_zip.sh +++ b/scripts/create_zip.sh @@ -72,6 +72,16 @@ EOF THREADS=16 echo $BOARDS | xargs -I{} -d " " -P $THREADS scripts/create_zip_board.sh {} +rm -rf obj_* +echo =========================================================== +if [ -n "$(ls $ZIPDIR/*.error 2>/dev/null)" ] +then + echo "BUILDS FAILED:" + ls -1 $ZIPDIR/*.error +else + echo "No errors!" +fi +echo =========================================================== cd $DIR From fd8f6751933b4304c89c680bf49cb4f27e11f370 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 4 Mar 2022 11:54:10 +0000 Subject: [PATCH 0011/1183] more work on jit - will now parse 1+2 --- Makefile | 5 + src/jsjit.c | 304 +++++++++++++++++++++++++++++++++++++------ src/jsjit.h | 2 + src/jsjitc.c | 49 +++++++ src/jsjitc.h | 22 ++++ targets/linux/main.c | 44 +++++++ 6 files changed, 389 insertions(+), 37 deletions(-) create mode 100644 src/jsjitc.c diff --git a/Makefile b/Makefile index b2a299e9b0..c7b0e47930 100755 --- a/Makefile +++ b/Makefile @@ -644,6 +644,11 @@ ifeq ($(USE_TENSORFLOW),1) include make/misc/tensorflow.make endif +ifeq ($(USE_JIT),1) + DEFINES += -DESPR_JIT + SOURCES += src/jsjit.c src/jsjitc.c +endif + endif # BOOTLOADER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DON'T USE STUFF ABOVE IN BOOTLOADER diff --git a/src/jsjit.c b/src/jsjit.c index 74a2fb8d7d..643158ad84 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -12,94 +12,323 @@ * ---------------------------------------------------------------------------- */ +//#ifdef ESPR_JIT + #include "jsjit.h" #include "jsjitc.h" +#define JSP_ASSERT_MATCH(TOKEN) { assert(lex->tk==(TOKEN));jslGetNextToken(); } // Match where if we have the wrong token, it's an internal error +#define JSP_MATCH(TOKEN) if (!jslMatch((TOKEN))) return; // Match where the user could have given us the wrong token +#define JSJ_PARSING true + JsVar *jsjStringPool; +// ---------------------------------------------------------------------------- +void jsjUnaryExpression(); +// ---------------------------------------------------------------------------- + +void jsjPopAsVar(int reg) { + JsjValueType varType = jsjcPop(reg); + if (varType==JSJVT_JSVAR) return; + if (varType==JSJVT_INT) { + if (reg) jsjcMov(reg, 0); + jsjcCall(jsvNewFromInteger); // FIXME: what about clobbering r1-r3? + if (reg) jsjcMov(0, reg); + return; + } + assert(0); +} -NO_INLINE void jsjFactor() { +void jsjFactor() { if (lex->tk==LEX_ID) { const char *v = jslGetTokenValueAsString(); - int offset = jsvGetStringLength(jsjStringPool); + uint32_t offset = (uint32_t)jsvGetStringLength(jsjStringPool); jsvAppendStringBuf(jsjStringPool, v, strlen(v)+1); // include trailing 0 JSP_ASSERT_MATCH(LEX_ID); jsjcLiteral32(1, offset); // TODO: store token values jsjcCall(jspGetNamedVariable); - return a; + jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk==LEX_INT) { - int64_t v = stringToInt(jslGetTokenValueAsString())); + int64_t v = stringToInt(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_INT); - jsjcLiteral64(1, (uint64_t)v); - jsjcCall(jsvNewFromLongInteger); // TODO: could do 32 bit here - return v; + if (v>>32) { + jsjcLiteral64(0, (uint64_t)v); + jsjcCall(jsvNewFromLongInteger); + } else { + jsjcLiteral32(0, (uint32_t)v); + jsjcCall(jsvNewFromInteger); + } + jsjcPush(0, JSJVT_JSVAR); // FIXME - push an int and convert later } else if (lex->tk==LEX_FLOAT) { double v = stringToFloat(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_FLOAT); - jsjcLiteral64(1, *((uint64_t*)&v)); - jsjcCall(jsvNewFromFloat); + jsjcLiteral64(0, *((uint64_t*)&v)); + jsjcCall(jsvNewFromFloat); + jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk=='(') { JSP_ASSERT_MATCH('('); - if (!jspCheckStackPosition()) return 0; // Just parse a normal expression (which can include commas) - JsVar *a = jspeExpression(); - if (!JSP_SHOULDNT_PARSE) JSP_MATCH_WITH_RETURN(')',a); - return a; - } else if (lex->tk==LEX_R_TRUE) { - JSP_ASSERT_MATCH(LEX_R_TRUE); - jsjcLiteral32(1, 1); - jsjcCall(jsvNewFromBool); - } else if (lex->tk==LEX_R_FALSE) { - JSP_ASSERT_MATCH(LEX_R_FALSE); - jsjcLiteral32(1, 0); + //JsVar *a = jsjExpression(); // FIXME + JSP_MATCH(')'); + } else if (lex->tk==LEX_R_TRUE || lex->tk==LEX_R_FALSE) { + jsjcLiteral32(0, lex->tk==LEX_R_TRUE); + JSP_ASSERT_MATCH(lex->tk); jsjcCall(jsvNewFromBool); + jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk==LEX_R_NULL) { JSP_ASSERT_MATCH(LEX_R_NULL); - jsjcLiteral32(1, JSV_NULL); + jsjcLiteral32(0, JSV_NULL); jsjcCall(jsvNewWithFlags); + jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk==LEX_R_UNDEFINED) { JSP_ASSERT_MATCH(LEX_R_UNDEFINED); - jsjcLiteral32(1, 0); + jsjcLiteral32(0, 0); + jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk==LEX_STR) { JsVar *a = jslGetTokenValueAsVar(); JSP_ASSERT_MATCH(LEX_STR); - int offset = jsvGetStringLength(jsjStringPool); - int len = jsvGetStringLength(a); + int offset = (int)jsvGetStringLength(jsjStringPool); + int len = (int)jsvGetStringLength(a); jsvAppendStringVarComplete(jsjStringPool, a); jsvUnLock(a); - jsjcLiteral32(1, len); - jsjcLiteral32(2, offset); + jsjcLiteral32(0, len); + jsjcLiteral32(1, offset); jsjcCall(jsvNewStringOfLength); + jsjcPush(0, JSJVT_JSVAR); }/* else if (lex->tk=='{') { if (!jspCheckStackPosition()) return 0; - return jspeFactorObject(); + return jsjFactorObject(); } else if (lex->tk=='[') { if (!jspCheckStackPosition()) return 0; - return jspeFactorArray(); + return jsjFactorArray(); } else if (lex->tk==LEX_R_FUNCTION) { if (!jspCheckStackPosition()) return 0; JSP_ASSERT_MATCH(LEX_R_FUNCTION); - return jspeFunctionDefinition(true); + return jsjFunctionDefinition(true); } else if (lex->tk==LEX_R_THIS) { JSP_ASSERT_MATCH(LEX_R_THIS); return jsvLockAgain( execInfo.thisVar ? execInfo.thisVar : execInfo.root ); } else if (lex->tk==LEX_R_DELETE) { if (!jspCheckStackPosition()) return 0; - return jspeFactorDelete(); + return jsjFactorDelete(); } else if (lex->tk==LEX_R_TYPEOF) { if (!jspCheckStackPosition()) return 0; - return jspeFactorTypeOf(); + return jsjFactorTypeOf(); } */else if (lex->tk==LEX_R_VOID) { JSP_ASSERT_MATCH(LEX_R_VOID); - // jsjUnaryExpression(); // FIXME + jsjUnaryExpression(); jsjcCall(jsvUnLock); - return 0; + jsjcLiteral32(0, 0); + jsjcPush(0, JSJVT_JSVAR); + } else JSP_MATCH(LEX_EOF); +} + +void jsjFactorFunctionCall() { + jsjFactor(); + // jsjFactorMember(); // FIXME +} + +void __jsjPostfixExpression() { + while (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { + int op = lex->tk; + JSP_ASSERT_MATCH(op); + + /*JsVar *one = jsvNewFromInteger(1); + JsVar *oldValue = jsvAsNumberAndUnLock(jsvSkipName(a)); // keep the old value (but convert to number) + JsVar *res = jsvMathsOpSkipNames(oldValue, one, op==LEX_PLUSPLUS ? '+' : '-'); + jsvUnLock(one); + + // in-place add/subtract + jsvReplaceWith(a, res); + jsvUnLock(res); + // but then use the old value + jsvUnLock(a); + a = oldValue;*/ } - JSP_MATCH(LEX_EOF); - return 0; +} + +void jsjPostfixExpression() { + if (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { + int op = lex->tk; + JSP_ASSERT_MATCH(op); + /* + a = jspePostfixExpression(); + if (JSP_SHOULD_EXECUTE) { + JsVar *one = jsvNewFromInteger(1); + JsVar *res = jsvMathsOpSkipNames(a, one, op==LEX_PLUSPLUS ? '+' : '-'); + jsvUnLock(one); + // in-place add/subtract + jsvReplaceWith(a, res); + jsvUnLock(res); + } + *//* + jsjPostfixExpression(); + jsjcLiteral32(0, 1); + jsjcCall(jsvNewFromInteger); + jsjcMov(0, 1); + jsjcMov(0, 4); // preserve 'one' for call + jsjcPop(1); + jsjcMov(0, 5); // preserve 'a' for call + jsjcLiteral32(3, op==LEX_PLUSPLUS ? '+' : '-'); + jsjcCall(jsvMathsOpSkipNames); + jsjcMov(4, 0); // one -> r0 + jsjcCall(jsvUnLock); // jsvUnLock(one) + jsjcMov(0, 1); // res -> r1 + jsjcMov(0, 4); // res -> r0 + jsjcMov(5, 0); // a -> r0 + jsjcCall(jsvReplaceWith); + jsjcMov(4, 0); // res -> r0 + jsjcCall(jsvUnLock); // jsvUnLock(res) + */ + } else + jsjFactorFunctionCall(); + __jsjPostfixExpression(); +} + +void jsjUnaryExpression() { + if (lex->tk=='!' || lex->tk=='~' || lex->tk=='-' || lex->tk=='+') { + short tk = lex->tk; + JSP_ASSERT_MATCH(tk); +/* if (tk=='!') { // logical not + return jsvNewFromBool(!jsvGetBoolAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); + } else if (tk=='~') { // bitwise not + return jsvNewFromInteger(~jsvGetIntegerAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); + } else if (tk=='-') { // unary minus + return jsvNegateAndUnLock(jsjUnaryExpression()); // names already skipped + } else if (tk=='+') { // unary plus (convert to number) + JsVar *v = jsvSkipNameAndUnLock(jsjUnaryExpression()); + JsVar *r = jsvAsNumber(v); // names already skipped + jsvUnLock(v); + return r; + }*/ + assert(0); + } else + jsjPostfixExpression(); +} + +// Get the precedence of a BinaryExpression - or return 0 if not one +unsigned int jsjGetBinaryExpressionPrecedence(int op) { + switch (op) { + case LEX_OROR: return 1; break; + case LEX_ANDAND: return 2; break; + case '|' : return 3; break; + case '^' : return 4; break; + case '&' : return 5; break; + case LEX_EQUAL: + case LEX_NEQUAL: + case LEX_TYPEEQUAL: + case LEX_NTYPEEQUAL: return 6; + case LEX_LEQUAL: + case LEX_GEQUAL: + case '<': + case '>': + case LEX_R_INSTANCEOF: return 7; + case LEX_R_IN: return (execInfo.execute&EXEC_FOR_INIT)?0:7; + case LEX_LSHIFT: + case LEX_RSHIFT: + case LEX_RSHIFTUNSIGNED: return 8; + case '+': + case '-': return 9; + case '*': + case '/': + case '%': return 10; + default: return 0; + } +} + +void __jsjBinaryExpression(unsigned int lastPrecedence) { + /* This one's a bit strange. Basically all the ops have their own precedence, it's not + * like & and | share the same precedence. We don't want to recurse for each one, + * so instead we do this. + * + * We deal with an expression in recursion ONLY if it's of higher precedence + * than the current one, otherwise we stick in the while loop. + */ + unsigned int precedence = jsjGetBinaryExpressionPrecedence(lex->tk); + while (precedence && precedence>lastPrecedence) { + int op = lex->tk; + JSP_ASSERT_MATCH(op); + + // if we have short-circuit ops, then if we know the outcome + // we don't bother to execute the other op. Even if not + // we need to tell mathsOp it's an & or | + /* if (op==LEX_ANDAND || op==LEX_OROR) { + bool aValue = jsvGetBoolAndUnLock(jsvSkipName(a)); + if ((!aValue && op==LEX_ANDAND) || + (aValue && op==LEX_OROR)) { + // use first argument (A) + JSP_SAVE_EXECUTE(); + jspSetNoExecute(); + jsvUnLock(__jsjBinaryExpression(jsjUnaryExpression(),precedence)); + JSP_RESTORE_EXECUTE(); + } else { + // use second argument (B) + jsvUnLock(a); + a = __jsjBinaryExpression(jsjUnaryExpression(),precedence); + } + } else*/ { // else it's a more 'normal' logical expression - just use Maths + jsjUnaryExpression(); + __jsjBinaryExpression(precedence); + /* + if (op==LEX_R_IN) { + JsVar *av = jsvSkipName(a); // needle + JsVar *bv = jsvSkipName(b); // haystack + if (jsvHasChildren(bv)) { // search keys, NOT values + av = jsvAsArrayIndexAndUnLock(av); + JsVar *varFound = jspGetVarNamedField( bv, av, true); + jsvUnLock2(a,varFound); + a = jsvNewFromBool(varFound!=0); + } else { // else maybe it's a fake object... + const JswSymList *syms = jswGetSymbolListForObjectProto(bv); + if (syms) { + JsVar *varFound = 0; + char nameBuf[JSLEX_MAX_TOKEN_LENGTH]; + if (jsvGetString(av, nameBuf, sizeof(nameBuf)) < sizeof(nameBuf)) + varFound = jswBinarySearch(syms, bv, nameBuf); + bool found = varFound!=0; + jsvUnLock2(a, varFound); + if (!found && jsvIsArrayBuffer(bv)) { + JsVarFloat f = jsvGetFloat(av); // if not a number this will be NaN, f==floor(f) fails + if (f==floor(f) && f>=0 && f r1 + jsjcMov(0, 5); // b -> r5 (for unlock later) + jsjPopAsVar(0); // a -> r0 + jsjcMov(0, 4); // a -> r4 (for unlock later) + jsjcLiteral32(2, op); + jsjcCall(jsvMathsOpSkipNames); + jsjcPush(0, JSJVT_JSVAR); // push result + jsjcMov(5, 1); // b -> r1 + jsjcMov(4, 0); // a -> r0 + jsjcCall(jsvUnLock2); + } + } + precedence = jsjGetBinaryExpressionPrecedence(lex->tk); + } +} + +void jsjBinaryExpression() { + jsjUnaryExpression(); + __jsjBinaryExpression(0); +} + +void jsjBlockOrStatement() { + jsjBinaryExpression(); // FIXME } JsVar *jsjParse() { - jsjFactor(); + while (JSJ_PARSING && lex->tk != LEX_EOF) { + jsjBlockOrStatement(); + } return 0; } @@ -120,9 +349,10 @@ JsVar *jsjEvaluate(const char *str) { if (!evCode) return 0; JsVar *v = 0; if (!jsvIsMemoryFull()) - v = jsjEvaluateVar(evCode,); + v = jsjEvaluateVar(evCode); jsvUnLock(evCode); return v; } +//#endif /*#ifdef ESPR_JIT*/ diff --git a/src/jsjit.h b/src/jsjit.h index 2c63be7272..183729f2cb 100644 --- a/src/jsjit.h +++ b/src/jsjit.h @@ -11,6 +11,7 @@ * Recursive descent JIT * ---------------------------------------------------------------------------- */ +#ifdef ESPR_JIT #ifndef JSJIT_H_ #define JSJIT_H_ @@ -19,3 +20,4 @@ JsVar *jsjEvaluate(const char *str); #endif /* JSJIT_H_ */ +#endif /* ESPR_JIT */ diff --git a/src/jsjitc.c b/src/jsjitc.c new file mode 100644 index 0000000000..23df830d01 --- /dev/null +++ b/src/jsjitc.c @@ -0,0 +1,49 @@ +/* + * This file is part of Espruino, a JavaScript interpreter for Microcontrollers + * + * Copyright (C) 2013 Gordon Williams + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * ---------------------------------------------------------------------------- + * Recursive descent JIT + * ---------------------------------------------------------------------------- + */ +#ifdef ESPR_JIT +#include "jsjitc.h" +#include "jsinteractive.h" + +void jsjcLiteral32(int reg, uint32_t data) { + jsiConsolePrintf("L32 r%d,0x%08x\n", reg,data); +} + +void jsjcLiteral64(int reg, uint64_t data) { + jsjcLiteral32(reg, (uint32_t)(data>>32)); + jsjcLiteral32(reg+1, (uint32_t)data); +} + +#ifdef DEBUG +void _jsjcCall(void *c, const char *name) { + jsiConsolePrintf("CALL 0x%08x %s\n", (uint32_t)c, name); +#else +void jsjcCall(void *c) { + jsiConsolePrintf("CALL 0x%08x\n", (uint32_t)c); +#endif +} + +void jsjcMov(int regFrom, int regTo) { + jsiConsolePrintf("MOV r%d r%d\n", regFrom, regTo); +} + +void jsjcPush(int reg, JsjValueType type) { + jsiConsolePrintf("PUSH r%d\n", reg); +} + +JsjValueType jsjcPop(int reg) { + jsiConsolePrintf("POP r%d\n", reg); + return JSJVT_JSVAR; // FIXME +} + +#endif /* ESPR_JIT */ diff --git a/src/jsjitc.h b/src/jsjitc.h index 033784b40e..2241d42fb6 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -11,13 +11,35 @@ * Recursive descent JIT * ---------------------------------------------------------------------------- */ +#ifdef ESPR_JIT #ifndef JSJITC_H_ #define JSJITC_H_ +#include "jsutils.h" #include "jsjit.h" +typedef enum { + JSJVT_INT, + JSJVT_JSVAR +} JsjValueType; + +// Add 32 bit literal void jsjcLiteral32(int reg, uint32_t data); +// Add 64 bit literal in reg,reg+1 void jsjcLiteral64(int reg, uint64_t data); +// Call a function +#ifdef DEBUG +void _jsjcCall(void *c, const char *name); +#define jsjcCall(c) _jsjcCall(c, STRINGIFY(c)) +#else void jsjcCall(void *c); +#endif +// Move one register to another +void jsjcMov(int regFrom, int regTo); +// Push a register onto the stack +void jsjcPush(int reg, JsjValueType type); +// Pop off teh stack to a register +JsjValueType jsjcPop(int reg); #endif /* JSJIT_H_ */ +#endif /* ESPR_JIT */ diff --git a/targets/linux/main.c b/targets/linux/main.c index 2f8a7bfeab..2e038bc0a0 100644 --- a/targets/linux/main.c +++ b/targets/linux/main.c @@ -16,6 +16,10 @@ #include "jsinteractive.h" #include "jswrapper.h" +#ifdef ESPR_JIT +#include "jsjit.h" +#endif + #define TEST_DIR "tests/" #define CMD_NAME "espruino" @@ -276,6 +280,41 @@ bool run_all_tests() { return rc; } +#ifdef ESPR_JIT +bool run_jit_tests() { + jshInit(); + jswHWInit(); + jsvInit(0); + jsiInit(false /* do not autoload!!! */); + + addNativeFunction("quit", nativeQuit); + addNativeFunction("interrupt", nativeInterrupt); + + JsVar *v = jsjEvaluate("1+2"); + jsiConsolePrintf("RESULT : %j\n", v); + jsvUnLock(v); + bool pass = true; + + warning("BEFORE: %d Memory Records Used", jsvGetMemoryUsage()); + // jsvTrace(execInfo.root, 0); + jsiKill(); + warning("AFTER: %d Memory Records Used", jsvGetMemoryUsage()); + jsvGarbageCollect(); + unsigned int unfreed = jsvGetMemoryUsage(); + warning("AFTER GC: %d Memory Records Used (should be 0!)", unfreed); + jsvShowAllocated(); + jsvKill(); + jshKill(); + + if (unfreed) { + warning("FAIL because of unfreed memory."); + pass = false; + } + + return pass; +} +#endif + bool run_memory_test(const char *fn, int vars) { unsigned int i; unsigned int min = 20; @@ -429,6 +468,11 @@ int main(int argc, char **argv) { die("Expecting an extra 2 arguments\n"); bool ok = run_memory_test(argv[i + 1], atoi(argv[i + 2])); exit(ok ? 0 : 1); +#ifdef ESPR_JIT + } else if (!strcmp(a, "--test-jit")) { + bool ok = run_jit_tests(); + exit(ok ? 0 : 1); +#endif } else { warning("Unknown Argument %s", a); show_help(); From 5e3104b71111de8e471d9396f5b1ef88a35a5652 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 4 Mar 2022 20:10:32 +0000 Subject: [PATCH 0012/1183] create binary out --- src/jsjitc.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/src/jsjitc.c b/src/jsjitc.c index 23df830d01..4466f079d3 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -10,13 +10,52 @@ * ---------------------------------------------------------------------------- * Recursive descent JIT * ---------------------------------------------------------------------------- + + https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions?lang=en + https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf */ #ifdef ESPR_JIT #include "jsjitc.h" #include "jsinteractive.h" +#define DEBUG_JIT jsiConsolePrintf + +void jsjcEmit16(uint16_t v) { + DEBUG_JIT("> %04x\n", v); +} + +void jsjcLiteral8(uint8_t reg, uint8_t data) { + assert(reg<8); + // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 + int n = 0b0010000000000000 | (reg<<8) | data; + jsjcEmit16(n); +} + +void jsjcLiteral16(uint8_t reg, bool hi16, uint16_t data) { + assert(reg<16); + // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 + int imm4,i,imm3,imm8; + imm4 = (data>>12)&15; + i = (data>>11)&1; + imm3 = (data>>8)&7; + imm8 = data&255; + jsjcEmit16(0b1111001001000000 | (hi16?(1<<7):0)| (i<<10) | imm4); + jsjcEmit16((imm3<<12) | imm8 | (reg<<8)); +} + void jsjcLiteral32(int reg, uint32_t data) { - jsiConsolePrintf("L32 r%d,0x%08x\n", reg,data); + DEBUG_JIT("L32 r%d,0x%08x\n", reg,data); + // bit shifted 8 bits? https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Immediate-constants/Encoding?lang=en + // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/MOVT + if (data<256) { + jsjcLiteral8(reg, (uint8_t)data); + } else if (data<65536) { + jsjcLiteral16(reg, false, (uint16_t)data); + } else { + // FIXME - what about signed values? + jsjcLiteral16(reg, false, (uint16_t)data); + jsjcLiteral16(reg, true, (uint16_t)(data>>16)); + } } void jsjcLiteral64(int reg, uint64_t data) { @@ -26,23 +65,29 @@ void jsjcLiteral64(int reg, uint64_t data) { #ifdef DEBUG void _jsjcCall(void *c, const char *name) { - jsiConsolePrintf("CALL 0x%08x %s\n", (uint32_t)c, name); + DEBUG_JIT("CALL 0x%08x %s\n", (uint32_t)c, name); #else void jsjcCall(void *c) { - jsiConsolePrintf("CALL 0x%08x\n", (uint32_t)c); + DEBUG_JIT("CALL 0x%08x\n", (uint32_t)c); #endif + jsjcLiteral32(7, (uint32_t)c); // save address to r7 + jsjcEmit16(0b0100011110000000 | (7<<3)); // BLX reg 7 + } void jsjcMov(int regFrom, int regTo) { - jsiConsolePrintf("MOV r%d r%d\n", regFrom, regTo); + DEBUG_JIT("MOV r%d r%d\n", regFrom, regTo); + jsjcEmit16(0b0100011000000000 | ((regTo&8)?128:0) | (regFrom<<3) | (regTo&7)); } void jsjcPush(int reg, JsjValueType type) { - jsiConsolePrintf("PUSH r%d\n", reg); + DEBUG_JIT("PUSH r%d\n", reg); + jsjcEmit16(0b1011010000000000 | (1< Date: Sun, 10 Apr 2022 11:24:47 +0200 Subject: [PATCH 0013/1183] document up/down swipe --- libs/banglejs/jswrap_bangle.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 3ecc168701..acfd4e4ddd 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -336,10 +336,11 @@ to decode `gesture` from a number into a string. "type" : "event", "class" : "Bangle", "name" : "swipe", - "params" : [["direction","int","`-1` for left, `1` for right"]], + "params" : [["directionLR","int","`-1` for left, `1` for right, `0` for up/down], + ["directionUD","int","`-1` for up, `1` for down", `0` for left/right]], "ifdef" : "BANGLEJS" } -Emitted when a swipe on the touchscreen is detected (a movement from left->right, or right->left) +Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down ) */ /*JSON{ "type" : "event", From f5c875364ab88775f8aa83e4c749a2a941366d9d Mon Sep 17 00:00:00 2001 From: BartS23 <10829389+BartS23@users.noreply.github.com> Date: Sun, 10 Apr 2022 11:34:43 +0200 Subject: [PATCH 0014/1183] Add missing "code"-close --- libs/banglejs/jswrap_bangle.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index acfd4e4ddd..24550473a5 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -5135,6 +5135,7 @@ you could make all clocks start the launcher with a swipe by using: Bangle.on("swipe", Bangle.swipeHandler); }; })(); +``` The first argument can also be an object, in which case more options can be specified: From 1ace43eb16ed9d5f8dd26cbc37ba8ea7cb62a412 Mon Sep 17 00:00:00 2001 From: BartS23 <10829389+BartS23@users.noreply.github.com> Date: Sun, 10 Apr 2022 11:44:08 +0200 Subject: [PATCH 0015/1183] Parameter 2 specified. --- libs/banglejs/jswrap_bangle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 24550473a5..647cd10bab 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -337,10 +337,10 @@ to decode `gesture` from a number into a string. "class" : "Bangle", "name" : "swipe", "params" : [["directionLR","int","`-1` for left, `1` for right, `0` for up/down], - ["directionUD","int","`-1` for up, `1` for down", `0` for left/right]], + ["directionUD","int","`-1` for up, `1` for down", `0` for left/right (Bangle.js 2 only)]], "ifdef" : "BANGLEJS" } -Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down ) +Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down ) */ /*JSON{ "type" : "event", From b01e9d814a748349a05bce9666b6e18d035dc850 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 19 Apr 2022 15:09:44 +0100 Subject: [PATCH 0016/1183] fix build after https://github.com/espruino/Espruino/pull/2180 --- libs/banglejs/jswrap_bangle.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 647cd10bab..944ef0a624 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -336,11 +336,13 @@ to decode `gesture` from a number into a string. "type" : "event", "class" : "Bangle", "name" : "swipe", - "params" : [["directionLR","int","`-1` for left, `1` for right, `0` for up/down], - ["directionUD","int","`-1` for up, `1` for down", `0` for left/right (Bangle.js 2 only)]], + "params" : [["directionLR","int","`-1` for left, `1` for right, `0` for up/down"], + ["directionUD","int","`-1` for up, `1` for down, `0` for left/right (Bangle.js 2 only)"]], "ifdef" : "BANGLEJS" } -Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down ) +Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down) + +Bangle.js 1 is only capable of detecting left/right swipes as it only contains a 2 zone touchscreen. */ /*JSON{ "type" : "event", From 2854fc15b3c564c58d7aa2a396e4f338587af3e9 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 20 Apr 2022 00:23:00 +0200 Subject: [PATCH 0017/1183] Update E_showMenu_Q3.js Recheck string wrapping after font change. --- libs/js/banglejs/E_showMenu_Q3.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 98b94e2dbc..5821fafa19 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -103,7 +103,10 @@ pad += 16; } var l = g.wrapString(keys[idx],r.w-pad); - if (l.length>1) g.setFont("6x15"); + if (l.length>1) { + g.setFont("6x15"); + l = g.wrapString(keys[idx],r.w-pad); + } g.setFontAlign(-1,0).drawString(l.join("\n"), r.x+12, r.y+H/2); }, select : function(idx) { @@ -129,4 +132,4 @@ } show(); return l; -}) \ No newline at end of file +}) From edb0bb3680b72d2e1a3e27a6fce6f64e36b80b94 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 20 Apr 2022 00:31:32 +0200 Subject: [PATCH 0018/1183] Update E_showMenu_Q3.min.js Recheck string wrapping after font change. --- libs/js/banglejs/E_showMenu_Q3.min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 6041fe7b97..69216038b1 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -3,5 +3,5 @@ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); n.scroll=s.scroll;s=E.showScroller(n)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var q=p.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var r={draw:()=>s.draw()},n={h:40,c:m.length, scrollMin:-24,scroll:-24,back:q,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); -g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= -!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) \ No newline at end of file +g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= +!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) From ec09eeedd1ce3a202d354a3c280c928931e45471 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 20 Apr 2022 00:36:15 +0200 Subject: [PATCH 0019/1183] Update E_showMenu_Q3.min.js Corrected shortened variable name. --- libs/js/banglejs/E_showMenu_Q3.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 69216038b1..d68d0b4230 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -3,5 +3,5 @@ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); n.scroll=s.scroll;s=E.showScroller(n)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var q=p.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var r={draw:()=>s.draw()},n={h:40,c:m.length, scrollMin:-24,scroll:-24,back:q,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); -g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= +g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= !b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) From 7b2c745f774a331bc7546539e56c2876fa429ce4 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 20 Apr 2022 00:52:37 +0200 Subject: [PATCH 0020/1183] Update E_showMenu_Q3.min.js Needed to recreate minification due to a replacement of the key name: ``` a=g.wrapString(m[a],b.w-h);1(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, -0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);n.scroll=s.scroll;s=E.showScroller(n)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ -b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); -n.scroll=s.scroll;s=E.showScroller(n)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var q=p.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var r={draw:()=>s.draw()},n={h:40,c:m.length, -scrollMin:-24,scroll:-24,back:q,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); -g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= -!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) +(function(l){function t(a,b){var h=a.step||1;if(void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:function(c,d){if(0>c)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5});c=c*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +0).drawString(a.format?a.format(c):c,d.x+12,d.y+20);g.drawImage(atob(c==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(c){if(!(0>c)){Bangle.buzz(20);a.value=a.min+c*h;if(a.onchange)a.onchange(a.value);n.scroll=s.scroll;s=E.showScroller(n)}}});else{var f=function(){var c=e.x+e.w/2,d=12+e.y+e.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+ +36,w:e.w-48,h:e.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(k):k,c,d);g.fillPoly([c,d-45,c+15,d-30,c-15,d-30]).fillPoly([c,d+45,c+15,d+30,c-15,d+30])},e=Bangle.appRect,k=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);f();Bangle.setUI("updown",function(c){if(c)k-=(c|| +1)*(a.step||1),void 0!==a.min&&ka.max&&(k=a.wrap?a.min:a.max),f();else{a.value=k;if(a.onchange)a.onchange(a.value);n.scroll=s.scroll;s=E.showScroller(n)}})}}if(void 0===l)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=l[""]||{};p.title||(p.title="Menu");var q=p.back||l["< Back"],m=Object.keys(l).filter(function(a){return""!=a&&"< Back"!=a});m.forEach(function(a){a=l[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=function(b){return"\x00"+ +atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g")})});var r={draw:function(){return s.draw()}},n={h:40,c:m.length,scrollMin:-24,scroll:-24,back:q,draw:function(a,b){if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2, +w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,f=l[m[a]];if("object"==typeof f){var e=f.value;f.format&&(e=f.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof f&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);f=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=l[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) From f2e9e4e79208acea6fa08c949c125e32cbd4fa32 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Apr 2022 15:30:44 +0100 Subject: [PATCH 0021/1183] Bangle.js2: Fix issue with E.showMenu creating a global `s` variable --- ChangeLog | 2 ++ libs/js/banglejs/E_showMenu_Q3.js | 1 + libs/js/banglejs/E_showMenu_Q3.min.js | 12 ++++++------ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9602eb2ac..cd49bf9e6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ + Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) E.dumpVariables now dumps variable flags diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 98b94e2dbc..52f8b7fc7a 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -124,6 +124,7 @@ } } }; + var s; function show() { s = E.showScroller(scr); } diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 6041fe7b97..2a8e701278 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function t(a,b){var h=a.step||1;if(void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, -0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);n.scroll=s.scroll;s=E.showScroller(n)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ +(function(k){function u(a,b){var h=a.step||1;if(void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=m.scroll;m=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); -n.scroll=s.scroll;s=E.showScroller(n)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var q=p.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var r={draw:()=>s.draw()},n={h:40,c:m.length, -scrollMin:-24,scroll:-24,back:q,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); -g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(m[a],b.w-h);1a)return q&&q();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(r);else if("object"==typeof b)if("number"==typeof b.value)t(b,m[a]);else{"boolean"==typeof b.value&&(b.value= -!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};s=E.showScroller(n);return r}) \ No newline at end of file +p.scroll=m.scroll;m=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],n=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);n.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>m.draw()},p={h:40,c:n.length, +scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[n[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); +g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);a=g.wrapString(n[a],b.w-h);1a)return r&&r();var b=k[n[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b,n[a]);else{"boolean"==typeof b.value&&(b.value= +!b.value);if(b.onchange)b.onchange(b.value);m.drawItem(a)}}};var m=E.showScroller(p);return t}) \ No newline at end of file From 8cd6487f251c3e2cc83de3349bbac2451cb0740a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Apr 2022 10:31:50 +0100 Subject: [PATCH 0022/1183] Add 'io_buffer_size' option to board.info to allow per-device IO buffer size, and increase index bits to allow >256 entries # Conflicts: # boards/DICKENS.py # boards/DICKENS2.py # boards/DICKENS2R.py --- boards/DICKENS.py | 6 ++++-- scripts/build_platform_config.py | 5 ++++- src/jsdevices.c | 24 +++++++++++++++--------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/boards/DICKENS.py b/boards/DICKENS.py index 15b5e7303f..0b072cdf05 100644 --- a/boards/DICKENS.py +++ b/boards/DICKENS.py @@ -59,8 +59,10 @@ 'name' : "DICKENS", 'link' : [ "" ], 'espruino_page_link' : '', - 'variables' : 2500, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. -# 'bootloader' : 1, + 'default_console' : "EV_BLUETOOTH", + 'variables' : 5000, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'io_buffer_size' : 512, + 'bootloader' : 1, 'binary_name' : 'espruino_%v_dickens.hex', 'build' : { 'optimizeflags' : '-Os', diff --git a/scripts/build_platform_config.py b/scripts/build_platform_config.py index 76f923adaf..2b49e21626 100755 --- a/scripts/build_platform_config.py +++ b/scripts/build_platform_config.py @@ -362,8 +362,11 @@ def codeOutDevicePins(device, definition_name): if 'util_timer_tasks' in board.info: bufferSizeTimer = board.info['util_timer_tasks'] + +if 'io_buffer_size' in board.info: + bufferSizeIO = board.info['io_buffer_size'] -codeOut("#define IOBUFFERMASK "+str(bufferSizeIO-1)+" // (max 255) amount of items in event buffer - events take 5 bytes each") +codeOut("#define IOBUFFERMASK "+str(bufferSizeIO-1)+" // (max 65535) amount of items in event buffer - events take 5 bytes each") codeOut("#define TXBUFFERMASK "+str(bufferSizeTX-1)+" // (max 255) amount of items in the transmit buffer - 2 bytes each") codeOut("#define UTILTIMERTASK_TASKS ("+str(bufferSizeTimer)+") // Must be power of 2 - and max 256") diff --git a/src/jsdevices.c b/src/jsdevices.c index b5e615fbf1..97acfd1505 100644 --- a/src/jsdevices.c +++ b/src/jsdevices.c @@ -73,8 +73,14 @@ Pin jshSerialDeviceCTSPins[JSHSERIALDEVICESTATUSES]; // ---------------------------------------------------------------------------- // IO EVENT BUFFER +#if IOBUFFERMASK<256 +typedef uint8_t IOBufferIdx; +#else +typedef uint16_t IOBufferIdx; +#endif + volatile IOEvent ioBuffer[IOBUFFERMASK+1]; -volatile unsigned char ioHead=0, ioTail=0; +volatile IOBufferIdx ioHead=0, ioTail=0; // ---------------------------------------------------------------------------- @@ -380,7 +386,7 @@ void CALLED_FROM_INTERRUPT jshPushEvent(IOEvent *evt) { * USB and USART data to be coming in at the same time, and it can trip * things up if one IRQ interrupts another. */ jshInterruptOff(); - unsigned char nextHead = (unsigned char)((ioHead+1) & IOBUFFERMASK); + IOBufferIdx nextHead = (IOBufferIdx)((ioHead+1) & IOBUFFERMASK); if (ioTail == nextHead) { jshInterruptOn(); jshIOEventOverflowed(); @@ -393,7 +399,7 @@ void CALLED_FROM_INTERRUPT jshPushEvent(IOEvent *evt) { /// Attempt to push characters onto an existing event static bool jshPushIOCharEventAppend(IOEventFlags channel, char charData) { - unsigned char lastHead = (unsigned char)((ioHead+IOBUFFERMASK) & IOBUFFERMASK); // one behind head + IOBufferIdx lastHead = (IOBufferIdx)((ioHead+IOBUFFERMASK) & IOBUFFERMASK); // one behind head if (ioHead!=ioTail && lastHead!=ioTail) { // we can do this because we only read in main loop, and we're in an interrupt here if (IOEVENTFLAGS_GETTYPE(ioBuffer[lastHead].flags) == channel) { @@ -503,7 +509,7 @@ void CALLED_FROM_INTERRUPT jshPushIOEvent( bool jshPopIOEvent(IOEvent *result) { if (ioHead==ioTail) return false; *result = ioBuffer[ioTail]; - ioTail = (unsigned char)((ioTail+1) & IOBUFFERMASK); + ioTail = (IOBufferIdx)((ioTail+1) & IOBUFFERMASK); return true; } @@ -513,7 +519,7 @@ bool jshPopIOEventOfType(IOEventFlags eventType, IOEvent *result) { if (IOEVENTFLAGS_GETTYPE(ioBuffer[ioTail].flags) == eventType) return jshPopIOEvent(result); // Now check non-top - unsigned char i = ioTail; + IOBufferIdx i = ioTail; while (ioHead!=i) { if (IOEVENTFLAGS_GETTYPE(ioBuffer[i].flags) == eventType) { /* We need IRQ off for this, because if we get data it's possible @@ -522,18 +528,18 @@ bool jshPopIOEventOfType(IOEventFlags eventType, IOEvent *result) { jshInterruptOff(); *result = ioBuffer[i]; // work back and shift all items in out queue - unsigned char n = (unsigned char)((i+IOBUFFERMASK) & IOBUFFERMASK); + IOBufferIdx n = (IOBufferIdx)((i+IOBUFFERMASK) & IOBUFFERMASK); while (n!=ioTail) { ioBuffer[i] = ioBuffer[n]; i = n; - n = (unsigned char)((n+IOBUFFERMASK) & IOBUFFERMASK); + n = (IOBufferIdx)((n+IOBUFFERMASK) & IOBUFFERMASK); } // finally update the tail pointer, and return - ioTail = (unsigned char)((ioTail+1) & IOBUFFERMASK); + ioTail = (IOBufferIdx)((ioTail+1) & IOBUFFERMASK); jshInterruptOn(); return true; } - i = (unsigned char)((i+1) & IOBUFFERMASK); + i = (IOBufferIdx)((i+1) & IOBUFFERMASK); } return false; } From 516ae6011c801a3ded3f088ac1840a106ef69b89 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Apr 2022 10:34:14 +0100 Subject: [PATCH 0023/1183] Bangle.js2: Double input buffer size from 1kb to 2kb --- ChangeLog | 1 + boards/BANGLEJS2.py | 1 + boards/DICKENS.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index cd49bf9e6a..cdc26084fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + Bangle.js2: Double input buffer size from 1kb to 2kb 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/boards/BANGLEJS2.py b/boards/BANGLEJS2.py index 55c5de0de7..2feebae683 100644 --- a/boards/BANGLEJS2.py +++ b/boards/BANGLEJS2.py @@ -25,6 +25,7 @@ # 'default_console_rx' : "D8", # 'default_console_baudrate' : "9600", 'variables' : 12000, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'io_buffer_size' : 512, # How big is the input buffer (in 4 byte words). Default on nRF52 is 256 'bootloader' : 1, 'binary_name' : 'espruino_%v_banglejs2.hex', 'build' : { diff --git a/boards/DICKENS.py b/boards/DICKENS.py index 0b072cdf05..d01ee56d12 100644 --- a/boards/DICKENS.py +++ b/boards/DICKENS.py @@ -61,7 +61,7 @@ 'espruino_page_link' : '', 'default_console' : "EV_BLUETOOTH", 'variables' : 5000, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. - 'io_buffer_size' : 512, + 'io_buffer_size' : 512, # How big is the input buffer (in 4 byte words). Default on nRF52 is 256 'bootloader' : 1, 'binary_name' : 'espruino_%v_dickens.hex', 'build' : { From 14037d78904f4a20bfea35aefb39d0f219d0b63d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Apr 2022 16:08:24 +0100 Subject: [PATCH 0024/1183] Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used --- ChangeLog | 1 + libs/js/banglejs/E_showMenu_Q3.js | 2 +- libs/js/banglejs/E_showMenu_Q3.min.js | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index cdc26084fc..7929e23706 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Double input buffer size from 1kb to 2kb + Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 66b6ba580e..fa53a20c5a 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -85,7 +85,7 @@ back : back, draw : (idx, r) => { if (idx<0) // TITLE - return g.setFont("12x20").setFontAlign(-1,0).drawString( + return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString( menuIcon+" "+options.title, r.x+12, r.y+H-12); g.setColor(g.theme.bg2).fillRect({x:r.x+4, y:r.y+2, w:r.w-8, h:r.h-4, r:5}); g.setColor(g.theme.fg2).setFont("12x20"); diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 855abca9a2..c7e6bd07e6 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -2,6 +2,6 @@ 0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=n.scroll;n=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, -scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n")); -g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return r&&r();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b,m[a]);else{"boolean"== -typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) \ No newline at end of file +scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e, +b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return r&&r();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b, +m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) \ No newline at end of file From e3bd639c03bd410e49fdf1498a64ad552b2b1dc7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Apr 2022 09:24:10 +0100 Subject: [PATCH 0025/1183] Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) --- ChangeLog | 1 + libs/misc/hrm_vc31.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7929e23706..b92b94a60f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used + Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/misc/hrm_vc31.c b/libs/misc/hrm_vc31.c index 1c9d8a30b3..95c0630657 100644 --- a/libs/misc/hrm_vc31.c +++ b/libs/misc/hrm_vc31.c @@ -79,7 +79,7 @@ uint16_t hrmPollInterval = HRM_POLL_INTERVAL_DEFAULT; // in msec, so 20 = 50hz #define VC31B_STATUS_INSAMPLE 0x08 #define VC31B_STATUS_OVERLOAD_MASK 0x07 // 3x bits for each of the 3 channels /* Bit fields for VC31B_REG2 */ -#define VC31B_INT_PS 0x10 +#define VC31B_INT_PS 0x10 // used for wear detection #define VC31B_INT_OV 0x08 // OvloadAdjust #define VC31B_INT_FIFO 0x04 #define VC31B_INT_ENV 0x02 // EnvAdjust @@ -754,7 +754,7 @@ void hrm_sensor_on(HrmCallback callback) { // FIXME SAMPLE RATE. Right now this only changes the period for ENV readings uint8_t _regConfig[17] = { 0x01, // VC31B_REG11 - just enable SLOT0 - VC31B_INT_OV|VC31B_INT_FIFO|VC31B_INT_ENV, // VC31B_REG12 IRQs - was 0x3F + VC31B_INT_OV|VC31B_INT_FIFO|VC31B_INT_ENV|VC31B_INT_PS, // VC31B_REG12 IRQs - was 0x3F 0x8A, // VC31B_REG13 ?? 0x40, // VC31B_REG14 0x40 + FIFO Interrupt length in bottom 6 bits 0x03,0x1F, // VC31B_REG15 (2 bytes) 16 bit counter prescaler From aa6009b0d1e2343cdb474008c4fd3266dc4973c1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Apr 2022 11:35:33 +0100 Subject: [PATCH 0026/1183] Bangle.js2: Allow variable HRM poll rates on Bangle.js 2 VC31B variant Bangle.js2: VC31 HRM variant now polls at 25hz (not 50) --- ChangeLog | 2 ++ libs/banglejs/jswrap_bangle.c | 2 +- libs/misc/hrm.h | 4 ++++ libs/misc/hrm_vc31.c | 9 +++++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index b92b94a60f..306ec59ac1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) + Bangle.js2: Allow variable HRM poll rates on Bangle.js 2 VC31B variant + Bangle.js2: VC31 HRM variant now polls at 25hz (not 50) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 944ef0a624..d92d6ec361 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -2027,7 +2027,7 @@ Set internal options used for gestures, etc... * `lockTimeout` how many milliseconds before the screen locks * `lcdPowerTimeout` how many milliseconds before the screen turns off * `backlightTimeout` how many milliseconds before the screen's backlight turns off -* `hrmPollInterval` set the requested poll interval for the heart rate monitor. On Bangle.js 2 (only 10,20,40,80,160,200 ms are supported, and polling rate may not be exact) +* `hrmPollInterval` set the requested poll interval (in milliseconds) for the heart rate monitor. On Bangle.js 2 only 10,20,40,80,160,200 ms are supported, and polling rate may not be exact. The algorithm's filtering is tuned for 20-40ms poll intervals, so higher/lower intervals may effect the reliability of the BPM reading. Where accelerations are used they are in internal units, where `8192 = 1g` diff --git a/libs/misc/hrm.h b/libs/misc/hrm.h index d672104c8d..e919d725d0 100644 --- a/libs/misc/hrm.h +++ b/libs/misc/hrm.h @@ -15,7 +15,11 @@ #include "jsvar.h" +#ifdef BANGLEJS_Q3 +#define HRM_POLL_INTERVAL_DEFAULT 50 // in msec - 25hz +#else #define HRM_POLL_INTERVAL_DEFAULT 20 // in msec - 50hz +#endif extern uint16_t hrmPollInterval; // in msec, so 20 = 50hz diff --git a/libs/misc/hrm_vc31.c b/libs/misc/hrm_vc31.c index 95c0630657..0e08237bae 100644 --- a/libs/misc/hrm_vc31.c +++ b/libs/misc/hrm_vc31.c @@ -750,9 +750,9 @@ void hrm_sensor_on(HrmCallback callback) { // vc31_w16(VC31A_GREEN_ADJ, 0xe8c3); } if (vcType == VC31B_DEVICE) { - vcbInfo.vcHr02SampleRate = 25; // 1000 / hrmPollInterval; // Hz + vcbInfo.vcHr02SampleRate = 1000 / hrmPollInterval; // Hz // FIXME SAMPLE RATE. Right now this only changes the period for ENV readings - uint8_t _regConfig[17] = { + const uint8_t _regConfig[17] = { 0x01, // VC31B_REG11 - just enable SLOT0 VC31B_INT_OV|VC31B_INT_FIFO|VC31B_INT_ENV|VC31B_INT_PS, // VC31B_REG12 IRQs - was 0x3F 0x8A, // VC31B_REG13 ?? @@ -766,6 +766,7 @@ void hrm_sensor_on(HrmCallback callback) { 0x07,0x16, // 22,23 0x56,0x16,0x00 }; + /* for SPO2 regConfig[0] = 0x47; // enable SLOT1 @@ -785,6 +786,10 @@ void hrm_sensor_on(HrmCallback callback) { vcbInfo.regConfig[9] = 0xE0; //CUR = 80mA//write Hs equal to 1 vcbInfo.regConfig[12] = 0x67; // VC31B_REG22 vcbInfo.regConfig[0] = 0x45; // VC31B_REG11 heart rate calculation - SLOT2(env) and SLOT0(hr) + // Set up HRM speed - from testing, 200=100hz/10ms, 400=50hz/20ms, 800=25hz/40ms + uint16_t divisor = 20 * hrmPollInterval; + vcbInfo.regConfig[4] = divisor>>8; + vcbInfo.regConfig[5] = divisor&255; // write all registers in one go vc31_wx(VC31B_REG11, vcbInfo.regConfig, 17); vcbInfo.regConfig[0] |= 0x80; // actually enable now? From 8d763e7a6eff6b0b80287f749cb0fce37d88b4fe Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Apr 2022 11:51:26 +0100 Subject: [PATCH 0027/1183] oops --- libs/misc/hrm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/misc/hrm.h b/libs/misc/hrm.h index e919d725d0..5e489013ea 100644 --- a/libs/misc/hrm.h +++ b/libs/misc/hrm.h @@ -16,7 +16,7 @@ #ifdef BANGLEJS_Q3 -#define HRM_POLL_INTERVAL_DEFAULT 50 // in msec - 25hz +#define HRM_POLL_INTERVAL_DEFAULT 40 // in msec - 25hz #else #define HRM_POLL_INTERVAL_DEFAULT 20 // in msec - 50hz #endif From de6c3f63e32a8a842c6e162db18ecd98bbf1be78 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 26 Apr 2022 10:43:57 +0100 Subject: [PATCH 0028/1183] Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox --- ChangeLog | 1 + libs/js/banglejs/E_showMenu_F18.js | 8 +++++++- libs/js/banglejs/E_showMenu_F18.min.js | 11 ++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 306ec59ac1..b7e9e0db33 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) Bangle.js2: Allow variable HRM poll rates on Bangle.js 2 VC31B variant Bangle.js2: VC31 HRM variant now polls at 25hz (not 50) + Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index a04d68337c..b476ab8986 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -14,7 +14,13 @@ menuItems.unshift("< Back"); } } - + // auto-fill boolean values with no format + menuItems.forEach(k => { + var item = items[k]; + if ("object" != typeof item) return; + if ("boolean" == typeof item.value && !item.format) + item.format = v=>atob(v?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="); + }); if (!(options instanceof Object)) options = {}; options.fontHeight = options.fontHeight||16; if (options.selected === undefined) diff --git a/libs/js/banglejs/E_showMenu_F18.min.js b/libs/js/banglejs/E_showMenu_F18.min.js index 5af125e6c6..c8a7913fc8 100644 --- a/libs/js/banglejs/E_showMenu_F18.min.js +++ b/libs/js/banglejs/E_showMenu_F18.min.js @@ -1,5 +1,6 @@ -(function(m){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(m){var b=m[""],f=Object.keys(m);b&&(f.splice(f.indexOf(""),1),b.back&&(m["< Back"]=b.back,f.unshift("< Back")));b instanceof Object||(b={});b.fontHeight=b.fontHeight||16;void 0===b.selected&&(b.selected=0);b.fontHeight||(b.fontHeight=6);var q=Bangle.appRect,r=q.x,k=q.x2-11,n=q.y,t=q.y2-20;b.title&&(n+=b.fontHeight+2);var d={lastIdx:0,draw:function(c,a){var p=0|Math.min((t-n)/b.fontHeight,f.length),e= -E.clip(b.selected-(p>>1),0,f.length-p);e!=d.lastIdx&&(c=void 0);d.lastIdx=e;var u=e+pa&&(p=1+a-c));for(;p--;){a=f[e];c=m[a];var l=e==b.selected&&!d.selectEdit;g.setColor(l?g.theme.bgH:g.theme.bg);g.fillRect(r,h,k,h+b.fontHeight-1);g.setColor(l?g.theme.fgH:g.theme.fg);g.setFontAlign(-1, --1);g.drawString(a,r,h);"object"==typeof c&&(a=k,l=c.value,c.format&&(l=c.format(l)),d.selectEdit&&e==b.selected&&(a-=25,g.setColor(g.theme.bgH).fillRect(a-(g.stringWidth(l)+4),h,k,h+b.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",a,h+(b.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(l,a-2,h));g.setColor(g.theme.fg);h+=b.fontHeight;e++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",k+2,40); -g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",k+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",k+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var c=m[f[b.selected]];if("function"==typeof c)c(d);else if("object"==typeof c){if("number"==typeof c.value)d.selectEdit=d.selectEdit?void 0:c;else if("boolean"==typeof c.value&&(c.value=!c.value),c.onchange)c.onchange(c.value);d.draw()}},move:function(c){var a=d.selectEdit; -if(a){a=d.selectEdit;a.value-=(c||1)*(a.step||1);void 0!==a.min&&a.valuea.max&&(a.value=a.wrap?a.min:a.max);if(a.onchange)a.onchange(a.value);d.draw(b.selected,b.selected)}else a=b.selected,b.selected=(c+b.selected+f.length)%f.length,d.draw(Math.min(a,b.selected),Math.max(a,b.selected))}};d.draw();Bangle.setUI("updown",c=>{c?d.move(c):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +(function(l){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(l){var c=l[""],e=Object.keys(l);c&&(e.splice(e.indexOf(""),1),c.back&&(l["< Back"]=c.back,e.unshift("< Back")));e.forEach(b=>{b=l[b];"object"!=typeof b||"boolean"!=typeof b.value||b.format||(b.format=a=>atob(a?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); +c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,k=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(b,a){var p=0|Math.min((t-n)/c.fontHeight,e.length),f=E.clip(c.selected-(p>>1),0,e.length-p);f!=d.lastIdx&&(b=void 0);d.lastIdx=f;var u=f+pa&&(p=1+a-b));for(;p--;){a=e[f];b=l[a];var m=f==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,h,k,h+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(a,r,h);"object"==typeof b&&(a=k,m=b.value,b.format&&(m=b.format(m)),d.selectEdit&&f==c.selected&&(a-=25,g.setColor(g.theme.bgH).fillRect(a-(g.stringWidth(m)+4),h,k,h+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",a,h+ +(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,a-2,h));g.setColor(g.theme.fg);h+=c.fontHeight;f++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",k+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",k+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",k+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var b=l[e[c.selected]];if("function"==typeof b)b(d);else if("object"== +typeof b){if("number"==typeof b.value)d.selectEdit=d.selectEdit?void 0:b;else if("boolean"==typeof b.value&&(b.value=!b.value),b.onchange)b.onchange(b.value);d.draw()}},move:function(b){var a=d.selectEdit;if(a){a=d.selectEdit;a.value-=(b||1)*(a.step||1);void 0!==a.min&&a.valuea.max&&(a.value=a.wrap?a.min:a.max);if(a.onchange)a.onchange(a.value);d.draw(c.selected,c.selected)}else a=c.selected,c.selected=(b+c.selected+e.length)%e.length,d.draw(Math.min(a, +c.selected),Math.max(a,c.selected))}};d.draw();Bangle.setUI("updown",b=>{b?d.move(b):d.select()});return d}Bangle.setUI()}) \ No newline at end of file From 195f0549f8a76bfbace6aec9598431d15db35aa0 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 27 Apr 2022 18:14:47 +0200 Subject: [PATCH 0029/1183] Bangle.js1: show back button for "< Back" item in E.showMenu Simply by pass it on to setUI. This also works for options.back, because that adds a "< Back" item. --- libs/js/banglejs/E_showMenu_F18.js | 8 ++++---- libs/js/banglejs/E_showMenu_F18.min.js | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index b476ab8986..fd9dca4d20 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -5,7 +5,7 @@ Bangle.setUI(); return; } - var options = items[""]; + var options = items[""]; var menuItems = Object.keys(items); if (options) { menuItems.splice(menuItems.indexOf(""),1); @@ -20,7 +20,7 @@ if ("object" != typeof item) return; if ("boolean" == typeof item.value && !item.format) item.format = v=>atob(v?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="); - }); + }); if (!(options instanceof Object)) options = {}; options.fontHeight = options.fontHeight||16; if (options.selected === undefined) @@ -40,7 +40,7 @@ var rows = 0|Math.min((y2-y) / options.fontHeight,menuItems.length); var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled - l.lastIdx = idx; + l.lastIdx = idx; var more = (idx+rows) { + Bangle.setUI({mode:"updown", back:items["< Back"]}, dir => { if (dir) l.move(dir); else l.select(); }); diff --git a/libs/js/banglejs/E_showMenu_F18.min.js b/libs/js/banglejs/E_showMenu_F18.min.js index c8a7913fc8..1b97747104 100644 --- a/libs/js/banglejs/E_showMenu_F18.min.js +++ b/libs/js/banglejs/E_showMenu_F18.min.js @@ -1,6 +1,6 @@ -(function(l){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(l){var c=l[""],e=Object.keys(l);c&&(e.splice(e.indexOf(""),1),c.back&&(l["< Back"]=c.back,e.unshift("< Back")));e.forEach(b=>{b=l[b];"object"!=typeof b||"boolean"!=typeof b.value||b.format||(b.format=a=>atob(a?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); -c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,k=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(b,a){var p=0|Math.min((t-n)/c.fontHeight,e.length),f=E.clip(c.selected-(p>>1),0,e.length-p);f!=d.lastIdx&&(b=void 0);d.lastIdx=f;var u=f+pa&&(p=1+a-b));for(;p--;){a=e[f];b=l[a];var m=f==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,h,k,h+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(a,r,h);"object"==typeof b&&(a=k,m=b.value,b.format&&(m=b.format(m)),d.selectEdit&&f==c.selected&&(a-=25,g.setColor(g.theme.bgH).fillRect(a-(g.stringWidth(m)+4),h,k,h+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",a,h+ -(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,a-2,h));g.setColor(g.theme.fg);h+=c.fontHeight;f++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",k+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",k+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",k+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var b=l[e[c.selected]];if("function"==typeof b)b(d);else if("object"== +(function(k){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(k){var c=k[""],e=Object.keys(k);c&&(e.splice(e.indexOf(""),1),c.back&&(k["< Back"]=c.back,e.unshift("< Back")));e.forEach(b=>{b=k[b];"object"!=typeof b||"boolean"!=typeof b.value||b.format||(b.format=a=>atob(a?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); +c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,l=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(b,a){var p=0|Math.min((t-n)/c.fontHeight,e.length),f=E.clip(c.selected-(p>>1),0,e.length-p);f!=d.lastIdx&&(b=void 0);d.lastIdx=f;var u=f+pa&&(p=1+a-b));for(;p--;){a=e[f];b=k[a];var m=f==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,h,l,h+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(a,r,h);"object"==typeof b&&(a=l,m=b.value,b.format&&(m=b.format(m)),d.selectEdit&&f==c.selected&&(a-=25,g.setColor(g.theme.bgH).fillRect(a-(g.stringWidth(m)+4),h,l,h+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",a,h+ +(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,a-2,h));g.setColor(g.theme.fg);h+=c.fontHeight;f++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",l+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",l+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",l+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var b=k[e[c.selected]];if("function"==typeof b)b(d);else if("object"== typeof b){if("number"==typeof b.value)d.selectEdit=d.selectEdit?void 0:b;else if("boolean"==typeof b.value&&(b.value=!b.value),b.onchange)b.onchange(b.value);d.draw()}},move:function(b){var a=d.selectEdit;if(a){a=d.selectEdit;a.value-=(b||1)*(a.step||1);void 0!==a.min&&a.valuea.max&&(a.value=a.wrap?a.min:a.max);if(a.onchange)a.onchange(a.value);d.draw(c.selected,c.selected)}else a=c.selected,c.selected=(b+c.selected+e.length)%e.length,d.draw(Math.min(a, -c.selected),Math.max(a,c.selected))}};d.draw();Bangle.setUI("updown",b=>{b?d.move(b):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +c.selected),Math.max(a,c.selected))}};d.draw();Bangle.setUI({mode:"updown",back:k["< Back"]},b=>{b?d.move(b):d.select()});return d}Bangle.setUI()}) \ No newline at end of file From 0c8b7c1c20d8873c5932b27d5f498e04d5861a18 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 27 Apr 2022 21:24:38 +0200 Subject: [PATCH 0030/1183] Bangle.js1: add submenu to E.subMenu Only for numeric values with <20 options, otherwise use in-place edit mode --- libs/js/banglejs/E_showMenu_F18.js | 49 +++++++++++++++++++++++--- libs/js/banglejs/E_showMenu_F18.min.js | 13 +++---- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index b476ab8986..0a1e8c5740 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -79,6 +79,10 @@ g.setFontAlign(1,-1); g.drawString(v,xo-2,iy); } + else if (l.main) { // inside submenu + g.setFontAlign(1,-1); + g.drawString(atob(l.main.value==item?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),x2,iy); + } g.setColor(g.theme.fg); iy += options.fontHeight; idx++; @@ -119,12 +123,49 @@ }, select : function() { var item = items[menuItems[options.selected]]; - if ("function" == typeof item) item(l); + if (l.main) { // selected a submenu item + var value = item; + options.selected = l.main.selected; + options.title = l.main.title; + items = l.main.items; + menuItems = l.main.menuItems; + delete l.main; + item = items[menuItems[options.selected]]; + item.value = value; + if (item.onchange) item.onchange(item.value); + g.reset().clearRect(Bangle.appRect); + l.draw(); + } + else if ("function" == typeof item) item(l); else if ("object" == typeof item) { // if a number, go into 'edit mode' - if ("number" == typeof item.value) - l.selectEdit = l.selectEdit?undefined:item; - else { // else just toggle bools + if ("number" == typeof item.value) { + var step = item.step || 1; + if (item.min !== undefined && item.max !== undefined && + ((item.max - item.min) / step) < 20) { + // replace main menu with submenu + l.main = { + items: items, + menuItems: menuItems, + selected: options.selected, + title: options.title, + value: item.value, + }; + options.title = menuItems[options.selected]; + options.selected = 0; + items = []; + for (var v = item.min; v <= item.max; v += step) { + items[item.format ? item.format(v) : v] = v; + if (v == item.value) options.selected = Object.keys(items).length - 1; + } + menuItems = Object.keys(items); + g.reset().clearRect(Bangle.appRect); + l.draw(); + } else { + // too many options for menu: use in-line edit mode + l.selectEdit = l.selectEdit?undefined:item; + } + } else { // else just toggle bools if ("boolean" == typeof item.value) item.value=!item.value; if (item.onchange) item.onchange(item.value); } diff --git a/libs/js/banglejs/E_showMenu_F18.min.js b/libs/js/banglejs/E_showMenu_F18.min.js index c8a7913fc8..867859120e 100644 --- a/libs/js/banglejs/E_showMenu_F18.min.js +++ b/libs/js/banglejs/E_showMenu_F18.min.js @@ -1,6 +1,7 @@ -(function(l){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(l){var c=l[""],e=Object.keys(l);c&&(e.splice(e.indexOf(""),1),c.back&&(l["< Back"]=c.back,e.unshift("< Back")));e.forEach(b=>{b=l[b];"object"!=typeof b||"boolean"!=typeof b.value||b.format||(b.format=a=>atob(a?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); -c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,k=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(b,a){var p=0|Math.min((t-n)/c.fontHeight,e.length),f=E.clip(c.selected-(p>>1),0,e.length-p);f!=d.lastIdx&&(b=void 0);d.lastIdx=f;var u=f+pa&&(p=1+a-b));for(;p--;){a=e[f];b=l[a];var m=f==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,h,k,h+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(a,r,h);"object"==typeof b&&(a=k,m=b.value,b.format&&(m=b.format(m)),d.selectEdit&&f==c.selected&&(a-=25,g.setColor(g.theme.bgH).fillRect(a-(g.stringWidth(m)+4),h,k,h+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",a,h+ -(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,a-2,h));g.setColor(g.theme.fg);h+=c.fontHeight;f++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",k+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",k+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",k+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var b=l[e[c.selected]];if("function"==typeof b)b(d);else if("object"== -typeof b){if("number"==typeof b.value)d.selectEdit=d.selectEdit?void 0:b;else if("boolean"==typeof b.value&&(b.value=!b.value),b.onchange)b.onchange(b.value);d.draw()}},move:function(b){var a=d.selectEdit;if(a){a=d.selectEdit;a.value-=(b||1)*(a.step||1);void 0!==a.min&&a.valuea.max&&(a.value=a.wrap?a.min:a.max);if(a.onchange)a.onchange(a.value);d.draw(c.selected,c.selected)}else a=c.selected,c.selected=(b+c.selected+e.length)%e.length,d.draw(Math.min(a, -c.selected),Math.max(a,c.selected))}};d.draw();Bangle.setUI("updown",b=>{b?d.move(b):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +(function(f){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(f){var b=f[""],e=Object.keys(f);b&&(e.splice(e.indexOf(""),1),b.back&&(f["< Back"]=b.back,e.unshift("< Back")));e.forEach(a=>{a=f[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=c=>atob(c?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});b instanceof Object||(b={});b.fontHeight=b.fontHeight||16;void 0===b.selected&&(b.selected=0); +b.fontHeight||(b.fontHeight=6);var q=Bangle.appRect,r=q.x,m=q.x2-11,p=q.y,t=q.y2-20;b.title&&(p+=b.fontHeight+2);var d={lastIdx:0,draw:function(a,c){var h=0|Math.min((t-p)/b.fontHeight,e.length),k=E.clip(b.selected-(h>>1),0,e.length-h);k!=d.lastIdx&&(a=void 0);d.lastIdx=k;var u=k+hc&&(h=1+c-a));for(;h--;){c=e[k];a=f[c];var n=k==b.selected&&!d.selectEdit;g.setColor(n?g.theme.bgH:g.theme.bg);g.fillRect(r,l,m,l+b.fontHeight-1);g.setColor(n?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(c,r,l);"object"==typeof a?(c=m,n=a.value,a.format&&(n=a.format(n)),d.selectEdit&&k==b.selected&&(c-=25,g.setColor(g.theme.bgH).fillRect(c-(g.stringWidth(n)+4),l,m,l+b.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",c,l+ +(b.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(n,c-2,l)):d.main&&(g.setFontAlign(1,-1),g.drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),m,l));g.setColor(g.theme.fg);l+=b.fontHeight;k++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",m+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",m+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",m+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104, +220,136,220,120,228]);g.flip()},select:function(){var a=f[e[b.selected]];if(d.main){var c=a;b.selected=d.main.selected;b.title=d.main.title;f=d.main.items;e=d.main.menuItems;delete d.main;a=f[e[b.selected]];a.value=c;if(a.onchange)a.onchange(a.value);g.reset().clearRect(Bangle.appRect);d.draw()}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(c=a.step||1,void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/c){d.main={items:f,menuItems:e,selected:b.selected, +title:b.title,value:a.value};b.title=e[b.selected];b.selected=0;f=[];for(var h=a.min;h<=a.max;h+=c)f[a.format?a.format(h):h]=h,h==a.value&&(b.selected=Object.keys(f).length-1);e=Object.keys(f);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var c=d.selectEdit;if(c){c=d.selectEdit;c.value-=(a||1)*(c.step||1);void 0!==c.min&&c.valuec.max&&(c.value=c.wrap?c.min:c.max);if(c.onchange)c.onchange(c.value);d.draw(b.selected,b.selected)}else c=b.selected,b.selected=(a+b.selected+e.length)%e.length,d.draw(Math.min(c,b.selected),Math.max(c,b.selected))}};d.draw();Bangle.setUI("updown",a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file From e455b7ba1de493890a8af13795796e0a9760e8b2 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 27 Apr 2022 22:12:19 +0200 Subject: [PATCH 0031/1183] Bangle.js1: don't make setUI redraw widgets if we replace the back button with a new one --- libs/js/banglejs/Bangle_setUI_F18.js | 19 +++++++++++-------- libs/js/banglejs/Bangle_setUI_F18.min.js | 10 +++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/libs/js/banglejs/Bangle_setUI_F18.js b/libs/js/banglejs/Bangle_setUI_F18.js index 1bfc21ea38..c7d6964bd1 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.js +++ b/libs/js/banglejs/Bangle_setUI_F18.js @@ -3,9 +3,12 @@ if ("object"==typeof mode) { options = mode; mode = options.mode; - } - if (global.WIDGETS && WIDGETS.back) - WIDGETS.back.remove(); + } + var redraw = true; + if (global.WIDGETS && WIDGETS.back) { + redraw = false; + WIDGETS.back.remove(mode && options.back); + } if (Bangle.btnWatches) { Bangle.btnWatches.forEach(clearWatch); delete Bangle.btnWatches; @@ -73,17 +76,17 @@ var touchHandler = (z) => { if (z==1) options.back(); }; - Bangle.on("touch", touchHandler); + Bangle.on("touch", touchHandler); WIDGETS = Object.assign({back:{ area:"tl", width:24, draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y), - remove:()=>{ + remove:(noclear)=>{ Bangle.removeListener("touch", touchHandler); - g.reset().clearRect({x:WIDGETS.back.x, y:WIDGETS.back.y, w:24,h:24}); + if (!noclear) g.reset().clearRect({x:WIDGETS.back.x, y:WIDGETS.back.y, w:24,h:24}); delete WIDGETS.back; - Bangle.drawWidgets(); + if (!noclear) Bangle.drawWidgets(); } }},global.WIDGETS); - Bangle.drawWidgets(); + if (redraw) Bangle.drawWidgets(); } }) diff --git a/libs/js/banglejs/Bangle_setUI_F18.min.js b/libs/js/banglejs/Bangle_setUI_F18.min.js index 19b7b8e8b3..147c62d324 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.min.js +++ b/libs/js/banglejs/Bangle_setUI_F18.min.js @@ -1,5 +1,5 @@ -(function(c,b){var a={};"object"==typeof c&&(a=c,c=a.mode);global.WIDGETS&&WIDGETS.back&&WIDGETS.back.remove();Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.touchHandler&&(Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(c){if("updown"== -c)Bangle.btnWatches=[setWatch(function(){b(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){b(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){b()},BTN2,{repeat:1,edge:"falling"})];else if("leftright"==c)Bangle.btnWatches=[setWatch(function(){b(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){b(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){b()},BTN2,{repeat:1,edge:"falling"})],Bangle.swipeHandler=d=>{b(d)},Bangle.on("swipe",Bangle.swipeHandler),Bangle.touchHandler= -d=>{b()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){b(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){b(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==c)a.touch&&(Bangle.touchHandler=a.touch,Bangle.on("touch",Bangle.touchHandler)),a.swipe&& -(Bangle.swipeHandler=a.swipe,Bangle.on("swipe",Bangle.swipeHandler)),a.btn&&(Bangle.btnWatches=[setWatch(function(){a.btn(1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(2)},BTN2,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(3)},BTN3,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(a.back){var e=d=>{1==d&&a.back()};Bangle.on("touch",e);WIDGETS=Object.assign({back:{area:"tl",width:24,draw:d=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="), -d.x,d.y),remove:()=>{Bangle.removeListener("touch",e);g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;Bangle.drawWidgets()}}},global.WIDGETS);Bangle.drawWidgets()}}}) \ No newline at end of file +(function(b,c){var a={};"object"==typeof b&&(a=b,b=a.mode);var e=!0;global.WIDGETS&&WIDGETS.back&&(e=!1,WIDGETS.back.remove(b&&a.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.touchHandler&&(Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove); +if(b){if("updown"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})];else if("leftright"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})],Bangle.swipeHandler=d=>{c(d)},Bangle.on("swipe",Bangle.swipeHandler), +Bangle.touchHandler=d=>{c()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==b)a.touch&&(Bangle.touchHandler=a.touch,Bangle.on("touch",Bangle.touchHandler)), +a.swipe&&(Bangle.swipeHandler=a.swipe,Bangle.on("swipe",Bangle.swipeHandler)),a.btn&&(Bangle.btnWatches=[setWatch(function(){a.btn(1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(2)},BTN2,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(3)},BTN3,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(a.back){var f=d=>{1==d&&a.back()};Bangle.on("touch",f);WIDGETS=Object.assign({back:{area:"tl",width:24,draw:d=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="), +d.x,d.y),remove:d=>{Bangle.removeListener("touch",f);d||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;d||Bangle.drawWidgets()}}},global.WIDGETS);e&&Bangle.drawWidgets()}}}) \ No newline at end of file From 68b19612d265c2c572cdfc61346f1ecf1532d5c6 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 27 Apr 2022 22:16:45 +0200 Subject: [PATCH 0032/1183] Bangle.js2: don't make setUI redraw widgets if we replace the back button with a new one --- libs/js/banglejs/Bangle_setUI_Q3.js | 15 +++++++++------ libs/js/banglejs/Bangle_setUI_Q3.min.js | 12 ++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libs/js/banglejs/Bangle_setUI_Q3.js b/libs/js/banglejs/Bangle_setUI_Q3.js index 3823686b6c..8451c976b4 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.js @@ -4,8 +4,11 @@ options = mode; mode = options.mode; } - if (global.WIDGETS && WIDGETS.back) - WIDGETS.back.remove(); + var redraw = true; + if (global.WIDGETS && WIDGETS.back) { + redraw = false; + WIDGETS.back.remove(mode && options.back); + } if (Bangle.btnWatches) { Bangle.btnWatches.forEach(clearWatch); delete Bangle.btnWatches; @@ -118,15 +121,15 @@ WIDGETS = Object.assign({back:{ area:"tl", width:24, draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y), - remove:()=>{ + remove:(noclear)=>{ clearWatch(btnWatch); Bangle.removeListener("touch", touchHandler); - g.reset().clearRect({x:WIDGETS.back.x, y:WIDGETS.back.y, w:24,h:24}); + if (!noclear) g.reset().clearRect({x:WIDGETS.back.x, y:WIDGETS.back.y, w:24,h:24}); delete WIDGETS.back; - Bangle.drawWidgets(); + if (!noclear) Bangle.drawWidgets(); } }},global.WIDGETS); - Bangle.drawWidgets(); + if (redraw) Bangle.drawWidgets(); } else { // If a touch handler was needed for setUI, add it if (Bangle.touchHandler) Bangle.on("touch", Bangle.touchHandler); diff --git a/libs/js/banglejs/Bangle_setUI_Q3.min.js b/libs/js/banglejs/Bangle_setUI_Q3.min.js index 47ccf4cd27..9685b4b3ad 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.min.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.min.js @@ -1,6 +1,6 @@ -(function(d,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof d&&(b=d,d=b.mode);global.WIDGETS&&WIDGETS.back&&WIDGETS.back.remove();Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&&(Bangle.removeListener("touch", -Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(d){if("updown"==d){var h=0;Bangle.dragHandler=a=>{h+=a.dy;for(a.b||(h=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("leftright"==d){var k=0;Bangle.dragHandler=a=>{k+=a.dx;for(a.b||(k=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("clock"==d)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})];else if("clockupdown"==d)Bangle.CLOCK=1,Bangle.touchHandler=(a,c)=>{120>c.x||(f(),e(88 -{f();e(c)};else if("custom"==d)b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn&&(Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var l=(a,c)=>{36>c.y&&48>c.x&&(c.handled=!0,b.back())};Bangle.on("touch",l);if(Bangle.touchHandler){var m=Bangle.touchHandler;Bangle.touchHandler= -(a,c)=>{c.handled||m(a,c)};Bangle.on("touch",Bangle.touchHandler)}var n=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:()=>{clearWatch(n);Bangle.removeListener("touch",l);g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;Bangle.drawWidgets()}}}, -global.WIDGETS);Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file +(function(c,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof c&&(b=c,c=b.mode);var l=!0;global.WIDGETS&&WIDGETS.back&&(l=!1,WIDGETS.back.remove(c&&b.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&& +(Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(c){if("updown"==c){var h=0;Bangle.dragHandler=a=>{h+=a.dy;for(a.b||(h=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("leftright"==c){var k=0;Bangle.dragHandler=a=>{k+=a.dx;for(a.b||(k=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("clock"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})];else if("clockupdown"==c)Bangle.CLOCK=1,Bangle.touchHandler=(a,d)=>{120>d.x||(f(),e(88{f();e(d)};else if("custom"==c)b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn&&(Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&&48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler= +(a,d)=>{d.handled||n(a,d)};Bangle.on("touch",Bangle.touchHandler)}var p=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{clearWatch(p);Bangle.removeListener("touch",m);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}}, +global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file From 7312859c489836bdc8469b96de63b4398bae03e9 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 00:02:32 +0200 Subject: [PATCH 0033/1183] Update E_showMenu_Q3.js Prevent using E.showScroller() on wraping items. This adds the option to control if the scroller or the simple box should be displayed. In my opinion there is no need for a separate property, because the item.wrap property is not used inside E.showScroller(). --- libs/js/banglejs/E_showMenu_Q3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index fa53a20c5a..09c49eb32f 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -21,7 +21,7 @@ /*if ("number"!=typeof item.value) return console.log("Unhandled item type");*/ var step = item.step||1; - if (item.min!==undefined && item.max!==undefined && + if (!item.wrap && item.min!==undefined && item.max!==undefined && ((item.max-item.min)/step)<20) { // show scrolling menu of options E.showScroller({ From d0d493643145148d060713b15d58c665b792f8af Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 00:09:20 +0200 Subject: [PATCH 0034/1183] Update E_showMenu_Q3.min.js Prevent using E.showScroller() on wraping items, according to E_showMenu_Q3.js. --- libs/js/banglejs/E_showMenu_Q3.min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index c7e6bd07e6..832549cbb1 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function u(a,b){var h=a.step||1;if(void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +(function(k){function u(a,b){var h=a.step||1;if(!a.wrap&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, 0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=n.scroll;n=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e, b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return r&&r();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b, -m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) \ No newline at end of file +m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) From 2f2bd8a8287017ef3ef8d55a5b9beb1370d48c7a Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 00:15:08 +0200 Subject: [PATCH 0035/1183] Update ChangeLog --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b7e9e0db33..22778d7ecd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ - Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + Bangle.js2: Prevent using E.showScroller inside E.showMenu on wraping items. + Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) From ad6811a6ae9ee1b7e833118fefc99ad3ffc75015 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 00:19:45 +0200 Subject: [PATCH 0036/1183] Update ChangeLog Adding ChangeLog entry for #2182 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 22778d7ecd..ac4e429b33 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ Bangle.js2: Prevent using E.showScroller inside E.showMenu on wraping items. Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + Bangle.js2: Recheck string wrapping after font change inside E.showMenu. Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) From 2c062b9bf800ff3477e8ba43e06e868815e35fb8 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 12:44:45 +0200 Subject: [PATCH 0037/1183] Update E_showMenu_Q3(.min).js Add ".noScroller" property to prevent the scroller to bedisplayed and instead use the simple box. --- ChangeLog | 6 +++--- libs/js/banglejs/E_showMenu_Q3.js | 2 +- libs/js/banglejs/E_showMenu_Q3.min.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac4e429b33..d192753bd8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ - Bangle.js2: Prevent using E.showScroller inside E.showMenu on wraping items. - Bangle.js2: Fix issue with E.showMenu creating a global `s` variable - Bangle.js2: Recheck string wrapping after font change inside E.showMenu. + Bangle.js2: App ".noScroller" property to prevent E.showScroller inside E.showMenu + Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 09c49eb32f..8f7b21707f 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -21,7 +21,7 @@ /*if ("number"!=typeof item.value) return console.log("Unhandled item type");*/ var step = item.step||1; - if (!item.wrap && item.min!==undefined && item.max!==undefined && + if (!item.noScroller && item.min!==undefined && item.max!==undefined && ((item.max-item.min)/step)<20) { // show scrolling menu of options E.showScroller({ diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 832549cbb1..cc3977e574 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,4 +1,4 @@ -(function(k){function u(a,b){var h=a.step||1;if(!a.wrap&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +(function(k){function u(a,b){var h=a.step||1;if(!a.noScroller&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, 0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=n.scroll;n=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, From b432cf2a27211f5121bcdfff8f366457752244e1 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 28 Apr 2022 12:50:11 +0200 Subject: [PATCH 0038/1183] [E_showMenu_Q3] Change ".noScroller" to ".noList" --- ChangeLog | 6 +++--- libs/js/banglejs/E_showMenu_Q3.js | 2 +- libs/js/banglejs/E_showMenu_Q3.min.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index d192753bd8..4bdd05da4a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ - Bangle.js2: App ".noScroller" property to prevent E.showScroller inside E.showMenu - Bangle.js2: Fix issue with E.showMenu creating a global `s` variable - Bangle.js2: Recheck string wrapping after font change inside E.showMenu + Bangle.js2: App ".noList" property to prevent E.showScroller inside E.showMenu + Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used Bangle.js2: Fix wear detection on latest Bangle.js 2 (VC31B variant) (fix #2141) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 8f7b21707f..19bc9c8ff3 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -21,7 +21,7 @@ /*if ("number"!=typeof item.value) return console.log("Unhandled item type");*/ var step = item.step||1; - if (!item.noScroller && item.min!==undefined && item.max!==undefined && + if (!item.noList && item.min!==undefined && item.max!==undefined && ((item.max-item.min)/step)<20) { // show scrolling menu of options E.showScroller({ diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index cc3977e574..b0c9881f6e 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,4 +1,4 @@ -(function(k){function u(a,b){var h=a.step||1;if(!a.noScroller&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +(function(k){function u(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, 0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=n.scroll;n=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, From a14e6166c86b092e3bccf0f157e718e9eef5a680 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 28 Apr 2022 20:17:39 +0200 Subject: [PATCH 0039/1183] Bangle.js1: try harder to only show E.showMenu submenu for option lists --- libs/js/banglejs/E_showMenu_F18.js | 16 ++++++++-------- libs/js/banglejs/E_showMenu_F18.min.js | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index af61262193..f7a188a0ea 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -137,10 +137,10 @@ else if ("object" == typeof item) { // if a number, go into 'edit mode' if ("number" == typeof item.value) { - var step = item.step || 1; - if (item.min !== undefined && item.max !== undefined && - ((item.max - item.min) / step) < 20) { - // replace main menu with submenu + if (item.format && (item.step || 1) === 1 && + item.min === 0 && item.max < 20) { + // assume value is index in a list of options: + // replace main menu with submenu where we can pick one l.main = { items: items, menuItems: menuItems, @@ -150,16 +150,16 @@ }; options.title = menuItems[options.selected]; options.selected = 0; - items = []; - for (var v = item.min; v <= item.max; v += step) { - items[item.format ? item.format(v) : v] = v; + items = {}; + for (var v = item.min; v <= item.max; v ++) { + items[item.format(v)] = v; if (v == item.value) options.selected = Object.keys(items).length - 1; } menuItems = Object.keys(items); g.reset().clearRect(Bangle.appRect); l.draw(); } else { - // too many options for menu: use in-line edit mode + // a "real" number, or too many options: use in-line edit mode l.selectEdit = l.selectEdit?undefined:item; } } else { // else just toggle bools diff --git a/libs/js/banglejs/E_showMenu_F18.min.js b/libs/js/banglejs/E_showMenu_F18.min.js index 1f5dbfa741..e0dc0fe581 100644 --- a/libs/js/banglejs/E_showMenu_F18.min.js +++ b/libs/js/banglejs/E_showMenu_F18.min.js @@ -1,7 +1,7 @@ -(function(e){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(e){var b=e[""],f=Object.keys(e);b&&(f.splice(f.indexOf(""),1),b.back&&(e["< Back"]=b.back,f.unshift("< Back")));f.forEach(a=>{a=e[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=c=>atob(c?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});b instanceof Object||(b={});b.fontHeight=b.fontHeight||16;void 0===b.selected&&(b.selected=0); -b.fontHeight||(b.fontHeight=6);var q=Bangle.appRect,r=q.x,m=q.x2-11,p=q.y,t=q.y2-20;b.title&&(p+=b.fontHeight+2);var d={lastIdx:0,draw:function(a,c){var h=0|Math.min((t-p)/b.fontHeight,f.length),k=E.clip(b.selected-(h>>1),0,f.length-h);k!=d.lastIdx&&(a=void 0);d.lastIdx=k;var u=k+hc&&(h=1+c-a));for(;h--;){c=f[k];a=e[c];var n=k==b.selected&&!d.selectEdit;g.setColor(n?g.theme.bgH:g.theme.bg);g.fillRect(r,l,m,l+b.fontHeight-1);g.setColor(n?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(c,r,l);"object"==typeof a?(c=m,n=a.value,a.format&&(n=a.format(n)),d.selectEdit&&k==b.selected&&(c-=25,g.setColor(g.theme.bgH).fillRect(c-(g.stringWidth(n)+4),l,m,l+b.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",c,l+ -(b.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(n,c-2,l)):d.main&&(g.setFontAlign(1,-1),g.drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),m,l));g.setColor(g.theme.fg);l+=b.fontHeight;k++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",m+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",m+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",m+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104, -220,136,220,120,228]);g.flip()},select:function(){var a=e[f[b.selected]];if(d.main){var c=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=c;d.back();a.onchange&&(a.onchange(a.value),d.draw(b.selected,b.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(c=a.step||1,void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/c){d.main={items:e,menuItems:f,selected:b.selected,title:b.title,value:a.value};b.title=f[b.selected];b.selected=0;e=[];for(var h= -a.min;h<=a.max;h+=c)e[a.format?a.format(h):h]=h,h==a.value&&(b.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var c=d.selectEdit;if(c){c=d.selectEdit;c.value-=(a||1)*(c.step||1);void 0!==c.min&&c.valuec.max&&(c.value=c.wrap?c.min:c.max);if(c.onchange)c.onchange(c.value); -d.draw(b.selected,b.selected)}else c=b.selected,b.selected=(a+b.selected+f.length)%f.length,d.draw(Math.min(c,b.selected),Math.max(c,b.selected))},back:function(){if(d.main)b.selected=d.main.selected,b.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +(function(e){g.reset().clearRect(Bangle.appRect);Bangle.setLCDPower(1);if(e){var c=e[""],f=Object.keys(e);c&&(f.splice(f.indexOf(""),1),c.back&&(e["< Back"]=c.back,f.unshift("< Back")));f.forEach(a=>{a=e[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>atob(b?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); +c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,l=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(a,b){var p=0|Math.min((t-n)/c.fontHeight,f.length),h=E.clip(c.selected-(p>>1),0,f.length-p);h!=d.lastIdx&&(a=void 0);d.lastIdx=h;var u=h+pb&&(p=1+b-a));for(;p--;){b=f[h];a=e[b];var m=h==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,k,l,k+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(b,r,k);"object"==typeof a?(b=l,m=a.value,a.format&&(m=a.format(m)),d.selectEdit&&h==c.selected&&(b-=25,g.setColor(g.theme.bgH).fillRect(b-(g.stringWidth(m)+4),k,l,k+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",b,k+ +(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,b-2,k)):d.main&&(g.setFontAlign(1,-1),g.drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),l,k));g.setColor(g.theme.fg);k+=c.fontHeight;h++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",l+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",l+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",l+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104, +220,136,220,120,228]);g.flip()},select:function(){var a=e[f[c.selected]];if(d.main){var b=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=b;d.back();a.onchange&&(a.onchange(a.value),d.draw(c.selected,c.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(a.format&&1===(a.step||1)&&0===a.min&&20>a.max){d.main={items:e,menuItems:f,selected:c.selected,title:c.title,value:a.value};c.title=f[c.selected];c.selected=0;e={};for(b=a.min;b<=a.max;b++)e[a.format(b)]= +b,b==a.value&&(c.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var b=d.selectEdit;if(b){b=d.selectEdit;b.value-=(a||1)*(b.step||1);void 0!==b.min&&b.valueb.max&&(b.value=b.wrap?b.min:b.max);if(b.onchange)b.onchange(b.value);d.draw(c.selected, +c.selected)}else b=c.selected,c.selected=(a+c.selected+f.length)%f.length,d.draw(Math.min(b,c.selected),Math.max(b,c.selected))},back:function(){if(d.main)c.selected=d.main.selected,c.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file From 1612028b6ea59967de46e12a7ce0a866e428a871 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Fri, 29 Apr 2022 10:18:25 +0200 Subject: [PATCH 0040/1183] [locale] Fix default dow and month functions --- libs/js/banglejs/locale.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/locale.js b/libs/js/banglejs/locale.js index 6873387af4..2d9d5457c5 100644 --- a/libs/js/banglejs/locale.js +++ b/libs/js/banglejs/locale.js @@ -22,8 +22,8 @@ exports = { name : "en_GB", currencySym:"£", return (" "+h).substr(-2)+":"+("0"+m).substr(-2)+"."+("0"+d.getSeconds()).substr(-2)+" "+r; } }, - dow : (d,short) => short?d.toString().substr(0,3):"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(",")[d.getDay()], // Date to "Monday" or "Mon"(short) - month : (d,short) => short?d.toString().substr(4,3):"January,February,March,April,May,June,July,August,September,October,November,December".split(",")[d.getMonth()], // Date to "February" or "Feb"(short) + dow : (d,short) => "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(",")[d.getDay()].substr(0, short ? 3 : 10), // Date to "Monday" or "Mon"(short) + month : (d,short) => "January,February,March,April,May,June,July,August,September,October,November,December".split(",")[d.getMonth()].substr(0, short ? 3 : 10), // Date to "February" or "Feb"(short) number : n => n.toString(), // more fancy? currency : n => "£"+n.toFixed(2), // number to "£1.00" distance : (m,dp) => (m<1000)?round(m,dp)+"m":round(m/1609.34,dp)+"mi", // meters to "123m" or "1.2mi" depending on size From 4300404395bfcc989e9ae4984289477686e33807 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Apr 2022 09:51:19 +0100 Subject: [PATCH 0041/1183] changelog for https://github.com/espruino/Espruino/pull/2184 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index b7e9e0db33..82904a2b9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ Bangle.js2: Allow variable HRM poll rates on Bangle.js 2 VC31B variant Bangle.js2: VC31 HRM variant now polls at 25hz (not 50) Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox + Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From d6b8295a0a8f039b53f914652b47ddf2bef151d5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Apr 2022 09:54:29 +0100 Subject: [PATCH 0042/1183] changelog for Bangle.js: built-in locale now doesn't depend on argument being an instance of Date (#2187) --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 82904a2b9e..e74ac97187 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,7 +5,8 @@ Bangle.js2: Allow variable HRM poll rates on Bangle.js 2 VC31B variant Bangle.js2: VC31 HRM variant now polls at 25hz (not 50) Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox - Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items + Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items (#2184) + Bangle.js: built-in locale now doesn't depend on argument being an instance of Date (#2187) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From 7c15a764a9f2914169945f36bb9f4943b6f2de70 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Apr 2022 09:57:46 +0100 Subject: [PATCH 0043/1183] Add #2186 tweak to Bangle.js 1 --- ChangeLog | 2 +- libs/js/banglejs/E_showMenu_F18.js | 2 +- libs/js/banglejs/E_showMenu_F18.min.js | 6 +++--- libs/js/banglejs/E_showMenu_Q3.min.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 830e49704b..7b9868a8e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,3 @@ - Bangle.js2: App ".noList" property to prevent E.showScroller inside E.showMenu Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb @@ -9,6 +8,7 @@ Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items (#2184) Bangle.js: built-in locale now doesn't depend on argument being an instance of Date (#2187) + Bangle.js: App ".noList" property to prevent E.showScroller inside E.showMenu 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index f7a188a0ea..768a6ab3d7 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -137,7 +137,7 @@ else if ("object" == typeof item) { // if a number, go into 'edit mode' if ("number" == typeof item.value) { - if (item.format && (item.step || 1) === 1 && + if (!item.noList && item.format && (item.step || 1) === 1 && item.min === 0 && item.max < 20) { // assume value is index in a list of options: // replace main menu with submenu where we can pick one diff --git a/libs/js/banglejs/E_showMenu_F18.min.js b/libs/js/banglejs/E_showMenu_F18.min.js index e0dc0fe581..a5d79b4ae0 100644 --- a/libs/js/banglejs/E_showMenu_F18.min.js +++ b/libs/js/banglejs/E_showMenu_F18.min.js @@ -2,6 +2,6 @@ c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,l=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(a,b){var p=0|Math.min((t-n)/c.fontHeight,f.length),h=E.clip(c.selected-(p>>1),0,f.length-p);h!=d.lastIdx&&(a=void 0);d.lastIdx=h;var u=h+pb&&(p=1+b-a));for(;p--;){b=f[h];a=e[b];var m=h==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,k,l,k+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(b,r,k);"object"==typeof a?(b=l,m=a.value,a.format&&(m=a.format(m)),d.selectEdit&&h==c.selected&&(b-=25,g.setColor(g.theme.bgH).fillRect(b-(g.stringWidth(m)+4),k,l,k+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",b,k+ (c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,b-2,k)):d.main&&(g.setFontAlign(1,-1),g.drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),l,k));g.setColor(g.theme.fg);k+=c.fontHeight;h++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",l+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",l+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",l+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104, -220,136,220,120,228]);g.flip()},select:function(){var a=e[f[c.selected]];if(d.main){var b=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=b;d.back();a.onchange&&(a.onchange(a.value),d.draw(c.selected,c.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(a.format&&1===(a.step||1)&&0===a.min&&20>a.max){d.main={items:e,menuItems:f,selected:c.selected,title:c.title,value:a.value};c.title=f[c.selected];c.selected=0;e={};for(b=a.min;b<=a.max;b++)e[a.format(b)]= -b,b==a.value&&(c.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var b=d.selectEdit;if(b){b=d.selectEdit;b.value-=(a||1)*(b.step||1);void 0!==b.min&&b.valueb.max&&(b.value=b.wrap?b.min:b.max);if(b.onchange)b.onchange(b.value);d.draw(c.selected, -c.selected)}else b=c.selected,c.selected=(a+c.selected+f.length)%f.length,d.draw(Math.min(b,c.selected),Math.max(b,c.selected))},back:function(){if(d.main)c.selected=d.main.selected,c.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +220,136,220,120,228]);g.flip()},select:function(){var a=e[f[c.selected]];if(d.main){var b=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=b;d.back();a.onchange&&(a.onchange(a.value),d.draw(c.selected,c.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(!a.noList&&a.format&&1===(a.step||1)&&0===a.min&&20>a.max){d.main={items:e,menuItems:f,selected:c.selected,title:c.title,value:a.value};c.title=f[c.selected];c.selected=0;e={};for(b=a.min;b<= +a.max;b++)e[a.format(b)]=b,b==a.value&&(c.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var b=d.selectEdit;if(b){b=d.selectEdit;b.value-=(a||1)*(b.step||1);void 0!==b.min&&b.valueb.max&&(b.value=b.wrap?b.min:b.max);if(b.onchange)b.onchange(b.value); +d.draw(c.selected,c.selected)}else b=c.selected,c.selected=(a+c.selected+f.length)%f.length,d.draw(Math.min(b,c.selected),Math.max(b,c.selected))},back:function(){if(d.main)c.selected=d.main.selected,c.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index b0c9881f6e..2f7c8655d2 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -4,4 +4,4 @@ b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setCol p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e, b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return r&&r();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b, -m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) +m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) \ No newline at end of file From 7070a4cc3ed96d76f47eaa4e8ed53f5360a1e15e Mon Sep 17 00:00:00 2001 From: storm64 Date: Fri, 29 Apr 2022 11:40:56 +0200 Subject: [PATCH 0044/1183] [E_showMenu_Q3] Add "Back" on list submenu 1. Add "Back"-Button on list selection submenu inside E_showMenu 2. Regenerated E_showMenu_Q3.min.js via IDE with "Closure Simple Optimizations" 3. Add ChangeLog entry 4. Readd ChangeLog entry for #2186 --- ChangeLog | 2 ++ libs/js/banglejs/E_showMenu_Q3.js | 1 + libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b9868a8e9..79baca0031 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ + Bangle.js2: Add "Back"-Button on list selection submenu inside E_showMenu + Bangle.js2: Add ".noList" property to prevent E.showScroller inside E.showMenu Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 19bc9c8ff3..fe0525b7bf 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -26,6 +26,7 @@ // show scrolling menu of options E.showScroller({ h : H, c : (item.max+step-item.min)/step, + back: show, // redraw original menu scrollMin : -24, scroll : -24, // title is 24px, rendered at -1 draw : (idx, r) => { if (idx<0) // TITLE diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 2f7c8655d2..09916470f2 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function u(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, -0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);p.scroll=n.scroll;n=E.showScroller(p)}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ -b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI("updown",c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value); -p.scroll=n.scroll;n=E.showScroller(p)}})}}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var r=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var t={draw:()=>n.draw()},p={h:40,c:m.length, -scrollMin:-24,scroll:-24,back:r,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e, -b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return r&&r();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(t);else if("object"==typeof b)if("number"==typeof b.value)u(b, -m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}};var n=E.showScroller(p);return t}) \ No newline at end of file +(function(l){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:p,scrollMin:-24,scroll:-24,draw:function(c,d){if(0>c)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5});c=c*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +0).drawString(a.format?a.format(c):c,d.x+12,d.y+20);g.drawImage(atob(c==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(c){if(!(0>c)){Bangle.buzz(20);a.value=a.min+c*h;if(a.onchange)a.onchange(a.value);r.scroll=n.scroll;p()}}});else{var f=function(){var c=e.x+e.w/2,d=12+e.y+e.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+36,w:e.w-48,h:e.h- +48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(k):k,c,d);g.fillPoly([c,d-45,c+15,d-30,c-15,d-30]).fillPoly([c,d+45,c+15,d+30,c-15,d+30])},e=Bangle.appRect,k=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);f();Bangle.setUI("updown",function(c){if(c)k-=(c||1)*(a.step||1),void 0!== +a.min&&ka.max&&(k=a.wrap?a.min:a.max),f();else{a.value=k;if(a.onchange)a.onchange(a.value);r.scroll=n.scroll;p()}})}}function p(){n=E.showScroller(r)}if(void 0===l)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=l[""]||{};q.title||(q.title="Menu");var t=q.back||l["< Back"],m=Object.keys(l).filter(function(a){return""!=a&&"< Back"!=a});m.forEach(function(a){a=l[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=function(b){return"\x00"+ +atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g")})});var u={draw:function(){return n.draw()}},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:function(a,b){if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+ +4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,f=l[m[a]];if("object"==typeof f){var e=f.value;f.format&&(e=f.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof f&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);f=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=l[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}},n;p();return u}); From 16fcc94436c45415cecbc5cfce841e949e04d834 Mon Sep 17 00:00:00 2001 From: storm64 Date: Fri, 29 Apr 2022 11:53:32 +0200 Subject: [PATCH 0045/1183] [E_showMenu_Q3] Add "Back" on boxed submenu 1. Add "Back"-Button on boxed selection submenu inside E_showMenu 2. Regenerated E_showMenu_Q3.min.js via IDE with "Closure Simple Optimizations" 3. Alter ChangeLog entry --- ChangeLog | 2 +- libs/js/banglejs/E_showMenu_Q3.js | 5 ++++- libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 79baca0031..8ab9baf1b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ - Bangle.js2: Add "Back"-Button on list selection submenu inside E_showMenu + Bangle.js2: Add "Back"-Button on submenus inside E_showMenu Bangle.js2: Add ".noList" property to prevent E.showScroller inside E.showMenu Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index fe0525b7bf..1a352bd5fd 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -61,7 +61,10 @@ g.fillPoly([mx,my-45, mx+15,my-30, mx-15,my-30]).fillPoly([mx,my+45, mx+15,my+30, mx-15,my+30]); } draw(); - Bangle.setUI("updown", dir => { + Bangle.setUI({ + mode: "updown", + back: show + }, dir => { if (dir) { v -= (dir||1)*(item.step||1); if (item.min!==undefined && v(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:p,scrollMin:-24,scroll:-24,draw:function(c,d){if(0>c)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5});c=c*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, -0).drawString(a.format?a.format(c):c,d.x+12,d.y+20);g.drawImage(atob(c==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(c){if(!(0>c)){Bangle.buzz(20);a.value=a.min+c*h;if(a.onchange)a.onchange(a.value);r.scroll=n.scroll;p()}}});else{var f=function(){var c=e.x+e.w/2,d=12+e.y+e.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+36,w:e.w-48,h:e.h- -48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(k):k,c,d);g.fillPoly([c,d-45,c+15,d-30,c-15,d-30]).fillPoly([c,d+45,c+15,d+30,c-15,d+30])},e=Bangle.appRect,k=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);f();Bangle.setUI("updown",function(c){if(c)k-=(c||1)*(a.step||1),void 0!== -a.min&&ka.max&&(k=a.wrap?a.min:a.max),f();else{a.value=k;if(a.onchange)a.onchange(a.value);r.scroll=n.scroll;p()}})}}function p(){n=E.showScroller(r)}if(void 0===l)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=l[""]||{};q.title||(q.title="Menu");var t=q.back||l["< Back"],m=Object.keys(l).filter(function(a){return""!=a&&"< Back"!=a});m.forEach(function(a){a=l[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=function(b){return"\x00"+ -atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g")})});var u={draw:function(){return n.draw()}},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:function(a,b){if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+ -4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,f=l[m[a]];if("object"==typeof f){var e=f.value;f.format&&(e=f.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof f&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);f=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=l[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);n.drawItem(a)}}},n;p();return u}); +(function(l){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:n,scrollMin:-24,scroll:-24,draw:function(c,d){if(0>c)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5});c=c*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, +0).drawString(a.format?a.format(c):c,d.x+12,d.y+20);g.drawImage(atob(c==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(c){if(!(0>c)){Bangle.buzz(20);a.value=a.min+c*h;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}}});else{var f=function(){var c=e.x+e.w/2,d=12+e.y+e.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+36,w:e.w-48,h:e.h- +48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(k):k,c,d);g.fillPoly([c,d-45,c+15,d-30,c-15,d-30]).fillPoly([c,d+45,c+15,d+30,c-15,d+30])},e=Bangle.appRect,k=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);f();Bangle.setUI({mode:"updown",back:n},function(c){if(c)k-=(c||1)* +(a.step||1),void 0!==a.min&&ka.max&&(k=a.wrap?a.min:a.max),f();else{a.value=k;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}})}}function n(){p=E.showScroller(r)}if(void 0===l)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=l[""]||{};q.title||(q.title="Menu");var t=q.back||l["< Back"],m=Object.keys(l).filter(function(a){return""!=a&&"< Back"!=a});m.forEach(function(a){a=l[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format|| +(a.format=function(b){return"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g")})});var u={draw:function(){return p.draw()}},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:function(a,b){if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+ +40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,f=l[m[a]];if("object"==typeof f){var e=f.value;f.format&&(e=f.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof f&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);f=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=l[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);p.drawItem(a)}}},p;n();return u}); From 1fe4c9c6fd52680caab5861cecb67ba5708fedd1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 29 Apr 2022 11:20:52 +0100 Subject: [PATCH 0046/1183] tweaks to #2188 --- ChangeLog | 5 ++--- libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ab9baf1b5..32a9ec1abc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,3 @@ - Bangle.js2: Add "Back"-Button on submenus inside E_showMenu - Bangle.js2: Add ".noList" property to prevent E.showScroller inside E.showMenu Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb @@ -11,7 +9,8 @@ Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items (#2184) Bangle.js: built-in locale now doesn't depend on argument being an instance of Date (#2187) Bangle.js: App ".noList" property to prevent E.showScroller inside E.showMenu - + Bangle.js2: Add "Back"-Button on submenus inside E_showMenu + 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) E.dumpVariables now dumps variable flags diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 23004f433e..df4f66f322 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(l){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:n,scrollMin:-24,scroll:-24,draw:function(c,d){if(0>c)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5});c=c*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1, -0).drawString(a.format?a.format(c):c,d.x+12,d.y+20);g.drawImage(atob(c==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(c){if(!(0>c)){Bangle.buzz(20);a.value=a.min+c*h;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}}});else{var f=function(){var c=e.x+e.w/2,d=12+e.y+e.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+36,w:e.w-48,h:e.h- -48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(k):k,c,d);g.fillPoly([c,d-45,c+15,d-30,c-15,d-30]).fillPoly([c,d+45,c+15,d+30,c-15,d+30])},e=Bangle.appRect,k=a.value;g.reset().clearRect(Bangle.appRect);g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);f();Bangle.setUI({mode:"updown",back:n},function(c){if(c)k-=(c||1)* -(a.step||1),void 0!==a.min&&ka.max&&(k=a.wrap?a.min:a.max),f();else{a.value=k;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}})}}function n(){p=E.showScroller(r)}if(void 0===l)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=l[""]||{};q.title||(q.title="Menu");var t=q.back||l["< Back"],m=Object.keys(l).filter(function(a){return""!=a&&"< Back"!=a});m.forEach(function(a){a=l[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format|| -(a.format=function(b){return"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g")})});var u={draw:function(){return p.draw()}},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:function(a,b){if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+ -40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,f=l[m[a]];if("object"==typeof f){var e=f.value;f.format&&(e=f.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof f&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);f=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=l[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);p.drawItem(a)}}},p;n();return u}); +(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:n,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; +g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); +g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI({mode:"updown", +back:n},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}})}}function n(){p=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var t=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format|| +(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var u={draw:()=>p.draw()},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+ +4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);p.drawItem(a)}}},p;n();return u}) \ No newline at end of file From f772bd51062b84626c595c395538182409bb77ff Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 3 May 2022 13:14:25 +0100 Subject: [PATCH 0047/1183] Graphics: g.setClipRect now uses rotated coordinates Graphics: g.draw/fillCircle now works with rotated coordinates Bangle.js2: Touch/drag coordinates now obey g.setRotation --- ChangeLog | 5 ++++- libs/banglejs/jswrap_bangle.c | 2 ++ libs/graphics/graphics.c | 23 +++++++++++++++++++++++ libs/graphics/graphics.h | 3 +++ libs/graphics/jswrap_graphics.c | 10 ++++++++-- 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 32a9ec1abc..961f1052c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,8 +8,11 @@ Bangle.js1: E.showMenu now displays boolean values with no `format` as a checkbox Bangle.js1: E.showMenu now displays a submenu for multiple choice menu items (#2184) Bangle.js: built-in locale now doesn't depend on argument being an instance of Date (#2187) - Bangle.js: App ".noList" property to prevent E.showScroller inside E.showMenu + Bangle.js: Add ".noList" property to prevent E.showScroller inside E.showMenu Bangle.js2: Add "Back"-Button on submenus inside E_showMenu + Graphics: g.setClipRect now uses rotated coordinates + Graphics: g.draw/fillCircle now works with rotated coordinates + Bangle.js2: Touch/drag coordinates now obey g.setRotation 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index d92d6ec361..8c71ad06f3 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -1525,6 +1525,8 @@ void btn4Handler(bool state, IOEventFlags flags) { void touchHandlerInternal(int tx, int ty, int pts, int gesture) { // ignore if locked if (bangleFlags & JSBF_LOCKED) return; + // deal with the case where we rotated the Bangle.js screen + deviceToGraphicsCoordinates(&graphicsInternal, &tx, &ty); int dx = tx-touchX; int dy = ty-touchY; diff --git a/libs/graphics/graphics.c b/libs/graphics/graphics.c index cf21b2c3ff..acb9eca12c 100644 --- a/libs/graphics/graphics.c +++ b/libs/graphics/graphics.c @@ -271,6 +271,17 @@ void graphicsToDeviceCoordinates(const JsGraphics *gfx, int *x, int *y) { if (gfx->data.flags & JSGRAPHICSFLAGS_INVERT_Y) *y = (int)(gfx->data.height - (*y+1)); } +// If graphics is flipped or rotated then the coordinates need modifying. This is to go back - eg for touchscreens +void deviceToGraphicsCoordinates(const JsGraphics *gfx, int *x, int *y) { + if (gfx->data.flags & JSGRAPHICSFLAGS_INVERT_X) *x = (int)(gfx->data.width - (*x+1)); + if (gfx->data.flags & JSGRAPHICSFLAGS_INVERT_Y) *y = (int)(gfx->data.height - (*y+1)); + if (gfx->data.flags & JSGRAPHICSFLAGS_SWAP_XY) { + int t = *x; + *x = *y; + *y = t; + } +} + // If graphics is flipped or rotated then the coordinates need modifying void graphicsToDeviceCoordinates16x(const JsGraphics *gfx, int *x, int *y) { if (gfx->data.flags & JSGRAPHICSFLAGS_SWAP_XY) { @@ -500,6 +511,12 @@ void graphicsDrawRect(JsGraphics *gfx, int x1, int y1, int x2, int y2) { void graphicsDrawEllipse(JsGraphics *gfx, int posX1, int posY1, int posX2, int posY2){ graphicsToDeviceCoordinates(gfx, &posX1, &posY1); graphicsToDeviceCoordinates(gfx, &posX2, &posY2); + if (posX1>posX2) { + int t=posX1;posX1=posX2;posX2=t; + } + if (posY1>posY2) { + int t=posY1;posY1=posY2;posY2=t; + } int posX = (posX1+posX2)/2; int posY = (posY1+posY2)/2; @@ -533,6 +550,12 @@ void graphicsDrawEllipse(JsGraphics *gfx, int posX1, int posY1, int posX2, int p void graphicsFillEllipse(JsGraphics *gfx, int posX1, int posY1, int posX2, int posY2){ graphicsToDeviceCoordinates(gfx, &posX1, &posY1); graphicsToDeviceCoordinates(gfx, &posX2, &posY2); + if (posX1>posX2) { + int t=posX1;posX1=posX2;posX2=t; + } + if (posY1>posY2) { + int t=posY1;posY1=posY2;posY2=t; + } int posX = (posX1+posX2)/2; int posY = (posY1+posY2)/2; diff --git a/libs/graphics/graphics.h b/libs/graphics/graphics.h index 6901e09356..c6976a9454 100644 --- a/libs/graphics/graphics.h +++ b/libs/graphics/graphics.h @@ -185,6 +185,9 @@ bool graphicsSetCallbacks(JsGraphics *gfx); size_t graphicsGetMemoryRequired(const JsGraphics *gfx); // If graphics is flipped or rotated then the coordinates need modifying void graphicsToDeviceCoordinates(const JsGraphics *gfx, int *x, int *y); +// If graphics is flipped or rotated then the coordinates need modifying. This is to go back - eg for touchscreens +void deviceToGraphicsCoordinates(const JsGraphics *gfx, int *x, int *y); + unsigned short graphicsGetWidth(const JsGraphics *gfx); unsigned short graphicsGetHeight(const JsGraphics *gfx); // Set the area modified (inclusive of x2,y2) by a draw command and also clip to the screen/clipping bounds. Returns true if clipped diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index b24eddf38e..8fbb4eced4 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -1473,11 +1473,17 @@ sit between. These values are inclusive - eg `g.setClipRect(1,0,5,0)` will ensure that only pixel rows 1,2,3,4,5 are touched on column 0. -**Note:** For maximum flexibility, the values here are not range checked. For normal -use, X and Y should be between 0 and `getWidth`/`getHeight`. +**Note:** For maximum flexibility on Bangle.js 1, the values here are not range checked. For normal +use, X and Y should be between 0 and `getWidth()-1`/`getHeight()-1`. + +**Note:** The x/y values here are rotated, so that if `Graphics.setRotation` is used +they correspond to the coordinates given to the draw functions, *not to the +physical device pixels*. */ JsVar *jswrap_graphics_setClipRect(JsVar *parent, int x1, int y1, int x2, int y2) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; + graphicsToDeviceCoordinates(&gfx, &x1, &y1); + graphicsToDeviceCoordinates(&gfx, &x2, &y2); #ifndef SAVE_ON_FLASH #ifdef USE_LCD_ST7789_8BIT if (gfx.data.type!=JSGRAPHICSTYPE_ST7789_8BIT) { From 79286897b49612aca093702e39a31bf108ca526b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 3 May 2022 14:23:37 +0100 Subject: [PATCH 0048/1183] Graphics: Fix drawString with combination of g.setClipRect and g.setRotation --- ChangeLog | 1 + libs/graphics/jswrap_graphics.c | 10 ++++++++++ tests/test_graphics_drawStringClipRect.js | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/ChangeLog b/ChangeLog index 961f1052c5..82d925a9f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,7 @@ Graphics: g.setClipRect now uses rotated coordinates Graphics: g.draw/fillCircle now works with rotated coordinates Bangle.js2: Touch/drag coordinates now obey g.setRotation + Graphics: Fix drawString with combination of g.setClipRect and g.setRotation 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 8fbb4eced4..86a078d26a 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -2227,6 +2227,16 @@ JsVar *jswrap_graphics_drawString(JsVar *parent, JsVar *var, int x, int y, bool int minY = (gfx.data.flags & JSGRAPHICSFLAGS_SWAP_XY) ? gfx.data.clipRect.x1 : gfx.data.clipRect.y1; int maxX = (gfx.data.flags & JSGRAPHICSFLAGS_SWAP_XY) ? gfx.data.clipRect.y2 : gfx.data.clipRect.x2; int maxY = (gfx.data.flags & JSGRAPHICSFLAGS_SWAP_XY) ? gfx.data.clipRect.x2 : gfx.data.clipRect.y2; + if (gfx.data.flags & JSGRAPHICSFLAGS_INVERT_X) { + int t = gfx.data.width - (minX+1); + minX = gfx.data.width - (maxX+1); + maxX = t; + } + if (gfx.data.flags & JSGRAPHICSFLAGS_INVERT_Y) { + int t = gfx.data.height - (minY+1); + minY = gfx.data.height - (maxY+1); + maxY = t; + } #else int minX = 0; int minY = 0; diff --git a/tests/test_graphics_drawStringClipRect.js b/tests/test_graphics_drawStringClipRect.js index dd46563032..d197f03bbd 100644 --- a/tests/test_graphics_drawStringClipRect.js +++ b/tests/test_graphics_drawStringClipRect.js @@ -39,4 +39,22 @@ SHOULD_BE(` ........`); +// Same clip rect at top, but rotate 180 degrees +g.clear(1); +g.setRotation(2); +g.setClipRect(0,0, g.getWidth()-1, 1); +g.drawString("T", 0, 0); +// font visibility should mean that the top line of T is drawn + +SHOULD_BE(` +........ +........ +........ +........ +........ +........ +......#. +.....###`); + + result = ok; From 478b28d080234fc2ab88a751ced23c296b67eeb7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 5 May 2022 12:01:19 +0100 Subject: [PATCH 0049/1183] nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 24 ++++++++++++------------ libs/misc/hrm_vc31.c | 4 ++-- libs/puckjs/jswrap_puck.c | 12 ++++++------ libs/trigger/jswrap_trigger.c | 4 ++-- src/jshardware.h | 8 +++++++- src/jsinteractive.c | 9 +++++---- src/jsserial.c | 4 ++-- src/jswrap_io.c | 16 ++++++++++++---- targets/emscripten/jshardware.c | 2 +- targets/esp32/jshardware.c | 5 +++-- targets/esp8266/jshardware.c | 5 +++-- targets/linux/jshardware.c | 2 +- targets/nrf5x/jshardware.c | 4 ++-- targets/stm32/jshardware.c | 2 +- targets/stm32_ll/jshardware.c | 2 +- 16 files changed, 61 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82d925a9f9..2ee2f3c147 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ Graphics: g.draw/fillCircle now works with rotated coordinates Bangle.js2: Touch/drag coordinates now obey g.setRotation Graphics: Fix drawString with combination of g.setClipRect and g.setRotation + nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 8c71ad06f3..8758710eb4 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -2973,7 +2973,7 @@ NO_INLINE void jswrap_banglejs_init() { #ifdef BANGLEJS_Q3 #ifndef EMULATED jshSetPinShouldStayWatched(TOUCH_PIN_IRQ,true); - channel = jshPinWatch(TOUCH_PIN_IRQ, true); + channel = jshPinWatch(TOUCH_PIN_IRQ, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, touchHandler); #endif #endif @@ -3309,28 +3309,28 @@ NO_INLINE void jswrap_banglejs_init() { #ifdef BANGLEJS_Q3 jshSetPinShouldStayWatched(BTN1_PININDEX,true); - channel = jshPinWatch(BTN1_PININDEX, true); + channel = jshPinWatch(BTN1_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn1Handler); #else jshSetPinShouldStayWatched(BTN1_PININDEX,true); jshSetPinShouldStayWatched(BTN2_PININDEX,true); - channel = jshPinWatch(BTN1_PININDEX, true); + channel = jshPinWatch(BTN1_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn1Handler); - channel = jshPinWatch(BTN2_PININDEX, true); + channel = jshPinWatch(BTN2_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn2Handler); #ifdef BTN3_PININDEX jshSetPinShouldStayWatched(BTN3_PININDEX,true); - channel = jshPinWatch(BTN3_PININDEX, true); + channel = jshPinWatch(BTN3_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn3Handler); #endif #ifdef BTN4_PININDEX jshSetPinShouldStayWatched(BTN4_PININDEX,true); - channel = jshPinWatch(BTN4_PININDEX, true); + channel = jshPinWatch(BTN4_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn4Handler); #endif #ifdef BTN5_PININDEX jshSetPinShouldStayWatched(BTN5_PININDEX,true); - channel = jshPinWatch(BTN5_PININDEX, true); + channel = jshPinWatch(BTN5_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, btn5Handler); #endif #endif @@ -3381,22 +3381,22 @@ void jswrap_banglejs_kill() { promisePressure = 0; #endif - jshPinWatch(BTN1_PININDEX, false); + jshPinWatch(BTN1_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN1_PININDEX,false); #ifdef BTN2_PININDEX - jshPinWatch(BTN2_PININDEX, false); + jshPinWatch(BTN2_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN2_PININDEX,false); #endif #ifdef BTN3_PININDEX - jshPinWatch(BTN3_PININDEX, false); + jshPinWatch(BTN3_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN3_PININDEX,false); #endif #ifdef BTN4_PININDEX jshSetPinShouldStayWatched(BTN4_PININDEX,false); - jshPinWatch(BTN4_PININDEX, false); + jshPinWatch(BTN4_PININDEX, false, JSPW_NONE); #endif #ifdef BTN5_PININDEX - jshPinWatch(BTN5_PININDEX, false); + jshPinWatch(BTN5_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN5_PININDEX,false); #endif // Graphics var is getting removed, so set this to null. diff --git a/libs/misc/hrm_vc31.c b/libs/misc/hrm_vc31.c index 0e08237bae..8a910d98dd 100644 --- a/libs/misc/hrm_vc31.c +++ b/libs/misc/hrm_vc31.c @@ -690,12 +690,12 @@ void vc31_irqhandler(bool state, IOEventFlags flags) { static void vc31_watch_on() { jshSetPinShouldStayWatched(HEARTRATE_PIN_INT,true); - IOEventFlags channel = jshPinWatch(HEARTRATE_PIN_INT, true); + IOEventFlags channel = jshPinWatch(HEARTRATE_PIN_INT, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, vc31_irqhandler); } static void vc31_watch_off() { - jshPinWatch(HEARTRATE_PIN_INT, false); + jshPinWatch(HEARTRATE_PIN_INT, false, JSPW_NONE); jshSetPinShouldStayWatched(HEARTRATE_PIN_INT,false); } diff --git a/libs/puckjs/jswrap_puck.c b/libs/puckjs/jswrap_puck.c index 6e084cf982..2a9cdac728 100644 --- a/libs/puckjs/jswrap_puck.c +++ b/libs/puckjs/jswrap_puck.c @@ -739,10 +739,10 @@ void jswrap_puck_magOn(JsVarFloat hz) { * go around the idle loop and call jswrap_puck_idle - which * is where we actually collect the data. */ if (puckVersion == PUCKJS_1V0) { - jshPinWatch(MAG_PIN_INT, true); + jshPinWatch(MAG_PIN_INT, true, JSPW_NONE); jshPinSetState(MAG_PIN_INT, JSHPINSTATE_GPIO_IN); } else if (puckVersion == PUCKJS_2V0) { - jshPinWatch(MAG_PIN_DRDY, true); + jshPinWatch(MAG_PIN_DRDY, true, JSPW_NONE); jshPinSetState(MAG_PIN_DRDY, JSHPINSTATE_GPIO_IN); } // 2v1 doesn't have an IRQ line - we poll with peripheralPollHandler mag_enabled = true; @@ -760,9 +760,9 @@ Turn the magnetometer off void jswrap_puck_magOff() { if (mag_enabled) { if (puckVersion == PUCKJS_1V0) { - jshPinWatch(MAG_PIN_INT, false); + jshPinWatch(MAG_PIN_INT, false, JSPW_NONE); } else if (puckVersion == PUCKJS_2V0) { - jshPinWatch(MAG_PIN_DRDY, false); + jshPinWatch(MAG_PIN_DRDY, false, JSPW_NONE); } // 2v1 doesn't have an IRQ line mag_off(); } @@ -919,7 +919,7 @@ void jswrap_puck_accelOn(JsVarFloat hz) { if (!accel_on(milliHz)) { jsExceptionHere(JSET_ERROR, "Invalid sample rate %f - must be 1660, 833, 416, 208, 104, 52, 26, 12.5, 1.6 Hz", hz); } - jshPinWatch(ACCEL_PIN_INT, true); + jshPinWatch(ACCEL_PIN_INT, true, JSPW_NONE); accel_enabled = true; } @@ -941,7 +941,7 @@ void jswrap_puck_accelOff() { return; } if (accel_enabled) { - jshPinWatch(ACCEL_PIN_INT, false); + jshPinWatch(ACCEL_PIN_INT, false, JSPW_NONE); accel_off(); } accel_enabled = false; diff --git a/libs/trigger/jswrap_trigger.c b/libs/trigger/jswrap_trigger.c index ba7e90eacc..04c91135cc 100644 --- a/libs/trigger/jswrap_trigger.c +++ b/libs/trigger/jswrap_trigger.c @@ -102,9 +102,9 @@ void jswrap_trig_setup(Pin pin, JsVar *options) { trig->wrongTriggerTeeth = 0; // finally set up the watch! if (jshIsPinValid(trig->sensorPin)) - jshPinWatch(trig->sensorPin, false); + jshPinWatch(trig->sensorPin, false, JSPW_NONE); trig->sensorPin = pin; - jshPinWatch(trig->sensorPin, true); + jshPinWatch(trig->sensorPin, true, JSPW_HIGH_SPEED); } /*JSON{ diff --git a/src/jshardware.h b/src/jshardware.h index 37c96762a5..d562fd1d27 100644 --- a/src/jshardware.h +++ b/src/jshardware.h @@ -198,10 +198,16 @@ typedef enum { /// Output an analog value on a pin - either via DAC, hardware PWM, or software PWM JshPinFunction jshPinAnalogOutput(Pin pin, JsVarFloat value, JsVarFloat freq, JshAnalogOutputFlags flags); // if freq<=0, the default is used +/// Flags for jshPinAnalogOutput +typedef enum { + JSPW_NONE, + JSPW_HIGH_SPEED = 1, ///< Should use high accuracy if available (higher power draw) +} JshPinWatchFlags; + /// Can the given pin be watched? it may not be possible because of conflicts bool jshCanWatch(Pin pin); /// start watching pin - return the EXTI (IRQ number flag) associated with it -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch); +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags); /// Given a Pin, return the current pin function associated with it JshPinFunction jshGetCurrentPinFunction(Pin pin); diff --git a/src/jsinteractive.c b/src/jsinteractive.c index 4e386bbc80..6f35b7022c 100644 --- a/src/jsinteractive.c +++ b/src/jsinteractive.c @@ -489,7 +489,8 @@ void jsiSoftInit(bool hasBeenReset) { while (jsvObjectIteratorHasValue(&it)) { JsVar *watch = jsvObjectIteratorGetValue(&it); JsVar *watchPin = jsvObjectGetChild(watch, "pin", 0); - jshPinWatch(jshGetPinFromVar(watchPin), true); + bool highAcc = jsvGetBoolAndUnLock(jsvObjectGetChild(watch, "hispeed", 0)); + jshPinWatch(jshGetPinFromVar(watchPin), true, highAcc?JSPW_HIGH_SPEED:JSPW_NONE); jsvUnLock2(watchPin, watch); jsvObjectIteratorNext(&it); } @@ -741,7 +742,7 @@ void jsiSoftKill() { while (jsvObjectIteratorHasValue(&it)) { JsVar *watchPtr = jsvObjectIteratorGetValue(&it); JsVar *watchPin = jsvObjectGetChild(watchPtr, "pin", 0); - jshPinWatch(jshGetPinFromVar(watchPin), false); + jshPinWatch(jshGetPinFromVar(watchPin), false, JSPW_NONE); jsvUnLock2(watchPin, watchPtr); jsvObjectIteratorNext(&it); } @@ -2042,7 +2043,7 @@ void jsiIdle() { jsvObjectIteratorRemoveAndGotoNext(&it, watchArrayPtr); hasDeletedWatch = true; if (!jsiIsWatchingPin(pin)) - jshPinWatch(pin, false); + jshPinWatch(pin, false, JSPW_NONE); } jsvUnLock(watchCallback); } @@ -2168,7 +2169,7 @@ void jsiIdle() { jsvUnLock(watchArrayPtr); Pin pin = jshGetPinFromVarAndUnLock(jsvObjectGetChild(watchPtr, "pin", 0)); if (!jsiIsWatchingPin(pin)) - jshPinWatch(pin, false); + jshPinWatch(pin, false, JSPW_NONE); } } jsvUnLock(watchPtr); diff --git a/src/jsserial.c b/src/jsserial.c index 3298b38b65..4f138c1ac2 100644 --- a/src/jsserial.c +++ b/src/jsserial.c @@ -221,7 +221,7 @@ bool jsserialEventCallbackInit(JsVar *parent, JshUSARTInfo *inf) { data->bitCnt = 0; data->frameSize = inf->bytesize + inf->stopbits + (inf->parity?1:0); - IOEventFlags exti = jshPinWatch(inf->pinRX, true); + IOEventFlags exti = jshPinWatch(inf->pinRX, true, JSPW_HIGH_SPEED); if (exti) { jsvObjectSetChildAndUnLock(parent, "exti", jsvNewFromInteger(exti)); JsVar *list = jsserialGetSerialList(true); @@ -242,7 +242,7 @@ void jsserialEventCallbackKill(JsVar *parent, JshUSARTInfo *inf) { JsVar *v = jsvObjectGetChild(parent, "exti", 0); if (v) { IOEventFlags exti = (IOEventFlags)jsvGetIntegerAndUnLock(v); - jshPinWatch(exti, false); + jshPinWatch(exti, false, JSPW_NONE); JsVar *list = jsserialGetSerialList(false); if (list) { JsVar *parentName = jsvGetArrayIndex(list, (JsVarInt)exti); diff --git a/src/jswrap_io.c b/src/jswrap_io.c index 1dcebde327..c7aad37294 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -644,6 +644,11 @@ If the `options` parameter is an object, it can contain the following informatio // Advanced: If specified, the given pin will be read whenever the watch is called // and the state will be included as a 'data' field in the callback data : pin + // Advanced: On Nordic devices, a watch may be 'high' or 'low' accuracy. By default low + // accuracy is used (which is better for power consumption), but this means that + // high speed pulses (less than 25us) may not be reliably received. Setting hispeed=true + // allows for detecting high speed pulses at the expense of higher idle power consumption + hispeed : true } ``` @@ -691,7 +696,7 @@ JsVar *jswrap_interface_setWatch( bool repeat = false; JsVarFloat debounce = 0; int edge = 0; - bool isIRQ = false; + bool isIRQ = false, isHighSpeed = false; Pin dataPin = PIN_UNDEFINED; if (IS_PIN_A_BUTTON(pin)) { edge = 1; @@ -724,6 +729,7 @@ JsVar *jswrap_interface_setWatch( return 0; } isIRQ = jsvGetBoolAndUnLock(jsvObjectGetChild(repeatOrObject, "irq", 0)); + isHighSpeed = jsvGetBoolAndUnLock(jsvObjectGetChild(repeatOrObject, "hispeed", 0)); dataPin = jshGetPinFromVarAndUnLock(jsvObjectGetChild(repeatOrObject, "data", 0)); } else repeat = jsvGetBool(repeatOrObject); @@ -740,12 +746,14 @@ JsVar *jswrap_interface_setWatch( if (edge) jsvObjectSetChildAndUnLock(watchPtr, "edge", jsvNewFromInteger(edge)); jsvObjectSetChild(watchPtr, "callback", func); // no unlock intentionally jsvObjectSetChildAndUnLock(watchPtr, "state", jsvNewFromBool(jshPinInput(pin))); + if (isHighSpeed) + jsvObjectSetChildAndUnLock(watchPtr, "hispeed", jsvNewFromBool(true)); } // If nothing already watching the pin, set up a watch IOEventFlags exti = EV_NONE; if (!jsiIsWatchingPin(pin)) - exti = jshPinWatch(pin, true); + exti = jshPinWatch(pin, true, isHighSpeed ? JSPW_HIGH_SPEED : JSPW_NONE); // disable event callbacks by default if (exti) { jshSetEventCallback(exti, 0); @@ -797,7 +805,7 @@ void jswrap_interface_clearWatch(JsVar *idVarArr) { JsVar *watchPin = jsvObjectGetChild(watchPtr, "pin", 0); Pin pin = jshGetPinFromVar(watchPin); if (!jshGetPinShouldStayWatched(pin)) - jshPinWatch(pin, false); + jshPinWatch(pin, false, JSPW_NONE); jsvUnLock2(watchPin, watchPtr); jsvObjectIteratorNext(&it); } @@ -825,7 +833,7 @@ void jswrap_interface_clearWatch(JsVar *idVarArr) { // Now check if this pin is still being watched if (!jsiIsWatchingPin(pin)) - jshPinWatch(pin, false); // 'unwatch' pin + jshPinWatch(pin, false, JSPW_NONE); // 'unwatch' pin } else { jsExceptionHere(JSET_ERROR, "Unknown Watch %v", idVar); } diff --git a/targets/emscripten/jshardware.c b/targets/emscripten/jshardware.c index 7addeae943..385660a65b 100644 --- a/targets/emscripten/jshardware.c +++ b/targets/emscripten/jshardware.c @@ -158,7 +158,7 @@ IOEventFlags jshGetEventFlagsForPin(Pin pin) { return EV_NONE; } -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch) { +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags) { if (shouldWatch) for (int i=0;i<16;i++) if (eventFlagsToPin[i]==PIN_UNDEFINED) { diff --git a/targets/esp32/jshardware.c b/targets/esp32/jshardware.c index 5a6874e618..ab5139914d 100644 --- a/targets/esp32/jshardware.c +++ b/targets/esp32/jshardware.c @@ -452,8 +452,9 @@ bool jshCanWatch( * \return The event flag for this pin. */ IOEventFlags jshPinWatch( - Pin pin, //!< The pin to be watched. - bool shouldWatch //!< True for watching and false for unwatching. + Pin pin, //!< The pin to be watched. + bool shouldWatch, //!< True for watching and false for unwatching. + JshPinWatchFlags flags ) { gpio_num_t gpioNum = pinToESP32Pin(pin); if(shouldWatch){ diff --git a/targets/esp8266/jshardware.c b/targets/esp8266/jshardware.c index 481303b135..c92b5d3e47 100644 --- a/targets/esp8266/jshardware.c +++ b/targets/esp8266/jshardware.c @@ -698,8 +698,9 @@ bool jshCanWatch( * \return The event flag for this pin. */ IOEventFlags jshPinWatch( - Pin pin, //!< The pin to be watched. - bool shouldWatch //!< True for watching and false for unwatching. + Pin pin, //!< The pin to be watched. + bool shouldWatch, //!< True for watching and false for unwatching. + JshPinWatchFlags flags ) { //os_printf("> jshPinWatch: pin=%d, shouldWatch=%d\n", pin, shouldWatch); if (jshIsPinValid(pin)) { diff --git a/targets/linux/jshardware.c b/targets/linux/jshardware.c index 7b2ee01a19..b369d05293 100644 --- a/targets/linux/jshardware.c +++ b/targets/linux/jshardware.c @@ -588,7 +588,7 @@ bool jshCanWatch(Pin pin) { return false; } -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch) { +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags) { if (jshIsPinValid(pin)) { IOEventFlags exti = getNewEVEXTI(); if (shouldWatch) { diff --git a/targets/nrf5x/jshardware.c b/targets/nrf5x/jshardware.c index a76dba9395..2f7506f0d9 100644 --- a/targets/nrf5x/jshardware.c +++ b/targets/nrf5x/jshardware.c @@ -1592,7 +1592,7 @@ bool jshCanWatch(Pin pin) { return true; } -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch) { +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags) { if (!jshIsPinValid(pin)) return EV_NONE; #if JSH_PORTV_COUNT>0 // handle virtual ports (eg. pins on an IO Expander) @@ -1606,7 +1606,7 @@ IOEventFlags jshPinWatch(Pin pin, bool shouldWatch) { if (extiToPin[i] == p) return EV_EXTI0+i; //already allocated if (extiToPin[i] == PIN_UNDEFINED) { // use low accuracy for GPIOTE as we can shut down the high speed oscillator then - nrf_drv_gpiote_in_config_t cls_1_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false /* hi/low accuracy */); + nrf_drv_gpiote_in_config_t cls_1_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE((flags&JSPW_HIGH_SPEED)!=0 /* hi/low accuracy */); cls_1_config.is_watcher = true; // stop this resetting the input state if (nrf_drv_gpiote_in_init(p, &cls_1_config, jsvPinWatchHandler)!=0) { jsWarn("No free GPIOTE for watch"); diff --git a/targets/stm32/jshardware.c b/targets/stm32/jshardware.c index 3ddac2b8fd..3d69566afa 100644 --- a/targets/stm32/jshardware.c +++ b/targets/stm32/jshardware.c @@ -1980,7 +1980,7 @@ bool jshCanWatch(Pin pin) { return false; } -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch) { +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags) { if (jshIsPinValid(pin)) { // TODO: check for DUPs, also disable interrupt /*int idx = pinToPinSource(IOPIN_DATA[pin].pin); diff --git a/targets/stm32_ll/jshardware.c b/targets/stm32_ll/jshardware.c index aa0aed2199..f8a61a92d8 100644 --- a/targets/stm32_ll/jshardware.c +++ b/targets/stm32_ll/jshardware.c @@ -1490,7 +1490,7 @@ bool jshCanWatch(Pin pin){ } /// start watching pin - return the EXTI (IRQ number flag) associated with it -IOEventFlags jshPinWatch(Pin pin, bool shouldWatch){ +IOEventFlags jshPinWatch(Pin pin, bool shouldWatch, JshPinWatchFlags flags) { if (jshIsPinValid(pin)) { // TODO: check for DUPs, also disable interrupt /*int idx = pinToPinSource(IOPIN_DATA[pin].pin); From 0480d93a893da9acfe8ac5bad3f4fdccf1a6411d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 5 May 2022 13:45:54 +0100 Subject: [PATCH 0050/1183] fix build regressions --- libs/banglejs/jswrap_bangle.c | 4 ++-- targets/stm32/jshardware.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 8758710eb4..49d27bd4f3 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -4546,7 +4546,7 @@ static void jswrap_banglejs_periph_off() { the sensing to be disabled such that nrf_gpio_cfg_sense_set(pin, NRF_GPIO_PIN_SENSE_LOW) no longer works. To work around this we just call our standard pin watch function to re-enable everything. */ - jshPinWatch(BTN1_PININDEX, true); + jshPinWatch(BTN1_PININDEX, true, JSPW_NONE); nrf_gpio_cfg_sense_set(pinInfo[BTN1_PININDEX].pin, NRF_GPIO_PIN_SENSE_LOW); #else jsExceptionHere(JSET_ERROR, ".off not implemented on emulator"); @@ -4595,7 +4595,7 @@ void jswrap_banglejs_softOff() { jswrap_ble_sleep(); jswrap_banglejs_periph_off(); jshDelayMicroseconds(100000); // wait 100ms for any button bounce to disappear - IOEventFlags channel = jshPinWatch(BTN1_PININDEX, true); + IOEventFlags channel = jshPinWatch(BTN1_PININDEX, true, JSPW_NONE); if (channel!=EV_NONE) jshSetEventCallback(channel, (JshEventCallbackCallback)jshHadEvent); // keep sleeping until a button is pressed jshKickWatchDog(); diff --git a/targets/stm32/jshardware.c b/targets/stm32/jshardware.c index 3d69566afa..713f44cccc 100644 --- a/targets/stm32/jshardware.c +++ b/targets/stm32/jshardware.c @@ -2573,13 +2573,13 @@ bool jshSleep(JsSysTime timeUntilWake) { Pin usbPin = JSH_PORTA_OFFSET+11; jshPinSetState(usbPin, JSHPINSTATE_GPIO_IN_PULLUP); Pin oldWatch = watchedPins[pinInfo[usbPin].pin]; - jshPinWatch(usbPin, true); + jshPinWatch(usbPin, true, JSPW_NONE); #endif #ifdef USB_VSENSE_PIN // USB_VSENSE_PIN is connected to USB 5v (and pulled down by a 100k resistor) // ... so wake up if it goes high Pin oldWatch = watchedPins[pinInfo[USB_VSENSE_PIN].pin]; - jshPinWatch(USB_VSENSE_PIN, true); + jshPinWatch(USB_VSENSE_PIN, true, JSPW_NONE); #endif #endif // USB @@ -2636,8 +2636,8 @@ bool jshSleep(JsSysTime timeUntilWake) { #ifdef STM32F1 wokenByUSB = jshPinGetValue(usbPin)==0; // remove watches on pins - jshPinWatch(usbPin, false); - if (oldWatch!=PIN_UNDEFINED) jshPinWatch(oldWatch, true); + jshPinWatch(usbPin, false, JSPW_NONE); + if (oldWatch!=PIN_UNDEFINED) jshPinWatch(oldWatch, true, JSPW_NONE); jshPinSetState(usbPin, JSHPINSTATE_GPIO_IN); #endif #ifdef USB_VSENSE_PIN @@ -2645,8 +2645,8 @@ bool jshSleep(JsSysTime timeUntilWake) { // setting that we've woken lets the board stay awake // until a USB connection can be established if (jshPinGetValue(USB_VSENSE_PIN)) wokenByUSB=true; - jshPinWatch(USB_VSENSE_PIN, false); - if (oldWatch!=PIN_UNDEFINED) jshPinWatch(oldWatch, true); + jshPinWatch(USB_VSENSE_PIN, false, JSPW_NONE); + if (oldWatch!=PIN_UNDEFINED) jshPinWatch(oldWatch, true, JSPW_NONE); #endif #endif // recover oscillator From eea77082d8810c8a908f0873e4b9854e93593f5e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 5 May 2022 22:00:28 +0100 Subject: [PATCH 0051/1183] 1+2+3+4-5 actually works, and returns a usable JsVar Long way to go but this actually proves things can work --- README_JIT.md | 18 +++++++++++ src/jsjit.c | 11 +++++-- src/jsjit.h | 1 + src/jsjitc.c | 71 +++++++++++++++++++++++++++++++++++++------ src/jsjitc.h | 12 +++++++- src/jsparse.c | 8 ++++- src/jswrap_espruino.c | 21 +++++++++++++ src/jswrap_espruino.h | 2 ++ 8 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 README_JIT.md diff --git a/README_JIT.md b/README_JIT.md new file mode 100644 index 0000000000..26beac66fb --- /dev/null +++ b/README_JIT.md @@ -0,0 +1,18 @@ +JIT compiler testing +==================== + +* Compile with `USE_JIT=1 DEBUG=1 make` +* Test with `./espruino --test-jit` +* Dump binary with `arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin` +* Simple executable test `var jit = E.nativeCall(1, "JsVar()", E.JIT("1"))` + +* Build for ARM: `USE_JIT=1 BOARD=NRF52832DK_MIN RELEASE=1 make flash` + + +Run JIT on ARM and disassemble: + +``` +btoa(E.JIT("1")) +echo ASBL8Kz7AbQBvHBH | base64 -d > jit.bin +arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin +``` diff --git a/src/jsjit.c b/src/jsjit.c index 643158ad84..a02da90bf2 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -323,13 +323,16 @@ void jsjBinaryExpression() { void jsjBlockOrStatement() { jsjBinaryExpression(); // FIXME + // FIXME REALLY + jsjPopAsVar(0); // a -> r0 } -JsVar *jsjParse() { +void jsjParse() { + jsjcPushAll(); // FIXME REALLY while (JSJ_PARSING && lex->tk != LEX_EOF) { jsjBlockOrStatement(); } - return 0; + jsjcPopAllAndReturn(); // FIXME REALLY } JsVar *jsjEvaluateVar(JsVar *str) { @@ -337,7 +340,9 @@ JsVar *jsjEvaluateVar(JsVar *str) { assert(jsvIsString(str)); JsLex *oldLex = jslSetLex(&lex); jslInit(str); - JsVar *v = jsjParse(); + jsjcStart(); + jsjParse(); + JsVar *v = jsjcStop(); jslKill(); jslSetLex(oldLex); return v; diff --git a/src/jsjit.h b/src/jsjit.h index 183729f2cb..95181b3c26 100644 --- a/src/jsjit.h +++ b/src/jsjit.h @@ -17,6 +17,7 @@ #include "jsparse.h" +JsVar *jsjEvaluateVar(JsVar *str); JsVar *jsjEvaluate(const char *str); #endif /* JSJIT_H_ */ diff --git a/src/jsjitc.c b/src/jsjitc.c index 4466f079d3..3702fbcd1d 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -15,23 +15,55 @@ https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf */ #ifdef ESPR_JIT + +#define DEBUG_JIT jsiConsolePrintf +#if defined(LINUX) && defined(DEBUG) +#define JIT_OUTPUT_FILE "jit.bin" +#endif + #include "jsjitc.h" #include "jsinteractive.h" -#define DEBUG_JIT jsiConsolePrintf +#ifdef JIT_OUTPUT_FILE +#include +FILE *f; +#endif +JsVar *jitCode = 0; + +void jsjcStart() { +#ifdef JIT_OUTPUT_FILE + f = fopen(JIT_OUTPUT_FILE, "wb"); +#endif + jitCode = jsvNewFromEmptyString(); +} + +JsVar *jsjcStop() { +#ifdef JIT_OUTPUT_FILE + fclose(f); +#endif + JsVar *v = jsvAsFlatString(jitCode); + jsvUnLock(jitCode); + jitCode = 0; + return v; +} void jsjcEmit16(uint16_t v) { DEBUG_JIT("> %04x\n", v); +#ifdef JIT_OUTPUT_FILE + fputc(v&255, f); + fputc(v>>8, f); +#endif + jsvAppendStringBuf(jitCode, &v, 2); } -void jsjcLiteral8(uint8_t reg, uint8_t data) { +void jsjcLiteral8(int reg, uint8_t data) { assert(reg<8); // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 int n = 0b0010000000000000 | (reg<<8) | data; jsjcEmit16(n); } -void jsjcLiteral16(uint8_t reg, bool hi16, uint16_t data) { +void jsjcLiteral16(int reg, bool hi16, uint16_t data) { assert(reg<16); // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 int imm4,i,imm3,imm8; @@ -44,7 +76,7 @@ void jsjcLiteral16(uint8_t reg, bool hi16, uint16_t data) { } void jsjcLiteral32(int reg, uint32_t data) { - DEBUG_JIT("L32 r%d,0x%08x\n", reg,data); + DEBUG_JIT("L32 r%d,0x%08x\n", reg,data); // wrong? // bit shifted 8 bits? https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Immediate-constants/Encoding?lang=en // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/MOVT if (data<256) { @@ -70,25 +102,46 @@ void _jsjcCall(void *c, const char *name) { void jsjcCall(void *c) { DEBUG_JIT("CALL 0x%08x\n", (uint32_t)c); #endif - jsjcLiteral32(7, (uint32_t)c); // save address to r7 - jsjcEmit16(0b0100011110000000 | (7<<3)); // BLX reg 7 + /* if (((uint32_t)c) < 0x7FFFFF) { // BL + immediate(PC relative!) + uint32_t v = ((uint32_t)c)>>1; + jsjcEmit16(0b1111000000000000 | ((v>>11)&0x7FF)); + jsjcEmit16(0b1111100000000000 | (v&0x7FF)); + } else */{ + jsjcLiteral32(7, (uint32_t)c); // save address to r7 + jsjcEmit16(0b0100011110000000 | (7<<3)); // BL reg 7 - BROKEN? + } } void jsjcMov(int regFrom, int regTo) { - DEBUG_JIT("MOV r%d r%d\n", regFrom, regTo); + DEBUG_JIT("MOV r%d -> r%d\n", regFrom, regTo); jsjcEmit16(0b0100011000000000 | ((regTo&8)?128:0) | (regFrom<<3) | (regTo&7)); } void jsjcPush(int reg, JsjValueType type) { - DEBUG_JIT("PUSH r%d\n", reg); + DEBUG_JIT("PUSH {r%d}\n", reg); jsjcEmit16(0b1011010000000000 | (1<tk==LEX_STR) { if (!strcmp(jslGetTokenValueAsString(), "compiled")) jsWarn("Function marked with \"compiled\" uploaded in source form"); - if (lex->tk==LEX_STR && !strcmp(jslGetTokenValueAsString(), "ram")) { + if (!strcmp(jslGetTokenValueAsString(), "ram")) { JSP_ASSERT_MATCH(LEX_STR); forcePretokenise = true; } +#ifdef ESPR_JIT + if (!strcmp(jslGetTokenValueAsString(), "jit")) { + JSP_ASSERT_MATCH(LEX_STR); + jsWarn("FIXME - JIT compile this function"); + } +#endif } #endif diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index ada0f5e65b..304b2d9d46 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -24,6 +24,9 @@ #ifdef PUCKJS #include "jswrap_puck.h" // jswrap_puck_getTemperature #endif +#ifdef ESPR_JIT +#include "jsjit.h" +#endif /*JSON{ "type" : "class", @@ -2063,3 +2066,21 @@ JsVar *jswrap_espruino_decodeUTF8(JsVar *str, JsVar *lookup, JsVar *replaceFn) { jsvStringIteratorFree(&dit); return dst; } + + +/*JSON{ + "type" : "staticmethod", + "ifndef" : "SAVE_ON_FLASH", + "class" : "E", + "name" : "JIT", + "generate" : "jswrap_espruino_JIT", + "params" : [ + ["str","JsVar","A string of JS to JIT compile"] + ], + "return" : ["JsVar","A flat string of binary ARM Thumb 2 code"] +} +TEMPORARY function for testing only + */ +JsVar *jswrap_espruino_JIT(JsVar *js) { + return jsjEvaluateVar(js); +} diff --git a/src/jswrap_espruino.h b/src/jswrap_espruino.h index 0ec5800569..521548febc 100644 --- a/src/jswrap_espruino.h +++ b/src/jswrap_espruino.h @@ -67,3 +67,5 @@ JsVarInt jswrap_espruino_getBattery(); void jswrap_espruino_setRTCPrescaler(int prescale); int jswrap_espruino_getRTCPrescaler(bool calibrate); JsVar *jswrap_espruino_decodeUTF8(JsVar *str, JsVar *lookup, JsVar *replaceFn); + +JsVar *jswrap_espruino_JIT(JsVar *js); From 2cd16032c37a0004f92be8d817502e198c0ebde5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 6 May 2022 08:52:47 +0100 Subject: [PATCH 0052/1183] Bangle.js2: E.showMenu now returns 'scroller', `format` is called with a second argument, font in popup is scaled to fit (fix #2190) --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 12 +++++++++++- libs/js/banglejs/E_showMenu_Q3.js | 21 ++++++++++----------- libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++++------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ee2f3c147..528925fdac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,7 @@ Bangle.js2: Touch/drag coordinates now obey g.setRotation Graphics: Fix drawString with combination of g.setClipRect and g.setRotation nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. + Bangle.js2: E.showMenu now returns 'scroller', `format` is called with a second argument, font in popup is scaled to fit (fix #2190) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 49d27bd4f3..b4ba5d3a68 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -4829,7 +4829,7 @@ var boolean = false; var number = 50; // First menu var mainmenu = { - "" : { title : "-- Main Menu --" }, + "" : { title : "-- Main Menu --" }, // options "LED On" : function() { LED1.set(); }, "LED Off" : function() { LED1.reset(); }, "Submenu" : function() { E.showMenu(submenu); }, @@ -4860,6 +4860,16 @@ The menu will stay onscreen and active until explicitly removed, which you can do by calling `E.showMenu()` without arguments. See http://www.espruino.com/graphical_menu for more detailed information. + +On Bangle.js there are a few additions over the standard `graphical_menu`: + +* The options object can contain: + * `back : function() { }` - add a 'back' button, with the function called when it is pressed + * (Bangle.js 2) `scroll : int` - an integer specifying how much the initial menu should be scrolled by +* The object returned by `E.showMenu` contains: + * (Bangle.js 2) `scroller` - the object returned by `E.showScroller` - `scroller.scroll` returns the amount the menu is currently scrolled by +* In the object specified for editable numbers: + * (Bangle.js 2) the `format` function is called with `format(value)` in the main menu, `format(value,1)` when in a scrollable list, or `format(value,2)` when in a popup window. */ /*JSON{ diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 1a352bd5fd..93a308de5c 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -34,7 +34,7 @@ menuIcon+" "+title, r.x+12, r.y+H-12); g.setColor(g.theme.bg2).fillRect({x:r.x+4,y:r.y+2,w:r.w-8, h:r.h-4, r:5}); var v = idx*step + item.min; - g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString((item.format) ? item.format(v) : v, r.x+12, r.y+H/2); + g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString((item.format) ? item.format(v,1) : v, r.x+12, r.y+H/2); g.drawImage(/* 20x20 */atob(v==item.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"), r.x+r.w-32, r.y+H/2-10); }, select : function(idx) { @@ -55,9 +55,9 @@ menuIcon+" "+title, R.x+R.w/2,R.y+12); function draw() { - var mx = R.x+R.w/2, my = 12+R.y+R.h/2; + var mx = R.x+R.w/2, my = 12+R.y+R.h/2, txt = item.format?item.format(v,2):v, s = 30; g.reset().setColor(g.theme.bg2).fillRect({x:R.x+24, y:R.y+36, w:R.w-48, h:R.h-48, r:5}); - g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(item.format?item.format(v):v, mx, my); + g.setColor(g.theme.fg2).setFontVector(Math.min(30,(R.w-52)*100/g.setFontVector(100).stringWidth(txt))).setFontAlign(0,0).drawString(txt, mx, my); g.fillPoly([mx,my-45, mx+15,my-30, mx-15,my-30]).fillPoly([mx,my+45, mx+15,my+30, mx-15,my+30]); } draw(); @@ -80,12 +80,12 @@ } } var l = { - draw : ()=>s.draw() - }; - - var scr = { + draw : ()=>l.scroller.draw(), + scroller : undefined + }; + var scr = { h : H, c : keys.length/*title*/, - scrollMin : -24, scroll : -24, // title is 24px, rendered at -1 + scrollMin : -24, scroll : options.scroll===undefined?-24:options.scroll, // title is 24px, rendered at -1 back : back, draw : (idx, r) => { if (idx<0) // TITLE @@ -131,10 +131,9 @@ } } }; - var s; function show() { - s = E.showScroller(scr); + l.scroller = E.showScroller(scr); } show(); return l; -}) +}) \ No newline at end of file diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index df4f66f322..e5ab3e9506 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:n,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; -g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); -g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(30).setFontAlign(0,0).drawString(a.format?a.format(e):e,c,l);g.fillPoly([c,l-45,c+15,l-30,c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI({mode:"updown", -back:n},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=p.scroll;n()}})}}function n(){p=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var t=q.back||k["< Back"],m=Object.keys(k).filter(a=>""!=a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format|| -(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var u={draw:()=>p.draw()},r={h:40,c:m.length,scrollMin:-24,scroll:-24,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+ -4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(u);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);p.drawItem(a)}}},p;n();return u}) \ No newline at end of file +(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:p,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; +g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f,1):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=s.scroll;p()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); +g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2,u=a.format?a.format(e,2):e;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(d.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,l);g.fillPoly([c,l-45,c+15,l-30, +c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI({mode:"updown",back:p},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=s.scroll;p()}})}}function p(){q.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var n=k[""]||{};n.title||(n.title="Menu");var t=n.back||k["< Back"],m=Object.keys(k).filter(a=>""!= +a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var q={draw:()=>q.scroller.draw(),scroller:void 0},r={h:40,c:m.length,scrollMin:-24,scroll:void 0===n.scroll?-24:n.scroll,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ +n.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1< +d.length&&(g.setFont("6x15"),d=g.wrapString(m[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(q);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};p();return q}) \ No newline at end of file From 088e6f26a27be4be2f78741ecd125b39026d2493 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 6 May 2022 10:29:01 +0100 Subject: [PATCH 0053/1183] Support for strings and variable lookups --- README_JIT.md | 29 ++++++++++++++++++++-- src/jsjit.c | 46 ++++++++++++++++------------------ src/jsjitc.c | 68 ++++++++++++++++++++++++++++++++++++++------------- src/jsjitc.h | 32 +++++++++++++++++++++++- 4 files changed, 130 insertions(+), 45 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 26beac66fb..39e17a689c 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -1,13 +1,38 @@ JIT compiler testing ==================== -* Compile with `USE_JIT=1 DEBUG=1 make` +* Build for Linux `USE_JIT=1 DEBUG=1 make` * Test with `./espruino --test-jit` +* CLI test `./espruino -e "E.JIT('\'Hello\'')"` * Dump binary with `arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin` -* Simple executable test `var jit = E.nativeCall(1, "JsVar()", E.JIT("1"))` * Build for ARM: `USE_JIT=1 BOARD=NRF52832DK_MIN RELEASE=1 make flash` +``` +var jit = E.nativeCall(1, "JsVar()", E.JIT("1")) +jit()==1 + +var jit = E.nativeCall(1, "JsVar()", E.JIT("1+2+3+4-5")) +jit()==5 + +var jit = E.nativeCall(1, "JsVar()", E.JIT("'Hello'")) +jit()=="Hello" + +var jit = E.nativeCall(1, "JsVar()", E.JIT("true")) +jit()==true + +var test = "Hello world"; +var jit = E.nativeCall(1, "JsVar()", E.JIT("test")) + + +var test = "Hello "; +var jit = E.nativeCall(1, "JsVar()", E.JIT("test+'World!'")) +jit()=="Hello World!" +``` + + + + Run JIT on ARM and disassemble: diff --git a/src/jsjit.c b/src/jsjit.c index a02da90bf2..d3df0cdc2e 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -21,7 +21,6 @@ #define JSP_MATCH(TOKEN) if (!jslMatch((TOKEN))) return; // Match where the user could have given us the wrong token #define JSJ_PARSING true -JsVar *jsjStringPool; // ---------------------------------------------------------------------------- void jsjUnaryExpression(); // ---------------------------------------------------------------------------- @@ -30,9 +29,9 @@ void jsjPopAsVar(int reg) { JsjValueType varType = jsjcPop(reg); if (varType==JSJVT_JSVAR) return; if (varType==JSJVT_INT) { - if (reg) jsjcMov(reg, 0); - jsjcCall(jsvNewFromInteger); // FIXME: what about clobbering r1-r3? if (reg) jsjcMov(0, reg); + jsjcCall(jsvNewFromInteger); // FIXME: what about clobbering r1-r3? + if (reg) jsjcMov(reg, 0); return; } assert(0); @@ -40,13 +39,12 @@ void jsjPopAsVar(int reg) { void jsjFactor() { if (lex->tk==LEX_ID) { - const char *v = jslGetTokenValueAsString(); - uint32_t offset = (uint32_t)jsvGetStringLength(jsjStringPool); - jsvAppendStringBuf(jsjStringPool, v, strlen(v)+1); // include trailing 0 + JsVar *a = jslGetTokenValueAsVar(); + jsjcLiteralString(0, a, true); // null terminated + jsvUnLock(a); JSP_ASSERT_MATCH(LEX_ID); - jsjcLiteral32(1, offset); // TODO: store token values jsjcCall(jspGetNamedVariable); - jsjcPush(0, JSJVT_JSVAR); + jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here - is that ok? } else if (lex->tk==LEX_INT) { int64_t v = stringToInt(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_INT); @@ -86,13 +84,10 @@ void jsjFactor() { } else if (lex->tk==LEX_STR) { JsVar *a = jslGetTokenValueAsVar(); JSP_ASSERT_MATCH(LEX_STR); - int offset = (int)jsvGetStringLength(jsjStringPool); - int len = (int)jsvGetStringLength(a); - jsvAppendStringVarComplete(jsjStringPool, a); + int len = jsjcLiteralString(1, a, false); jsvUnLock(a); jsjcLiteral32(0, len); - jsjcLiteral32(1, offset); - jsjcCall(jsvNewStringOfLength); + jsjcCall(jsvNewStringOfLength); jsjcPush(0, JSJVT_JSVAR); }/* else if (lex->tk=='{') { if (!jspCheckStackPosition()) return 0; @@ -164,19 +159,19 @@ void jsjPostfixExpression() { jsjPostfixExpression(); jsjcLiteral32(0, 1); jsjcCall(jsvNewFromInteger); - jsjcMov(0, 1); - jsjcMov(0, 4); // preserve 'one' for call + jsjcMov(1, 0); + jsjcMov(4, 0); // preserve 'one' for call jsjcPop(1); - jsjcMov(0, 5); // preserve 'a' for call + jsjcMov(5, 0); // preserve 'a' for call jsjcLiteral32(3, op==LEX_PLUSPLUS ? '+' : '-'); jsjcCall(jsvMathsOpSkipNames); - jsjcMov(4, 0); // one -> r0 + jsjcMov(0, 4); // one -> r0 jsjcCall(jsvUnLock); // jsvUnLock(one) - jsjcMov(0, 1); // res -> r1 - jsjcMov(0, 4); // res -> r0 - jsjcMov(5, 0); // a -> r0 - jsjcCall(jsvReplaceWith); + jsjcMov(1, 0); // res -> r1 jsjcMov(4, 0); // res -> r0 + jsjcMov(0, 5); // a -> r0 + jsjcCall(jsvReplaceWith); + jsjcMov(0, 4); // res -> r0 jsjcCall(jsvUnLock); // jsvUnLock(res) */ } else @@ -301,14 +296,14 @@ void __jsjBinaryExpression(unsigned int lastPrecedence) { jsvUnLock2(av, bv); } else */{ // --------------------------------------------- NORMAL jsjPopAsVar(1); // b -> r1 - jsjcMov(0, 5); // b -> r5 (for unlock later) + jsjcMov(5, 0); // b -> r5 (for unlock later) jsjPopAsVar(0); // a -> r0 - jsjcMov(0, 4); // a -> r4 (for unlock later) + jsjcMov(4, 0); // a -> r4 (for unlock later) jsjcLiteral32(2, op); jsjcCall(jsvMathsOpSkipNames); jsjcPush(0, JSJVT_JSVAR); // push result - jsjcMov(5, 1); // b -> r1 - jsjcMov(4, 0); // a -> r0 + jsjcMov(1, 5); // b -> r1 + jsjcMov(0, 4); // a -> r0 jsjcCall(jsvUnLock2); } } @@ -324,6 +319,7 @@ void jsjBinaryExpression() { void jsjBlockOrStatement() { jsjBinaryExpression(); // FIXME // FIXME REALLY + // Skip name?? jsjPopAsVar(0); // a -> r0 } diff --git a/src/jsjitc.c b/src/jsjitc.c index 3702fbcd1d..5780165dfe 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -14,7 +14,7 @@ https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions?lang=en https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf */ -#ifdef ESPR_JIT +//#ifdef ESPR_JIT #define DEBUG_JIT jsiConsolePrintf #if defined(LINUX) && defined(DEBUG) @@ -53,14 +53,14 @@ void jsjcEmit16(uint16_t v) { fputc(v&255, f); fputc(v>>8, f); #endif - jsvAppendStringBuf(jitCode, &v, 2); + jsvAppendStringBuf(jitCode, (char *)&v, 2); } void jsjcLiteral8(int reg, uint8_t data) { assert(reg<8); // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 int n = 0b0010000000000000 | (reg<<8) | data; - jsjcEmit16(n); + jsjcEmit16((uint16_t)n); } void jsjcLiteral16(int reg, bool hi16, uint16_t data) { @@ -71,8 +71,8 @@ void jsjcLiteral16(int reg, bool hi16, uint16_t data) { i = (data>>11)&1; imm3 = (data>>8)&7; imm8 = data&255; - jsjcEmit16(0b1111001001000000 | (hi16?(1<<7):0)| (i<<10) | imm4); - jsjcEmit16((imm3<<12) | imm8 | (reg<<8)); + jsjcEmit16((uint16_t)(0b1111001001000000 | (hi16?(1<<7):0)| (i<<10) | imm4)); + jsjcEmit16((uint16_t)((imm3<<12) | imm8 | (reg<<8))); } void jsjcLiteral32(int reg, uint32_t data) { @@ -95,37 +95,71 @@ void jsjcLiteral64(int reg, uint64_t data) { jsjcLiteral32(reg+1, (uint32_t)data); } +int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate) { + /* We store the String data here in-line, so store the PC location then jump forward over the data. */ + int len = (int)jsvGetStringLength(str); + int realLen = len + (nullTerminate?1:0); + if (realLen&1) realLen++; // pad to even bytes + // Write location of data to register + jsjcMov(reg, JSJAR_PC); + // jump over the data + jsjcBranchRelative(realLen); + // write the data + JsvStringIterator it; + jsvStringIteratorNew(&it, str, 0); + for (int i=0;i=-4096 && bytes<4096); // only multiples of 2 bytes + int imm11 = (bytes>>1) & 2047; + jsjcEmit16((uint16_t)(0b1110000000000000 | imm11)); // unconditional branch + /*JsjAsmCondition cond = ...; + int imm8 = (pos>>1) & 255; + jsjcEmit16((uint16_t)(0b1101000000000000 | (cond<<8) | imm8));*/ // conditional branch +} + #ifdef DEBUG void _jsjcCall(void *c, const char *name) { - DEBUG_JIT("CALL 0x%08x %s\n", (uint32_t)c, name); + DEBUG_JIT("CALL 0x%08x %s\n", (uint32_t)(size_t)c, name); #else void jsjcCall(void *c) { - DEBUG_JIT("CALL 0x%08x\n", (uint32_t)c); + DEBUG_JIT("CALL 0x%08x\n", (uint32_t)(size_t)c); #endif /* if (((uint32_t)c) < 0x7FFFFF) { // BL + immediate(PC relative!) uint32_t v = ((uint32_t)c)>>1; - jsjcEmit16(0b1111000000000000 | ((v>>11)&0x7FF)); - jsjcEmit16(0b1111100000000000 | (v&0x7FF)); + jsjcEmit16((uint16_t)(0b1111000000000000 | ((v>>11)&0x7FF))); + jsjcEmit16((uint16_t)(0b1111100000000000 | (v&0x7FF))); } else */{ - jsjcLiteral32(7, (uint32_t)c); // save address to r7 - jsjcEmit16(0b0100011110000000 | (7<<3)); // BL reg 7 - BROKEN? + jsjcLiteral32(7, (uint32_t)(size_t)c); // save address to r7 + jsjcEmit16((uint16_t)(0b0100011110000000 | (7<<3))); // BL reg 7 - BROKEN? } } -void jsjcMov(int regFrom, int regTo) { - DEBUG_JIT("MOV r%d -> r%d\n", regFrom, regTo); - jsjcEmit16(0b0100011000000000 | ((regTo&8)?128:0) | (regFrom<<3) | (regTo&7)); +void jsjcMov(int regTo, int regFrom) { + DEBUG_JIT("MOV r%d <- r%d\n", regTo, regFrom); + jsjcEmit16((uint16_t)(0b0100011000000000 | ((regTo&8)?128:0) | (regFrom<<3) | (regTo&7))); } void jsjcPush(int reg, JsjValueType type) { DEBUG_JIT("PUSH {r%d}\n", reg); - jsjcEmit16(0b1011010000000000 | (1< Date: Fri, 6 May 2022 11:13:18 +0100 Subject: [PATCH 0054/1183] Support for functions defined with the 'jit' keyword --- README_JIT.md | 7 ++- src/jsjit.c | 137 +++++++++++++++++++++++++++++++++++++++++++++----- src/jsjit.h | 3 ++ src/jsparse.c | 11 +++- 4 files changed, 144 insertions(+), 14 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 39e17a689c..eb081bc956 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -28,10 +28,15 @@ var jit = E.nativeCall(1, "JsVar()", E.JIT("test")) var test = "Hello "; var jit = E.nativeCall(1, "JsVar()", E.JIT("test+'World!'")) jit()=="Hello World!" -``` +function jit() {'jit';return 1+2;} +jit()==3 +``` +``` +./espruino -e "trace(function jit() {'jit';return 1+2;})" +``` Run JIT on ARM and disassemble: diff --git a/src/jsjit.c b/src/jsjit.c index d3df0cdc2e..2940d7ffba 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -23,6 +23,7 @@ // ---------------------------------------------------------------------------- void jsjUnaryExpression(); +void jsjStatement(); // ---------------------------------------------------------------------------- void jsjPopAsVar(int reg) { @@ -37,6 +38,12 @@ void jsjPopAsVar(int reg) { assert(0); } +void jsjPopAndUnLock() { + jsjPopAsVar(0); // a -> r0 + // optimisation: if item on stack is NOT a variable, no need to covert+unlock! + jsjcCall(jsvUnLock); // we're throwing this away now - unlock +} + void jsjFactor() { if (lex->tk==LEX_ID) { JsVar *a = jslGetTokenValueAsVar(); @@ -44,7 +51,7 @@ void jsjFactor() { jsvUnLock(a); JSP_ASSERT_MATCH(LEX_ID); jsjcCall(jspGetNamedVariable); - jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here - is that ok? + jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here } else if (lex->tk==LEX_INT) { int64_t v = stringToInt(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_INT); @@ -316,19 +323,121 @@ void jsjBinaryExpression() { __jsjBinaryExpression(0); } -void jsjBlockOrStatement() { - jsjBinaryExpression(); // FIXME - // FIXME REALLY - // Skip name?? - jsjPopAsVar(0); // a -> r0 +// ',' is allowed to add multiple expressions, this is not allowed in jspeAssignmentExpression +void jsjExpression() { + while (JSJ_PARSING) { + jsjBinaryExpression(); // FIXME should be jsjAssignmentExpression(); + if (lex->tk!=',') return; + // if we get a comma, we just unlock this data and parse the next bit... + jsjPopAndUnLock(); + JSP_ASSERT_MATCH(','); + } } -void jsjParse() { - jsjcPushAll(); // FIXME REALLY - while (JSJ_PARSING && lex->tk != LEX_EOF) { - jsjBlockOrStatement(); +void jsjBlockNoBrackets() { + while (lex->tk && lex->tk!='}' && JSJ_PARSING) { + jsjStatement(); } - jsjcPopAllAndReturn(); // FIXME REALLY + return; +} + +void jsjBlock() { + JSP_MATCH('{'); + jsjBlockNoBrackets(); + JSP_MATCH('}'); +} + +void jsjStatement() { + if (lex->tk==LEX_ID || + lex->tk==LEX_INT || + lex->tk==LEX_FLOAT || + lex->tk==LEX_STR || + lex->tk==LEX_TEMPLATE_LITERAL || + lex->tk==LEX_REGEX || + lex->tk==LEX_R_NEW || + lex->tk==LEX_R_NULL || + lex->tk==LEX_R_UNDEFINED || + lex->tk==LEX_R_TRUE || + lex->tk==LEX_R_FALSE || + lex->tk==LEX_R_THIS || + lex->tk==LEX_R_DELETE || + lex->tk==LEX_R_TYPEOF || + lex->tk==LEX_R_VOID || + lex->tk==LEX_R_SUPER || + lex->tk==LEX_PLUSPLUS || + lex->tk==LEX_MINUSMINUS || + lex->tk=='!' || + lex->tk=='-' || + lex->tk=='+' || + lex->tk=='~' || + lex->tk=='[' || + lex->tk=='(') { + /* Execute a simple statement that only contains basic arithmetic... */ + jsjExpression(); + jsjPopAndUnLock(); + } else if (lex->tk=='{') { + /* A block of code */ + jsjBlock(); + } else if (lex->tk==';') { + JSP_ASSERT_MATCH(';');/* Empty statement - to allow things like ;;; */ +/*} else if (lex->tk==LEX_R_VAR || + lex->tk==LEX_R_LET || + lex->tk==LEX_R_CONST) { + return jspeStatementVar(); + } else if (lex->tk==LEX_R_IF) { + return jspeStatementIf(); + } else if (lex->tk==LEX_R_DO) { + return jspeStatementDoOrWhile(false); + } else if (lex->tk==LEX_R_WHILE) { + return jspeStatementDoOrWhile(true); + } else if (lex->tk==LEX_R_FOR) { + return jspeStatementFor(); + } else if (lex->tk==LEX_R_TRY) { + return jspeStatementTry();*/ + } else if (lex->tk==LEX_R_RETURN) { + JSP_ASSERT_MATCH(LEX_R_RETURN); + if (lex->tk != ';' && lex->tk != '}') { + jsjExpression(); + jsjPopAsVar(0); // a -> r0 + jsjcCall(jsvSkipNameAndUnLock); // we only want the value, so skip the name if there was one + } else { + jsjcLiteral32(0, 0); + } + jsjcPopAllAndReturn(); +/*} else if (lex->tk==LEX_R_THROW) { + } else if (lex->tk==LEX_R_FUNCTION) { + } else if (lex->tk==LEX_R_CONTINUE) { + JSP_ASSERT_MATCH(LEX_R_CONTINUE); + } else if (lex->tk==LEX_R_BREAK) { + JSP_ASSERT_MATCH(LEX_R_BREAK); + if (JSP_SHOULD_EXECUTE) { + } else if (lex->tk==LEX_R_SWITCH) { + return jspeStatementSwitch();*/ + } else JSP_MATCH(LEX_EOF); +} + +void jsjBlockOrStatement() { + if (lex->tk=='{') { + jsjBlock(); + } else { + jsjStatement(); + if (lex->tk==';') JSP_ASSERT_MATCH(';'); + // FIXME pop? + } +} + +JsVar *jsjParseFunction() { + jsjcStart(); + // FIXME: I guess we need to create a function execution scope and unpack parameters? + // Maybe we could use jspeFunctionCall to do all this for us (not creating a native function but a 'normal' one + // with native function code... + jsjcPushAll(); // Function start + jsjBlockNoBrackets(); + // optimisation: if the last statement was a return, no need for this + // Return 'undefined' from function if no other return statement + jsjcLiteral32(0, 0); + jsjcPopAllAndReturn(); + return jsjcStop(); } JsVar *jsjEvaluateVar(JsVar *str) { @@ -337,7 +446,11 @@ JsVar *jsjEvaluateVar(JsVar *str) { JsLex *oldLex = jslSetLex(&lex); jslInit(str); jsjcStart(); - jsjParse(); + jsjcPushAll(); + jsjExpression(); + jsjPopAsVar(0); // a -> r0 + jsjcCall(jsvSkipNameAndUnLock); // we only want the value, so skip the name if there was one + jsjcPopAllAndReturn(); JsVar *v = jsjcStop(); jslKill(); jslSetLex(oldLex); diff --git a/src/jsjit.h b/src/jsjit.h index 95181b3c26..196c061ebf 100644 --- a/src/jsjit.h +++ b/src/jsjit.h @@ -20,5 +20,8 @@ JsVar *jsjEvaluateVar(JsVar *str); JsVar *jsjEvaluate(const char *str); +// parse a function and return a native string of the code. Assumes '{' has already been parsed +JsVar *jsjParseFunction(); + #endif /* JSJIT_H_ */ #endif /* ESPR_JIT */ diff --git a/src/jsparse.c b/src/jsparse.c index 319b8745c2..768c6e83a0 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -22,6 +22,9 @@ #ifndef SAVE_ON_FLASH #include "jswrap_regexp.h" // for jswrap_regexp_constructor #endif +#ifdef ESPR_JIT +#include "jsjit.h" +#endif /* Info about execution when Parsing - this saves passing it on the stack * for each call */ @@ -350,7 +353,13 @@ NO_INLINE bool jspeFunctionDefinitionInternal(JsVar *funcVar, bool expressionOnl #ifdef ESPR_JIT if (!strcmp(jslGetTokenValueAsString(), "jit")) { JSP_ASSERT_MATCH(LEX_STR); - jsWarn("FIXME - JIT compile this function"); + JsVar *funcCodeVar = jsjParseFunction(); + funcVar->flags = (funcVar->flags & ~JSV_VARTYPEMASK) | JSV_NATIVE_FUNCTION; // convert to native fn + funcVar->varData.native.ptr = (void *)(size_t)1; // offset 1 = 'thumb' + funcVar->varData.native.argTypes = JSWAT_JSVAR; // FIXME - need to add parameters if any specified... + jsvUnLock2(jsvAddNamedChild(funcVar, funcCodeVar, JSPARSE_FUNCTION_CODE_NAME), funcCodeVar); + JSP_MATCH('}'); + return true; // assume 'this' included for now (optimisation: figure out if 'this' was used) } #endif } From 9ab449a5d9aed02790712e5a097f0626761e0bea Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Sat, 7 May 2022 16:18:09 +0100 Subject: [PATCH 0055/1183] first (broken) stab at function execution --- README_JIT.md | 16 ++++++++++++++++ src/jsjit.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/jsjitc.h | 1 + 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index eb081bc956..07611de60e 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -31,11 +31,22 @@ jit()=="Hello World!" function jit() {'jit';return 1+2;} jit()==3 + +// BROKEN + +function t() { print("Hello"); } +function jit() {'jit';t();} + +function jit() {'jit';print(42);} ``` ``` ./espruino -e "trace(function jit() {'jit';return 1+2;})" + +./espruino -e "E.JIT('\'Hello\'')" + +./espruino -e "E.JIT('print(42)')" ``` @@ -46,3 +57,8 @@ btoa(E.JIT("1")) echo ASBL8Kz7AbQBvHBH | base64 -d > jit.bin arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin ``` + + +http://www.cs.cornell.edu/courses/cs414/2001FA/armcallconvention.pdf +https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/B +https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/condition-codes-1-condition-flags-and-codes diff --git a/src/jsjit.c b/src/jsjit.c index 2940d7ffba..011bd8bc96 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -23,6 +23,8 @@ // ---------------------------------------------------------------------------- void jsjUnaryExpression(); +void jsjAssignmentExpression(); +void jsjExpression(); void jsjStatement(); // ---------------------------------------------------------------------------- @@ -72,7 +74,8 @@ void jsjFactor() { } else if (lex->tk=='(') { JSP_ASSERT_MATCH('('); // Just parse a normal expression (which can include commas) - //JsVar *a = jsjExpression(); // FIXME + jsjExpression(); + // FIXME: Arrow functions?? JSP_MATCH(')'); } else if (lex->tk==LEX_R_TRUE || lex->tk==LEX_R_FALSE) { jsjcLiteral32(0, lex->tk==LEX_R_TRUE); @@ -126,7 +129,44 @@ void jsjFactor() { void jsjFactorFunctionCall() { jsjFactor(); - // jsjFactorMember(); // FIXME + // jsjFactorMember(); // FIXME we need to call this and also somehow remember 'parent' + // FIXME: what about 'new'? + + while (lex->tk=='(' /*|| (isConstructor && JSP_SHOULD_EXECUTE))*/ && JSJ_PARSING) { + jsjcPop(4); // r4 = funcName + /* WE NEED TO PARSE ARGUMENTS! + To do this we want to save the stack pointer, then push each new argument onto the stack, + then hopefully we can pass that stack pointer as 'argPtr' to jspeFunctionCall + */ + int argCount = 0; + JSP_MATCH('('); + while (JSJ_PARSING && lex->tk!=')' && lex->tk!=LEX_EOF) { + argCount++; + jsjAssignmentExpression(); + jsjcCall(jsvSkipNameAndUnLock); // optimisation: we should know if we have a var or a name here, so can skip jsvSkipNameAndUnLock sometimes + if (lex->tk!=')') JSP_MATCH(','); + } + JSP_MATCH(')'); + // r4=funcName, args on the stack + jsjcMov(0, 4); jsjcCall(jsvSkipName); // r0 = func + jsjcMov(5, 0); // r5 = func + // for constructors we'd have to do something special here + jsjcMov(1, 4); // r1 = funcName + jsjcMov(3, JSJAR_SP); // r3 = argPtr + jsjcLiteral32(2, argCount); + jsjcPush(3, JSJVT_INT); // argPtr + jsjcPush(2, JSJVT_INT); // argCount + jsjcLiteral32(2, 0); // parent = 0 FIXME (see above) + jsjcLiteral32(3, 0); // isParsing = false + jsjcCall(jspeFunctionCall); // a = jspeFunctionCall(func, funcName, thisArg/parent, isParsing, argCount, argPtr); + while (argCount--) jsjcPop(0); // pop items off stack - FIXME: faster ways of doing this - can just add argCount to SP! + jsjcMov(1, 4); // funcName + jsjcMov(0, 5); // func + jsjcCall(jsvUnLock2); // unlock + // FIXME - also unlock/clear 'parent' + // parent=0; + // a = jspeFactorMember(a, &parent); + } } void __jsjPostfixExpression() { @@ -323,10 +363,15 @@ void jsjBinaryExpression() { __jsjBinaryExpression(0); } +void jsjAssignmentExpression() { + // FIXME return __jspeAssignmentExpression(jspeConditionalExpression()); + jsjBinaryExpression(); +} + // ',' is allowed to add multiple expressions, this is not allowed in jspeAssignmentExpression void jsjExpression() { while (JSJ_PARSING) { - jsjBinaryExpression(); // FIXME should be jsjAssignmentExpression(); + jsjAssignmentExpression(); if (lex->tk!=',') return; // if we get a comma, we just unlock this data and parse the next bit... jsjPopAndUnLock(); diff --git a/src/jsjitc.h b/src/jsjitc.h index 795b033ead..77f878792c 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -45,6 +45,7 @@ typedef enum { JSJAR_r1, JSJAR_r2, // ... + JSJAR_SP = 13, JSJAR_LR = 14, JSJAR_PC = 15, } JsjAsmReg; From 53ea1089b2eac9908e64b0b4318b0f9c771adf6f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Sat, 7 May 2022 16:36:18 +0100 Subject: [PATCH 0056/1183] first run on pi - works at least when running under GDB --- boards/RASPBERRYPI.py | 19 ++++++++++--------- src/jsvar.c | 15 +++++++++++++++ targets/linux/main.c | 10 +++++----- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/boards/RASPBERRYPI.py b/boards/RASPBERRYPI.py index 55384aefe0..655414aad8 100644 --- a/boards/RASPBERRYPI.py +++ b/boards/RASPBERRYPI.py @@ -17,22 +17,23 @@ info = { 'name' : "Raspberry Pi", 'default_console' : "EV_USBSERIAL", - 'variables' : 0, # 0 = resizable variables, rather than fixed + 'variables' : 5000, # 0 = resizable variables, rather than fixed 'binary_name' : 'espruino_%v_raspberrypi', 'build' : { 'optimizeflags' : '-O3', 'libraries' : [ - 'NET', - 'GRAPHICS', - 'FILESYSTEM', - 'CRYPTO','SHA256','SHA512', - 'TLS', - 'TELNET', - 'TENSORFLOW', +# 'NET', +# 'GRAPHICS', +# 'FILESYSTEM', +# 'CRYPTO','SHA256','SHA512', +# 'TLS', +# 'TELNET', +# 'TENSORFLOW', + 'JIT' ], 'makefile' : [ 'LINUX=1', - 'DEFINES += -DRASPBERRYPI', + 'DEFINES += -DRASPBERRYPI -DJSVAR_MALLOC=1', ] } }; diff --git a/src/jsvar.c b/src/jsvar.c index 9e2d5ee983..9826a8f715 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -21,6 +21,9 @@ #include "jswrap_object.h" // for jswrap_object_toString #include "jswrap_arraybuffer.h" // for jsvNewTypedArray #include "jswrap_dataview.h" // for jsvNewDataViewWithData +#ifdef ESPR_JIT +#include +#endif #ifdef DEBUG /** When freeing, clear the references (nextChild/etc) in the JsVar. @@ -255,10 +258,22 @@ void jsvInit(unsigned int size) { assert(size==0); jsVarsSize = JSVAR_BLOCK_SIZE; jsVarBlocks = malloc(sizeof(JsVar*)); // just 1 +#ifdef ESPR_JIT + if (!jsVars) + jsVarBlocks[0] = (JsVar *)mmap(NULL, sizeof(JsVar) * JSVAR_BLOCK_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); +#else jsVarBlocks[0] = malloc(sizeof(JsVar) * JSVAR_BLOCK_SIZE); +#endif #elif defined(JSVAR_MALLOC) if (size) jsVarsSize = size; +#ifdef ESPR_JIT + if (!jsVars) + jsVars = (JsVar *)mmap(NULL, sizeof(JsVar) * jsVarsSize, PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); +#else if(!jsVars) jsVars = (JsVar *)malloc(sizeof(JsVar) * jsVarsSize); +#endif #else assert(size==0); #endif diff --git a/targets/linux/main.c b/targets/linux/main.c index 2e038bc0a0..e5110843b9 100644 --- a/targets/linux/main.c +++ b/targets/linux/main.c @@ -178,7 +178,7 @@ bool run_test(const char *filename) { jshInit(); jswHWInit(); - jsvInit(0); + jsvInit(JSVAR_CACHE_SIZE); jsiInit(false /* do not autoload!!! */); addNativeFunction("quit", nativeQuit); @@ -284,7 +284,7 @@ bool run_all_tests() { bool run_jit_tests() { jshInit(); jswHWInit(); - jsvInit(0); + jsvInit(JSVAR_CACHE_SIZE); jsiInit(false /* do not autoload!!! */); addNativeFunction("quit", nativeQuit); @@ -414,7 +414,7 @@ int main(int argc, char **argv) { if (i + 1 >= argc) fatal(1, "Expecting an extra argument"); jshInit(); - jsvInit(0); + jsvInit(JSVAR_CACHE_SIZE); jsiInit(true); addNativeFunction("quit", nativeQuit); addNativeFunction("interrupt", nativeInterrupt); @@ -500,7 +500,7 @@ int main(int argc, char **argv) { cmd++; } jshInit(); - jsvInit(0); + jsvInit(JSVAR_CACHE_SIZE); jsiInit(false /* do not autoload!!! */); addNativeFunction("quit", nativeQuit); jsvUnLock(jspEvaluate(cmd, false)); @@ -543,7 +543,7 @@ int main(int argc, char **argv) { #endif //!__MINGW32__ jshInit(); - jsvInit(0); + jsvInit(JSVAR_CACHE_SIZE); jsiInit(true); addNativeFunction("quit", nativeQuit); From 2cece5275dddfed38a3e9af04a66920d11de2a1d Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 8 May 2022 15:21:53 +0200 Subject: [PATCH 0057/1183] Bangle.js2: fix E.showMenu redraw 2cd16032c37a0004f92be8d817502e198c0ebde5 missed updating a `s` to `l.scroller` --- libs/js/banglejs/E_showMenu_Q3.js | 2 +- libs/js/banglejs/E_showMenu_Q3.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 93a308de5c..3ba29e87d6 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -126,7 +126,7 @@ if ("boolean"==typeof item.value) item.value=!item.value; if (item.onchange) item.onchange(item.value); - s.drawItem(idx); + l.scroller.drawItem(idx); } } } diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index e5ab3e9506..f180790cb7 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -4,4 +4,4 @@ g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\ c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI({mode:"updown",back:p},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=s.scroll;p()}})}}function p(){q.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var n=k[""]||{};n.title||(n.title="Menu");var t=n.back||k["< Back"],m=Object.keys(k).filter(a=>""!= a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var q={draw:()=>q.scroller.draw(),scroller:void 0},r={h:40,c:m.length,scrollMin:-24,scroll:void 0===n.scroll?-24:n.scroll,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ n.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1< -d.length&&(g.setFont("6x15"),d=g.wrapString(m[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(q);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);s.drawItem(a)}}};p();return q}) \ No newline at end of file +d.length&&(g.setFont("6x15"),d=g.wrapString(m[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(q);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);q.scroller.drawItem(a)}}};p();return q}) \ No newline at end of file From becfacddc289af0a22fa2f243dfce32e5b61f93e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 9 May 2022 10:34:40 +0100 Subject: [PATCH 0058/1183] more work on calls --- src/jsjit.c | 5 +++-- src/jsjitc.c | 6 ++++++ src/jsjitc.h | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/jsjit.c b/src/jsjit.c index 011bd8bc96..19c2d63307 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -153,13 +153,14 @@ void jsjFactorFunctionCall() { // for constructors we'd have to do something special here jsjcMov(1, 4); // r1 = funcName jsjcMov(3, JSJAR_SP); // r3 = argPtr - jsjcLiteral32(2, argCount); jsjcPush(3, JSJVT_INT); // argPtr + jsjcLiteral32(2, argCount); jsjcPush(2, JSJVT_INT); // argCount jsjcLiteral32(2, 0); // parent = 0 FIXME (see above) jsjcLiteral32(3, 0); // isParsing = false jsjcCall(jspeFunctionCall); // a = jspeFunctionCall(func, funcName, thisArg/parent, isParsing, argCount, argPtr); - while (argCount--) jsjcPop(0); // pop items off stack - FIXME: faster ways of doing this - can just add argCount to SP! + jsjcAddSP(4*(2+argCount)); // pop off argCount,argPtr + all the arguments + jsjcPush(0, JSJVT_JSVAR); // push return value from jspeFunctionCall jsjcMov(1, 4); // funcName jsjcMov(0, 5); // func jsjcCall(jsvUnLock2); // unlock diff --git a/src/jsjitc.c b/src/jsjitc.c index 5780165dfe..30390a3665 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -163,6 +163,12 @@ JsjValueType jsjcPop(int reg) { return JSJVT_JSVAR; // FIXME } +void jsjcAddSP(int amt) { + assert((amt&3)==0); + DEBUG_JIT("ADD SP,SP,#%d\n", amt); + jsjcEmit16((uint16_t)(0b1011000000000000 | (amt>>2))); +} + void jsjcPushAll() { DEBUG_JIT("PUSH {r4,r5,r6,r7,lr}\n"); jsjcEmit16(0xb5f0); diff --git a/src/jsjitc.h b/src/jsjitc.h index 77f878792c..f00f6c1ec2 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -78,6 +78,8 @@ void jsjcMov(int regTo, int regFrom); void jsjcPush(int reg, JsjValueType type); // Pop off the stack to a register JsjValueType jsjcPop(int reg); +// Add a value to the stack pointer (only multiple of 4) +void jsjcAddSP(int amt); void jsjcPushAll(); void jsjcPopAllAndReturn(); From 24247e4ec93a32b344a483c294f47f96ee82e1d7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 9 May 2022 11:21:19 +0100 Subject: [PATCH 0059/1183] Function calls and returns seem to work ok now --- README_JIT.md | 14 ++++++++++++-- src/jsjitc.c | 4 ++-- src/jsjitc.h | 4 +++- src/jsvar.c | 6 +++--- src/jswrap_object.c | 3 ++- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 07611de60e..329c402c56 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -5,6 +5,7 @@ JIT compiler testing * Test with `./espruino --test-jit` * CLI test `./espruino -e "E.JIT('\'Hello\'')"` * Dump binary with `arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin` +* Dump binary on pi with `objdump -D -Mforce-thumb -b binary -m arm jit.bin` * Build for ARM: `USE_JIT=1 BOARD=NRF52832DK_MIN RELEASE=1 make flash` @@ -32,12 +33,12 @@ jit()=="Hello World!" function jit() {'jit';return 1+2;} jit()==3 -// BROKEN - function t() { print("Hello"); } function jit() {'jit';t();} function jit() {'jit';print(42);} + +function jit() {'jit';print(42);return 123;} ``` @@ -47,18 +48,27 @@ function jit() {'jit';print(42);} ./espruino -e "E.JIT('\'Hello\'')" ./espruino -e "E.JIT('print(42)')" + ``` +When running on Linux, `function jit() {'jit';print(42);}` seems to actually call the function ok, and prints 42. Stack is trashed after (and possibly even before!). +Tests seem to show it's caller's job to clear the stack (expected really - could be the issue!) + Run JIT on ARM and disassemble: ``` btoa(E.JIT("1")) +print(btoa(jit["\xffcod"])) echo ASBL8Kz7AbQBvHBH | base64 -d > jit.bin arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin ``` +``` +arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 a.out +``` http://www.cs.cornell.edu/courses/cs414/2001FA/armcallconvention.pdf https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/B https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/condition-codes-1-condition-flags-and-codes + diff --git a/src/jsjitc.c b/src/jsjitc.c index 30390a3665..019af70fde 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -118,7 +118,7 @@ int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate) { } void jsjcBranchRelative(int bytes) { - DEBUG_JIT("B %d\n", (uint32_t)bytes); + DEBUG_JIT("B %d\n", (uint32_t)(bytes)); bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-4096 && bytes<4096); // only multiples of 2 bytes @@ -129,7 +129,7 @@ void jsjcBranchRelative(int bytes) { jsjcEmit16((uint16_t)(0b1101000000000000 | (cond<<8) | imm8));*/ // conditional branch } -#ifdef DEBUG +#ifdef DEBUG_JIT_CALLS void _jsjcCall(void *c, const char *name) { DEBUG_JIT("CALL 0x%08x %s\n", (uint32_t)(size_t)c, name); #else diff --git a/src/jsjitc.h b/src/jsjitc.h index f00f6c1ec2..f4ee29b0f4 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -15,6 +15,8 @@ #ifndef JSJITC_H_ #define JSJITC_H_ +#define DEBUG_JIT_CALLS + #include "jsutils.h" #include "jsjit.h" @@ -62,7 +64,7 @@ void jsjcLiteral32(int reg, uint32_t data); // Add 64 bit literal in reg,reg+1 void jsjcLiteral64(int reg, uint64_t data); // Call a function -#ifdef DEBUG +#ifdef DEBUG_JIT_CALLS void _jsjcCall(void *c, const char *name); #define jsjcCall(c) _jsjcCall(c, STRINGIFY(c)) #else diff --git a/src/jsvar.c b/src/jsvar.c index 9826a8f715..2848d5048a 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -21,7 +21,7 @@ #include "jswrap_object.h" // for jswrap_object_toString #include "jswrap_arraybuffer.h" // for jsvNewTypedArray #include "jswrap_dataview.h" // for jsvNewDataViewWithData -#ifdef ESPR_JIT +#if defined(ESPR_JIT) && defined(LINUX) #include #endif @@ -258,7 +258,7 @@ void jsvInit(unsigned int size) { assert(size==0); jsVarsSize = JSVAR_BLOCK_SIZE; jsVarBlocks = malloc(sizeof(JsVar*)); // just 1 -#ifdef ESPR_JIT +#if defined(ESPR_JIT) && defined(LINUX) if (!jsVars) jsVarBlocks[0] = (JsVar *)mmap(NULL, sizeof(JsVar) * JSVAR_BLOCK_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); @@ -267,7 +267,7 @@ void jsvInit(unsigned int size) { #endif #elif defined(JSVAR_MALLOC) if (size) jsVarsSize = size; -#ifdef ESPR_JIT +#if defined(ESPR_JIT) && defined(LINUX) if (!jsVars) jsVars = (JsVar *)mmap(NULL, sizeof(JsVar) * jsVarsSize, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); diff --git a/src/jswrap_object.c b/src/jswrap_object.c index ee59c1152a..8e04d326b3 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -950,7 +950,8 @@ void jswrap_function_replaceWith(JsVar *oldFunc, JsVar *newFunc) { jsvObjectIteratorNext(&it); if (!jsvIsStringEqual(el, JSPARSE_FUNCTION_SCOPE_NAME) && !jsvIsStringEqual(el, JSPARSE_PROTOTYPE_VAR)) { - JsVar *copy = jsvCopy(el, true); + // don't copy function code - just use it as-is + JsVar *copy = jsvIsStringEqual(el, JSPARSE_FUNCTION_CODE_NAME) ? jsvLockAgain(el) : jsvCopy(el, true); if (copy) { jsvAddName(oldFunc, copy); jsvUnLock(copy); From 677a5f91c58889ad5b568c4883822bd3e1a7e674 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 9 May 2022 11:22:36 +0100 Subject: [PATCH 0060/1183] more examples --- README_JIT.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_JIT.md b/README_JIT.md index 329c402c56..23a4afa02c 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -39,6 +39,10 @@ function jit() {'jit';t();} function jit() {'jit';print(42);} function jit() {'jit';print(42);return 123;} + +function t() { return "Hello"; } +function jit() {'jit'; return t()+" world";} +jit()=="Hello world" ``` From 83223650f0c7fe271a2ad37b37f891ef6ecbdffa Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 9 May 2022 11:46:45 +0100 Subject: [PATCH 0061/1183] >1 arg --- README_JIT.md | 2 ++ src/jsjit.c | 18 ++++++++++++++++-- src/jsjitc.c | 25 ++++++++++++++++++++++++- src/jsjitc.h | 6 ++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 23a4afa02c..d9ecb428a4 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -43,6 +43,8 @@ function jit() {'jit';print(42);return 123;} function t() { return "Hello"; } function jit() {'jit'; return t()+" world";} jit()=="Hello world" + +function jit() {'jit';digitalWrite(LED1,1);} ``` diff --git a/src/jsjit.c b/src/jsjit.c index 19c2d63307..b515f439b8 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -148,12 +148,26 @@ void jsjFactorFunctionCall() { } JSP_MATCH(')'); // r4=funcName, args on the stack + jsjcMov(3, JSJAR_SP); // r3 = argPtr + jsjcPush(3, JSJVT_INT); // argPtr + // Args are in the wrong order - we have to swap them around if we have >1! + if (argCount>1) { + for (int i=0;i0 && amt<512); DEBUG_JIT("ADD SP,SP,#%d\n", amt); jsjcEmit16((uint16_t)(0b1011000000000000 | (amt>>2))); } +void jsjcSubSP(int amt) { + assert((amt&3)==0 && amt>0 && amt<512); + DEBUG_JIT("SUB SP,SP,#%d\n", amt); + jsjcEmit16((uint16_t)(0b1011000010000000 | (amt>>2))); +} + + +void jsjcLoadImm(int reg, int regAddr, int offset) { + assert((offset&3)==0 && offset>=0 && offset<128); + assert(reg<8); + assert(regAddr<8); + DEBUG_JIT("LDR r%d,r%d,#%d\n", reg, regAddr, offset); + jsjcEmit16((uint16_t)(0b0110100000000000 | ((offset>>2)<<6) | (regAddr<<3) | reg)); +} + +void jsjcStoreImm(int reg, int regAddr, int offset) { + assert((offset&3)==0 && offset>=0 && offset<128); + assert(reg<8); + assert(regAddr<8); + DEBUG_JIT("STR r%d,r%d,#%d\n", reg, regAddr, offset); + jsjcEmit16((uint16_t)(0b0110000000000000 | ((offset>>2)<<6) | (regAddr<<3) | reg)); +} + void jsjcPushAll() { DEBUG_JIT("PUSH {r4,r5,r6,r7,lr}\n"); jsjcEmit16(0xb5f0); diff --git a/src/jsjitc.h b/src/jsjitc.h index f4ee29b0f4..2ebe3b90f1 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -82,6 +82,12 @@ void jsjcPush(int reg, JsjValueType type); JsjValueType jsjcPop(int reg); // Add a value to the stack pointer (only multiple of 4) void jsjcAddSP(int amt); +// Subtract a value from the stack pointer (only multiple of 4) +void jsjcSubSP(int amt); +// reg = mem[regAddr + offset] +void jsjcLoadImm(int reg, int regAddr, int offset); +// mem[regAddr + offset] = reg +void jsjcStoreImm(int reg, int regAddr, int offset); void jsjcPushAll(); void jsjcPopAllAndReturn(); From 90e442e9d6ba876e5114cb405d100b39636b43d6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 9 May 2022 12:05:33 +0100 Subject: [PATCH 0062/1183] improve docs, make debug info more readable --- src/jsjit.c | 11 ++++++++--- src/jsjit.h | 4 ++++ src/jsjitc.c | 20 +++++++++++++++++--- src/jsjitc.h | 2 -- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/jsjit.c b/src/jsjit.c index b515f439b8..9b6ca7e295 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -134,9 +134,14 @@ void jsjFactorFunctionCall() { while (lex->tk=='(' /*|| (isConstructor && JSP_SHOULD_EXECUTE))*/ && JSJ_PARSING) { jsjcPop(4); // r4 = funcName - /* WE NEED TO PARSE ARGUMENTS! - To do this we want to save the stack pointer, then push each new argument onto the stack, - then hopefully we can pass that stack pointer as 'argPtr' to jspeFunctionCall + /* PARSE OUR ARGUMENTS + * Push each new argument onto the stack (it grows down) + * Args are in the wrong order, so we emit code to swap around the args in the array + * At the end, SP = what we need as 'argPtr' for jspeFunctionCall + + optimisation: If we knew how many args we had ahead of time, we could subtract that + from the stack pointer, save it, and then instead of pushing onto the stack we could + just write direct to the correct address. */ int argCount = 0; JSP_MATCH('('); diff --git a/src/jsjit.h b/src/jsjit.h index 196c061ebf..80a09aa030 100644 --- a/src/jsjit.h +++ b/src/jsjit.h @@ -15,6 +15,10 @@ #ifndef JSJIT_H_ #define JSJIT_H_ +#ifndef RELEASE +#define DEBUG_JIT_CALLS +#endif + #include "jsparse.h" JsVar *jsjEvaluateVar(JsVar *str); diff --git a/src/jsjitc.c b/src/jsjitc.c index b08cebe2b1..cfd0ae1a62 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -13,6 +13,14 @@ https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions?lang=en https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf + + optimisations to do: + + * Allow us to check what the last instruction was, and to replace it. Can then do peephole optimisations: + * 'push+pop' is just a 'mov' (or maybe even nothing) + * + * Use a String iterator for writing to jitCode - it'll be a lot faster + */ //#ifdef ESPR_JIT @@ -28,6 +36,8 @@ #include FILE *f; #endif + +// The ARM Thumb-2 code we're in the process of creating JsVar *jitCode = 0; void jsjcStart() { @@ -48,7 +58,7 @@ JsVar *jsjcStop() { } void jsjcEmit16(uint16_t v) { - DEBUG_JIT("> %04x\n", v); + //DEBUG_JIT("> %04x\n", v); #ifdef JIT_OUTPUT_FILE fputc(v&255, f); fputc(v>>8, f); @@ -105,6 +115,7 @@ int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate) { // jump over the data jsjcBranchRelative(realLen); // write the data + DEBUG_JIT("... %d bytes data (%q) ...\n", (uint32_t)(realLen), str); JsvStringIterator it; jsvStringIteratorNew(&it, str, 0); for (int i=0;i>1; @@ -142,6 +151,11 @@ void jsjcCall(void *c) { jsjcEmit16((uint16_t)(0b1111100000000000 | (v&0x7FF))); } else */{ jsjcLiteral32(7, (uint32_t)(size_t)c); // save address to r7 +#ifdef DEBUG_JIT_CALLS + DEBUG_JIT("BL r7 (%s)\n", name); +#else + DEBUG_JIT("BL r7\n"); +#endif jsjcEmit16((uint16_t)(0b0100011110000000 | (7<<3))); // BL reg 7 - BROKEN? } diff --git a/src/jsjitc.h b/src/jsjitc.h index 2ebe3b90f1..ed524077e0 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -15,8 +15,6 @@ #ifndef JSJITC_H_ #define JSJITC_H_ -#define DEBUG_JIT_CALLS - #include "jsutils.h" #include "jsjit.h" From 7895d34b2d79d448375a5246dcb46f346b87fb99 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 11 May 2022 15:54:23 +0100 Subject: [PATCH 0063/1183] update test - now fails --- tests/test_graphics_wrapString.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_graphics_wrapString.js b/tests/test_graphics_wrapString.js index 72707d3ea3..9b30be7ffc 100644 --- a/tests/test_graphics_wrapString.js +++ b/tests/test_graphics_wrapString.js @@ -39,6 +39,11 @@ g.clear().setFont("4x6"); lines = g.wrapString("X", 10); SHOULD_BE(lines, ["X"]); +// wrap a long word to multiple lines +g.clear().setFont("4x6"); +lines = g.wrapString("ABCDEFGHIJ", 10); +SHOULD_BE(lines, ["AB","CD","EF","GH","IJ"]); + // word too big for a line - should be split g.clear().setFont("4x6"); lines = g.wrapString("A very LongWord is not here", 30); From ae24408b69a22201bcc80d00eeb480cacef552d1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 11 May 2022 16:28:29 +0100 Subject: [PATCH 0064/1183] debug flags --- README_JIT.md | 4 ++++ src/jsflags.h | 6 +++++- src/jsjitc.c | 25 ++++++++++++++++++++----- src/jsjitc.h | 2 +- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index d9ecb428a4..72d553bd1e 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -9,7 +9,11 @@ JIT compiler testing * Build for ARM: `USE_JIT=1 BOARD=NRF52832DK_MIN RELEASE=1 make flash` + ``` +// Enable debug output +E.setFlags({jitDebug:1}); + var jit = E.nativeCall(1, "JsVar()", E.JIT("1")) jit()==1 diff --git a/src/jsflags.h b/src/jsflags.h index 5370872ed0..08975c24ae 100644 --- a/src/jsflags.h +++ b/src/jsflags.h @@ -22,9 +22,13 @@ typedef enum { JSF_PRETOKENISE = 1<<1, ///< When adding functions, pre-minify them and tokenise reserved words JSF_UNSAFE_FLASH = 1<<2, ///< Some platforms stop writes/erases to interpreter memory to stop you bricking the device accidentally - this removes that protection JSF_UNSYNC_FILES = 1<<3, ///< When accessing files, *don't* flush all data to the SD card after each command. Faster, but risky if power is lost +#ifdef ESPR_JIT + JSF_JIT_DEBUG = 1<<4, ///< When JIT enabled, +#endif } PACKED_FLAGS JsFlags; -#define JSFLAG_NAMES "deepSleep\0pretokenise\0unsafeFlash\0unsyncFiles\0" + +#define JSFLAG_NAMES "deepSleep\0pretokenise\0unsafeFlash\0unsyncFiles\0jitDebug\0" // NOTE: \0 also added by compiler - two \0's are required! extern volatile JsFlags jsFlags; diff --git a/src/jsjitc.c b/src/jsjitc.c index cfd0ae1a62..cfe288a84e 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -22,15 +22,17 @@ * Use a String iterator for writing to jitCode - it'll be a lot faster */ -//#ifdef ESPR_JIT +#ifdef ESPR_JIT + +#define DEBUG_JIT jsjcDebugPrintf -#define DEBUG_JIT jsiConsolePrintf #if defined(LINUX) && defined(DEBUG) #define JIT_OUTPUT_FILE "jit.bin" #endif #include "jsjitc.h" #include "jsinteractive.h" +#include "jsflags.h" #ifdef JIT_OUTPUT_FILE #include @@ -40,6 +42,15 @@ FILE *f; // The ARM Thumb-2 code we're in the process of creating JsVar *jitCode = 0; +void jsjcDebugPrintf(const char *fmt, ...) { + if (jsFlags & JSF_JIT_DEBUG) { + va_list argp; + va_start(argp, fmt); + vcbprintf((vcbprintf_callback)jsiConsolePrint,0, fmt, argp); + va_end(argp); + } +} + void jsjcStart() { #ifdef JIT_OUTPUT_FILE f = fopen(JIT_OUTPUT_FILE, "wb"); @@ -57,6 +68,10 @@ JsVar *jsjcStop() { return v; } +int jsjcGetByteCount() { + return jsvGetStringLength(jitCode); +} + void jsjcEmit16(uint16_t v) { //DEBUG_JIT("> %04x\n", v); #ifdef JIT_OUTPUT_FILE @@ -86,7 +101,7 @@ void jsjcLiteral16(int reg, bool hi16, uint16_t data) { } void jsjcLiteral32(int reg, uint32_t data) { - DEBUG_JIT("L32 r%d,0x%08x\n", reg,data); // wrong? + DEBUG_JIT("MOV r%d,#0x%08x\n", reg,data); // bit shifted 8 bits? https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Immediate-constants/Encoding?lang=en // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/MOVT if (data<256) { @@ -129,7 +144,7 @@ int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate) { } void jsjcBranchRelative(int bytes) { - DEBUG_JIT("B %d\n", (uint32_t)(bytes)); + DEBUG_JIT("B %s%d\n", (bytes>0)?"+":"", (uint32_t)(bytes)); bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-4096 && bytes<4096); // only multiples of 2 bytes @@ -221,4 +236,4 @@ void jsjcPopAllAndReturn() { jsjcEmit16(0b0100011100000000 | (reg<<3)); }*/ -//#endif /* ESPR_JIT */ +#endif /* ESPR_JIT */ diff --git a/src/jsjitc.h b/src/jsjitc.h index ed524077e0..96523b539c 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -90,5 +90,5 @@ void jsjcStoreImm(int reg, int regAddr, int offset); void jsjcPushAll(); void jsjcPopAllAndReturn(); -#endif /* JSJIT_H_ */ +#endif /* JSJITC_H_ */ #endif /* ESPR_JIT */ From 240b7e1db666114f2f4e39fe5a68061ab9462671 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 11 May 2022 16:28:38 +0100 Subject: [PATCH 0065/1183] fix linux build --- src/jsvar.c | 12 ++++++++---- targets/linux/main.c | 3 +++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/jsvar.c b/src/jsvar.c index 2848d5048a..007dff87a9 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -259,9 +259,8 @@ void jsvInit(unsigned int size) { jsVarsSize = JSVAR_BLOCK_SIZE; jsVarBlocks = malloc(sizeof(JsVar*)); // just 1 #if defined(ESPR_JIT) && defined(LINUX) - if (!jsVars) - jsVarBlocks[0] = (JsVar *)mmap(NULL, sizeof(JsVar) * JSVAR_BLOCK_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + jsVarBlocks[0] = (JsVar *)mmap(NULL, sizeof(JsVar) * JSVAR_BLOCK_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); #else jsVarBlocks[0] = malloc(sizeof(JsVar) * JSVAR_BLOCK_SIZE); #endif @@ -285,8 +284,13 @@ void jsvInit(unsigned int size) { void jsvKill() { #ifdef RESIZABLE_JSVARS unsigned int i; - for (i=0;i>JSVAR_BLOCK_SHIFT;i++) + for (i=0;i>JSVAR_BLOCK_SHIFT;i++) { +#if defined(ESPR_JIT) && defined(LINUX) + munmap(jsVarBlocks[i], sizeof(JsVar) * JSVAR_BLOCK_SIZE); +#else free(jsVarBlocks[i]); +#endif + } free(jsVarBlocks); jsVarBlocks = 0; jsVarsSize = 0; diff --git a/targets/linux/main.c b/targets/linux/main.c index e5110843b9..e482d342de 100644 --- a/targets/linux/main.c +++ b/targets/linux/main.c @@ -19,6 +19,9 @@ #ifdef ESPR_JIT #include "jsjit.h" #endif +#ifndef JSVAR_CACHE_SIZE +#define JSVAR_CACHE_SIZE 0 +#endif #define TEST_DIR "tests/" #define CMD_NAME "espruino" From 893be4b00df332e5b9153836d7f5e1bfc5d1eeb9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 11 May 2022 16:48:02 +0100 Subject: [PATCH 0066/1183] better JIT error handling - if JIT fails print an error but parse the function as normal JS --- README_JIT.md | 2 ++ src/jsjit.c | 70 +++++++++++++++++++++++++++++++++++++++------------ src/jsparse.c | 24 ++++++++++++------ 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 72d553bd1e..4dbe5028b9 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -59,6 +59,8 @@ function jit() {'jit';digitalWrite(LED1,1);} ./espruino -e "E.JIT('print(42)')" +./espruino -e 'E.setFlags({jitDebug:1});function a() {"jit";for (i=0;i<5;i++) print(i);}' + ``` When running on Linux, `function jit() {'jit';print(42);}` seems to actually call the function ok, and prints 42. Stack is trashed after (and possibly even before!). diff --git a/src/jsjit.c b/src/jsjit.c index 9b6ca7e295..3dfe0f637c 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -12,20 +12,22 @@ * ---------------------------------------------------------------------------- */ -//#ifdef ESPR_JIT +#ifdef ESPR_JIT #include "jsjit.h" #include "jsjitc.h" +#include "jsinteractive.h" #define JSP_ASSERT_MATCH(TOKEN) { assert(lex->tk==(TOKEN));jslGetNextToken(); } // Match where if we have the wrong token, it's an internal error #define JSP_MATCH(TOKEN) if (!jslMatch((TOKEN))) return; // Match where the user could have given us the wrong token -#define JSJ_PARSING true +#define JSJ_PARSING (!(execInfo.execute&EXEC_EXCEPTION)) // ---------------------------------------------------------------------------- void jsjUnaryExpression(); void jsjAssignmentExpression(); void jsjExpression(); void jsjStatement(); +void jsjBlockOrStatement(); // ---------------------------------------------------------------------------- void jsjPopAsVar(int reg) { @@ -185,7 +187,7 @@ void jsjFactorFunctionCall() { jsjcCall(jsvUnLock2); // unlock // FIXME - also unlock/clear 'parent' // parent=0; - // a = jspeFactorMember(a, &parent); + // a = jsjFactorMember(a, &parent); } } @@ -213,7 +215,7 @@ void jsjPostfixExpression() { int op = lex->tk; JSP_ASSERT_MATCH(op); /* - a = jspePostfixExpression(); + a = jsjPostfixExpression(); if (JSP_SHOULD_EXECUTE) { JsVar *one = jsvNewFromInteger(1); JsVar *res = jsvMathsOpSkipNames(a, one, op==LEX_PLUSPLUS ? '+' : '-'); @@ -384,11 +386,11 @@ void jsjBinaryExpression() { } void jsjAssignmentExpression() { - // FIXME return __jspeAssignmentExpression(jspeConditionalExpression()); + // FIXME return __jsjAssignmentExpression(jsjConditionalExpression()); jsjBinaryExpression(); } -// ',' is allowed to add multiple expressions, this is not allowed in jspeAssignmentExpression +// ',' is allowed to add multiple expressions, this is not allowed in jsjAssignmentExpression void jsjExpression() { while (JSJ_PARSING) { jsjAssignmentExpression(); @@ -412,6 +414,28 @@ void jsjBlock() { JSP_MATCH('}'); } +void jsjStatementFor() { + JSP_ASSERT_MATCH(LEX_R_FOR); + JSP_MATCH('('); + bool wasInLoop = (execInfo.execute&EXEC_IN_LOOP)!=0; + execInfo.execute |= EXEC_FOR_INIT; + // initialisation + JsVar *forStatement = 0; + // we could have 'for (;;)' - so don't munch up our semicolon if that's all we have + if (lex->tk != ';') + jsjStatement(); + JSP_MATCH(';'); + if (lex->tk != ';') { + jsjExpression(); // condition + } + JSP_MATCH(';'); + if (lex->tk != ')') { // we could have 'for (;;)' + jsjExpression(); // iterator + } + JSP_MATCH(')'); + jsjBlockOrStatement(); +} + void jsjStatement() { if (lex->tk==LEX_ID || lex->tk==LEX_INT || @@ -448,17 +472,17 @@ void jsjStatement() { /*} else if (lex->tk==LEX_R_VAR || lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST) { - return jspeStatementVar(); + return jsjStatementVar(); } else if (lex->tk==LEX_R_IF) { - return jspeStatementIf(); + return jsjStatementIf(); } else if (lex->tk==LEX_R_DO) { - return jspeStatementDoOrWhile(false); + return jsjStatementDoOrWhile(false); } else if (lex->tk==LEX_R_WHILE) { - return jspeStatementDoOrWhile(true); + return jsjStatementDoOrWhile(true);*/ } else if (lex->tk==LEX_R_FOR) { - return jspeStatementFor(); - } else if (lex->tk==LEX_R_TRY) { - return jspeStatementTry();*/ + return jsjStatementFor(); + /*} else if (lex->tk==LEX_R_TRY) { + return jsjStatementTry();*/ } else if (lex->tk==LEX_R_RETURN) { JSP_ASSERT_MATCH(LEX_R_RETURN); if (lex->tk != ';' && lex->tk != '}') { @@ -477,7 +501,7 @@ void jsjStatement() { JSP_ASSERT_MATCH(LEX_R_BREAK); if (JSP_SHOULD_EXECUTE) { } else if (lex->tk==LEX_R_SWITCH) { - return jspeStatementSwitch();*/ + return jsjStatementSwitch();*/ } else JSP_MATCH(LEX_EOF); } @@ -502,7 +526,21 @@ JsVar *jsjParseFunction() { // Return 'undefined' from function if no other return statement jsjcLiteral32(0, 0); jsjcPopAllAndReturn(); - return jsjcStop(); + JsVar *v = jsjcStop(); + JsVar *exception = jspGetException(); + if (!exception) return v; + // We had an error - don't return half-complete code + jsiConsolePrintf("JIT %v\n", exception); + if (jsvIsObject(exception)) { + JsVar *stackTrace = jsvObjectGetChild(exception, "stack", 0); + if (stackTrace) { + jsiConsolePrintStringVar(stackTrace); + jsvUnLock(stackTrace); + } + } + jsvUnLock(exception); + jsvUnLock(v); + return 0; } JsVar *jsjEvaluateVar(JsVar *str) { @@ -534,4 +572,4 @@ JsVar *jsjEvaluate(const char *str) { return v; } -//#endif /*#ifdef ESPR_JIT*/ +#endif /*#ifdef ESPR_JIT*/ diff --git a/src/jsparse.c b/src/jsparse.c index 768c6e83a0..0d425c93d4 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -335,6 +335,7 @@ NO_INLINE bool jspeFunctionArguments(JsVar *funcVar) { // Parse function, assuming we're on '{'. funcVar can be 0. returns 'true' is the function included the 'this' keyword NO_INLINE bool jspeFunctionDefinitionInternal(JsVar *funcVar, bool expressionOnly) { + JslCharPos funcBegin; bool forcePretokenise = false; if (expressionOnly) { @@ -353,13 +354,23 @@ NO_INLINE bool jspeFunctionDefinitionInternal(JsVar *funcVar, bool expressionOnl #ifdef ESPR_JIT if (!strcmp(jslGetTokenValueAsString(), "jit")) { JSP_ASSERT_MATCH(LEX_STR); + // save start position so if we fail we go back to a normal function parse + JslCharPos funcCodeStart; + jslCharPosFromLex(&funcCodeStart); JsVar *funcCodeVar = jsjParseFunction(); - funcVar->flags = (funcVar->flags & ~JSV_VARTYPEMASK) | JSV_NATIVE_FUNCTION; // convert to native fn - funcVar->varData.native.ptr = (void *)(size_t)1; // offset 1 = 'thumb' - funcVar->varData.native.argTypes = JSWAT_JSVAR; // FIXME - need to add parameters if any specified... - jsvUnLock2(jsvAddNamedChild(funcVar, funcCodeVar, JSPARSE_FUNCTION_CODE_NAME), funcCodeVar); - JSP_MATCH('}'); - return true; // assume 'this' included for now (optimisation: figure out if 'this' was used) + if (funcCodeVar) { // compilation could have failed! + funcVar->flags = (funcVar->flags & ~JSV_VARTYPEMASK) | JSV_NATIVE_FUNCTION; // convert to native fn + funcVar->varData.native.ptr = (void *)(size_t)1; // offset 1 = 'thumb' + funcVar->varData.native.argTypes = JSWAT_JSVAR; // FIXME - need to add parameters if any specified... + jsvUnLock2(jsvAddNamedChild(funcVar, funcCodeVar, JSPARSE_FUNCTION_CODE_NAME), funcCodeVar); + JSP_MATCH('}'); + jslCharPosFree(&funcCodeStart); + return true; + } else { + // Set lex to start back... now we parse function as normal JS like before + jslSeekToP(&funcCodeStart); + jslCharPosFree(&funcCodeStart); + } } #endif } @@ -382,7 +393,6 @@ NO_INLINE bool jspeFunctionDefinitionInternal(JsVar *funcVar, bool expressionOnl } #endif // Get the code - parse it and figure out where it stops - JslCharPos funcBegin; jslSkipWhiteSpace(); jslCharPosNew(&funcBegin, lex->sourceVar, lex->tokenStart); int lastTokenEnd = -1; From f5b3a9b2e7007773b2214d376e891dc38ae12952 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 11 May 2022 17:03:39 +0100 Subject: [PATCH 0067/1183] Assignments working --- README_JIT.md | 5 +++- src/jsjit.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 4dbe5028b9..e9c57b0ec6 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -49,6 +49,9 @@ function jit() {'jit'; return t()+" world";} jit()=="Hello world" function jit() {'jit';digitalWrite(LED1,1);} + +function jit() {'jit';i=42;} +jit();print(i); ``` @@ -59,8 +62,8 @@ function jit() {'jit';digitalWrite(LED1,1);} ./espruino -e "E.JIT('print(42)')" +./espruino -e 'E.setFlags({jitDebug:1});function a() {"jit";i=5}' ./espruino -e 'E.setFlags({jitDebug:1});function a() {"jit";for (i=0;i<5;i++) print(i);}' - ``` When running on Linux, `function jit() {'jit';print(42);}` seems to actually call the function ok, and prints 42. Stack is trashed after (and possibly even before!). diff --git a/src/jsjit.c b/src/jsjit.c index 3dfe0f637c..b854f6b0ee 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -48,6 +48,12 @@ void jsjPopAndUnLock() { jsjcCall(jsvUnLock); // we're throwing this away now - unlock } +void jsjPopNoName(int reg) { + jsjPopAsVar(0); // a -> r0 + jsjcCall(jsvSkipNameAndUnLock); // optimisation: we should know if we have a var or a name here, so can skip jsvSkipNameAndUnLock sometimes + if (reg != 0) jsjcMov(reg, 0); +} + void jsjFactor() { if (lex->tk==LEX_ID) { JsVar *a = jslGetTokenValueAsVar(); @@ -150,7 +156,8 @@ void jsjFactorFunctionCall() { while (JSJ_PARSING && lex->tk!=')' && lex->tk!=LEX_EOF) { argCount++; jsjAssignmentExpression(); - jsjcCall(jsvSkipNameAndUnLock); // optimisation: we should know if we have a var or a name here, so can skip jsvSkipNameAndUnLock sometimes + jsjPopNoName(0); + jsjcPush(0, JSJVT_JSVAR); // push argument to stack if (lex->tk!=')') JSP_MATCH(','); } JSP_MATCH(')'); @@ -385,11 +392,69 @@ void jsjBinaryExpression() { __jsjBinaryExpression(0); } -void jsjAssignmentExpression() { - // FIXME return __jsjAssignmentExpression(jsjConditionalExpression()); +JsVar *jsjConditionalExpression() { + // FIXME return __jsjConditionalExpression(jsjBinaryExpression()); jsjBinaryExpression(); } +NO_INLINE void jsjAssignmentExpression() { + // parse LHS + jsjConditionalExpression(); + if (!JSJ_PARSING) return; + if (lex->tk=='='/* || lex->tk==LEX_PLUSEQUAL || lex->tk==LEX_MINUSEQUAL || + lex->tk==LEX_MULEQUAL || lex->tk==LEX_DIVEQUAL || lex->tk==LEX_MODEQUAL || + lex->tk==LEX_ANDEQUAL || lex->tk==LEX_OREQUAL || + lex->tk==LEX_XOREQUAL || lex->tk==LEX_RSHIFTEQUAL || + lex->tk==LEX_LSHIFTEQUAL || lex->tk==LEX_RSHIFTUNSIGNEDEQUAL*/) { + JsVar *rhs; + + int op = lex->tk; + JSP_ASSERT_MATCH(op); + jsjAssignmentExpression(); + jsjPopNoName(1); // ensure we get rid of any references on the RHS + jsjcPop(0); // pop LHS + jsjcPush(0, JSJVT_JSVAR); // push LHS back on as this is our result value + + + if (op=='=') { + jsjcCall(jsvReplaceWithOrAddToRoot); + } else { +#if 0 + if (op==LEX_PLUSEQUAL) op='+'; + else if (op==LEX_MINUSEQUAL) op='-'; + else if (op==LEX_MULEQUAL) op='*'; + else if (op==LEX_DIVEQUAL) op='/'; + else if (op==LEX_MODEQUAL) op='%'; + else if (op==LEX_ANDEQUAL) op='&'; + else if (op==LEX_OREQUAL) op='|'; + else if (op==LEX_XOREQUAL) op='^'; + else if (op==LEX_RSHIFTEQUAL) op=LEX_RSHIFT; + else if (op==LEX_LSHIFTEQUAL) op=LEX_LSHIFT; + else if (op==LEX_RSHIFTUNSIGNEDEQUAL) op=LEX_RSHIFTUNSIGNED; + if (op=='+' && jsvIsName(lhs)) { + JsVar *currentValue = jsvSkipName(lhs); + if (jsvIsBasicString(currentValue) && jsvGetRefs(currentValue)==1 && rhs!=currentValue) { + /* A special case for string += where this is the only use of the string + * and we're not appending to ourselves. In this case we can do a + * simple append (rather than clone + append)*/ + JsVar *str = jsvAsString(rhs); + jsvAppendStringVarComplete(currentValue, str); + jsvUnLock(str); + op = 0; + } + jsvUnLock(currentValue); + } + if (op) { + /* Fallback which does a proper add */ + JsVar *res = jsvMathsOpSkipNames(lhs,rhs,op); + jsvReplaceWith(lhs, res); + jsvUnLock(res); + } +#endif + } + } +} + // ',' is allowed to add multiple expressions, this is not allowed in jsjAssignmentExpression void jsjExpression() { while (JSJ_PARSING) { @@ -487,8 +552,7 @@ void jsjStatement() { JSP_ASSERT_MATCH(LEX_R_RETURN); if (lex->tk != ';' && lex->tk != '}') { jsjExpression(); - jsjPopAsVar(0); // a -> r0 - jsjcCall(jsvSkipNameAndUnLock); // we only want the value, so skip the name if there was one + jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one } else { jsjcLiteral32(0, 0); } @@ -551,8 +615,7 @@ JsVar *jsjEvaluateVar(JsVar *str) { jsjcStart(); jsjcPushAll(); jsjExpression(); - jsjPopAsVar(0); // a -> r0 - jsjcCall(jsvSkipNameAndUnLock); // we only want the value, so skip the name if there was one + jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one jsjcPopAllAndReturn(); JsVar *v = jsjcStop(); jslKill(); From b3fec3e08313a9eb4dc3af97595e7e0cc72080fe Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 12 May 2022 11:41:36 +0100 Subject: [PATCH 0068/1183] IF statement works, *almost* working FOR --- README_JIT.md | 19 ++++++++++-- src/jsjit.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/jsjitc.c | 65 ++++++++++++++++++++++++++++++++------ src/jsjitc.h | 18 +++++++++++ 4 files changed, 174 insertions(+), 14 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index e9c57b0ec6..806b94a37f 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -52,6 +52,18 @@ function jit() {'jit';digitalWrite(LED1,1);} function jit() {'jit';i=42;} jit();print(i); + +function jit() {'jit';return 1<2;} +jit();print(i); + +E.setFlags({jitDebug:1}) +function jit() {"jit";if (i<3) print("T"); else print("X");} +i=2;jit() + +E.setFlags({jitDebug:1}) +function jit() {"jit";for (i=0;i<5;i=i+1) print(i);} + + ``` @@ -62,8 +74,11 @@ jit();print(i); ./espruino -e "E.JIT('print(42)')" -./espruino -e 'E.setFlags({jitDebug:1});function a() {"jit";i=5}' -./espruino -e 'E.setFlags({jitDebug:1});function a() {"jit";for (i=0;i<5;i++) print(i);}' +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";i=5}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";if (i<3) print("T"); else print("X");}}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";for (i=0;i<5;i=i+1) print(i);}' ``` When running on Linux, `function jit() {'jit';print(42);}` seems to actually call the function ok, and prints 42. Stack is trashed after (and possibly even before!). diff --git a/src/jsjit.c b/src/jsjit.c index b854f6b0ee..536bccd51c 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -42,6 +42,13 @@ void jsjPopAsVar(int reg) { assert(0); } +void jsjPopAsBool(int reg) { + // FIXME handle int/bool differently? + jsjPopAsVar(0); + jsjcCall(jsvGetBoolAndUnLock); // optimisation: we should know if we have a var or a name here, so can skip jsvSkipNameAndUnLock sometimes + if (reg != 0) jsjcMov(reg, 0); +} + void jsjPopAndUnLock() { jsjPopAsVar(0); // a -> r0 // optimisation: if item on stack is NOT a variable, no need to covert+unlock! @@ -141,7 +148,9 @@ void jsjFactorFunctionCall() { // FIXME: what about 'new'? while (lex->tk=='(' /*|| (isConstructor && JSP_SHOULD_EXECUTE))*/ && JSJ_PARSING) { + DEBUG_JIT("; FUNCTION CALL r4 = funcName\n"); jsjcPop(4); // r4 = funcName + DEBUG_JIT("; FUNCTION CALL arguments\n"); /* PARSE OUR ARGUMENTS * Push each new argument onto the stack (it grows down) * Args are in the wrong order, so we emit code to swap around the args in the array @@ -166,6 +175,7 @@ void jsjFactorFunctionCall() { jsjcPush(3, JSJVT_INT); // argPtr // Args are in the wrong order - we have to swap them around if we have >1! if (argCount>1) { + DEBUG_JIT("; FUNCTION CALL reverse arguments\n"); for (int i=0;itk==LEX_R_ELSE) { + JSP_ASSERT_MATCH(LEX_R_ELSE); + DEBUG_JIT("; capture IF false block\n"); + oldBlock = jsjcStartBlock(); + jsjBlockOrStatement(); + falseBlock = jsjcStopBlock(oldBlock); + } + DEBUG_JIT("; IF jump after condition\n"); + // if false, jump after true block (if an 'else' we need to jump over the jsjcBranchRelative + jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(trueBlock) + (falseBlock?2:0)); + DEBUG_JIT("; IF true block\n"); + jsjcEmitBlock(trueBlock); + jsvUnLock(trueBlock); + if (falseBlock) { + jsjcBranchRelative(jsvGetStringLength(falseBlock)); // jump over false block + DEBUG_JIT("; IF false block\n"); + jsjcEmitBlock(falseBlock); + jsvUnLock(falseBlock); + } + DEBUG_JIT("; IF end\n"); + +} + void jsjStatementFor() { JSP_ASSERT_MATCH(LEX_R_FOR); JSP_MATCH('('); @@ -487,18 +540,45 @@ void jsjStatementFor() { // initialisation JsVar *forStatement = 0; // we could have 'for (;;)' - so don't munch up our semicolon if that's all we have + // Parse initialiser - we always run this so march right in and create code + DEBUG_JIT("; FOR initialiser\n"); if (lex->tk != ';') jsjStatement(); JSP_MATCH(';'); + // Condition - we run this first time, so we go straight through here, but save the position so we can jump back here + // after the main loop + int codePosCondition = jsjcGetByteCount(); + DEBUG_JIT("; FOR condition\n"); if (lex->tk != ';') { jsjExpression(); // condition + jsjPopAsBool(0); + jsjcCompareImm(0, 0); + // We add a jump to the end after we've parsed everything and know the size } JSP_MATCH(';'); + JsVar *oldBlock = jsjcStartBlock(); if (lex->tk != ')') { // we could have 'for (;;)' jsjExpression(); // iterator + jsjPopAndUnLock(); } - JSP_MATCH(')'); + JsVar *iteratorBlock = jsjcStopBlock(oldBlock); + JSP_MATCH(')'); // FIXME: clean up on exit + // Now parse the actual code to execute + oldBlock = jsjcStartBlock(); jsjBlockOrStatement(); + JsVar *mainBlock = jsjcStopBlock(oldBlock); + // Now figure out the jump length and jump (if condition is false) + jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(iteratorBlock) + jsvGetStringLength(mainBlock) + 2); + DEBUG_JIT("; FOR Main block\n"); + jsjcEmitBlock(mainBlock); + jsvUnLock(mainBlock); + DEBUG_JIT("; FOR Iterator block\n"); + jsjcEmitBlock(iteratorBlock); + jsvUnLock(iteratorBlock); + // after the iterator, jump back to condition + DEBUG_JIT("; FOR jump back to condition\n"); + jsjcBranchConditionalRelative(JSJAC_EQ, codePosCondition - jsjcGetByteCount()); + DEBUG_JIT("; FOR end\n"); } void jsjStatement() { @@ -537,10 +617,10 @@ void jsjStatement() { /*} else if (lex->tk==LEX_R_VAR || lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST) { - return jsjStatementVar(); + return jsjStatementVar();*/ } else if (lex->tk==LEX_R_IF) { return jsjStatementIf(); - } else if (lex->tk==LEX_R_DO) { + /*} else if (lex->tk==LEX_R_DO) { return jsjStatementDoOrWhile(false); } else if (lex->tk==LEX_R_WHILE) { return jsjStatementDoOrWhile(true);*/ diff --git a/src/jsjitc.c b/src/jsjitc.c index cfe288a84e..7e56c0a358 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -24,8 +24,6 @@ */ #ifdef ESPR_JIT -#define DEBUG_JIT jsjcDebugPrintf - #if defined(LINUX) && defined(DEBUG) #define JIT_OUTPUT_FILE "jit.bin" #endif @@ -41,6 +39,7 @@ FILE *f; // The ARM Thumb-2 code we're in the process of creating JsVar *jitCode = 0; +int blockCount = 0; void jsjcDebugPrintf(const char *fmt, ...) { if (jsFlags & JSF_JIT_DEBUG) { @@ -56,9 +55,11 @@ void jsjcStart() { f = fopen(JIT_OUTPUT_FILE, "wb"); #endif jitCode = jsvNewFromEmptyString(); + blockCount = 0; } JsVar *jsjcStop() { + assert(blockCount==0); #ifdef JIT_OUTPUT_FILE fclose(f); #endif @@ -68,12 +69,23 @@ JsVar *jsjcStop() { return v; } -int jsjcGetByteCount() { - return jsvGetStringLength(jitCode); +// Called before start of a block of code. Returns the old code jsVar that should be passed into jsjcStopBlock +JsVar *jsjcStartBlock() { + JsVar *v = jitCode; + jitCode = jsvNewFromEmptyString(); + blockCount++; + return v; +} +// Called when JIT output stops, pass it the return value from jsjcStartBlock. Returns the code parsed in the block +JsVar *jsjcStopBlock(JsVar *oldBlock) { + JsVar *v = jitCode; + jitCode = oldBlock; + blockCount--; + return v; } void jsjcEmit16(uint16_t v) { - //DEBUG_JIT("> %04x\n", v); + DEBUG_JIT("> %04x\n", v); #ifdef JIT_OUTPUT_FILE fputc(v&255, f); fputc(v>>8, f); @@ -81,9 +93,27 @@ void jsjcEmit16(uint16_t v) { jsvAppendStringBuf(jitCode, (char *)&v, 2); } +// Emit a whole block of code +void jsjcEmitBlock(JsVar *block) { + DEBUG_JIT("... code block ...\n"); + JsvStringIterator it; + jsvStringIteratorNew(&it, block, 0); + while (jsvStringIteratorHasChar(&it)) { + unsigned int v = (unsigned)jsvStringIteratorGetCharAndNext(&it); + v = v | (((unsigned)jsvStringIteratorGetCharAndNext(&it)) << 8); + jsjcEmit16((uint16_t)v); + } + jsvStringIteratorFree(&it); +} + +int jsjcGetByteCount() { + return jsvGetStringLength(jitCode); +} + void jsjcLiteral8(int reg, uint8_t data) { assert(reg<8); // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 + // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/MOV--immediate- int n = 0b0010000000000000 | (reg<<8) | data; jsjcEmit16((uint16_t)n); } @@ -91,6 +121,7 @@ void jsjcLiteral8(int reg, uint8_t data) { void jsjcLiteral16(int reg, bool hi16, uint16_t data) { assert(reg<16); // https://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf page 347 + // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/MOV--immediate- int imm4,i,imm3,imm8; imm4 = (data>>12)&15; i = (data>>11)&1; @@ -143,16 +174,32 @@ int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate) { return len; } +// Compare a register with a literal. jsjcBranchConditionalRelative can then be called +void jsjcCompareImm(int reg, int literal) { + DEBUG_JIT("CMP r%d,#%d\n", reg, literal); + assert(reg<16); + assert(literal>=0 && literal<256); // only multiples of 2 bytes + int imm8 = literal & 255; + jsjcEmit16((uint16_t)(0b0010100000000000 | (reg<<8) | imm8)); // unconditional branch +} + void jsjcBranchRelative(int bytes) { - DEBUG_JIT("B %s%d\n", (bytes>0)?"+":"", (uint32_t)(bytes)); + DEBUG_JIT("B %s%d (addr 0x%04x)\n", (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-4096 && bytes<4096); // only multiples of 2 bytes int imm11 = (bytes>>1) & 2047; jsjcEmit16((uint16_t)(0b1110000000000000 | imm11)); // unconditional branch - /*JsjAsmCondition cond = ...; - int imm8 = (pos>>1) & 255; - jsjcEmit16((uint16_t)(0b1101000000000000 | (cond<<8) | imm8));*/ // conditional branch +} + +// Jump a number of bytes forward or back, based on condition flags +void jsjcBranchConditionalRelative(JsjAsmCondition cond, int bytes) { + DEBUG_JIT("B[%d] %s%d (addr 0x%04x)\n", cond, (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); + bytes -= 2; // because PC is ahead by 2 + assert(!(bytes&1)); // only multiples of 2 bytes + assert(bytes>=-512 && bytes<512); // only multiples of 2 bytes + int imm8 = (bytes>>1) & 255; + jsjcEmit16((uint16_t)(0b1101000000000000 | (cond<<8) | imm8)); // conditional branch } #ifdef DEBUG_JIT_CALLS diff --git a/src/jsjitc.h b/src/jsjitc.h index 96523b539c..5fa9a60544 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -18,6 +18,10 @@ #include "jsutils.h" #include "jsjit.h" +#define DEBUG_JIT jsjcDebugPrintf +// Called to print debug info - best to use DEBUG_JIT so we can disable debug lines for final compiles though +void jsjcDebugPrintf(const char *fmt, ...); + typedef enum { JSJVT_INT, JSJVT_JSVAR @@ -50,10 +54,20 @@ typedef enum { JSJAR_PC = 15, } JsjAsmReg; + + // Called before start of JIT output void jsjcStart(); // Called when JIT output stops JsVar *jsjcStop(); +// Called before start of a block of code. Returns the old code jsVar that should be passed into jsjcStopBlock +JsVar *jsjcStartBlock(); +// Called when JIT output stops, pass it the return value from jsjcStartBlock. Returns the code parsed in the block +JsVar *jsjcStopBlock(JsVar *oldBlock); +// Emit a whole block of code +void jsjcEmitBlock(JsVar *block); +// Get what byte we're at in our code +int jsjcGetByteCount(); // Add 16 bit literal void jsjcLiteral16(int reg, bool hi16, uint16_t data); @@ -70,8 +84,12 @@ void jsjcCall(void *c); #endif // Store a string of data and put the address in a register. Returns the length int jsjcLiteralString(int reg, JsVar *str, bool nullTerminate); +// Compare a register with a literal. jsjcBranchConditionalRelative can then be called +void jsjcCompareImm(int reg, int literal); // Jump a number of bytes forward or back void jsjcBranchRelative(int bytes); +// Jump a number of bytes forward or back, based on condition flags +void jsjcBranchConditionalRelative(JsjAsmCondition cond, int bytes); // Move one register to another void jsjcMov(int regTo, int regFrom); // Push a register onto the stack From fc003afe47364eaa1cde27a9c8040f3ae9187104 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 12 May 2022 12:40:32 +0100 Subject: [PATCH 0069/1183] tweaks --- src/jsjit.c | 5 ++++- src/jsjitc.c | 18 +++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/jsjit.c b/src/jsjit.c index 536bccd51c..be1979e582 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -425,12 +425,15 @@ NO_INLINE void jsjAssignmentExpression() { JSP_ASSERT_MATCH(op); jsjAssignmentExpression(); jsjPopNoName(1); // ensure we get rid of any references on the RHS + jsjcMov(4, 1); // save RHS in r4 so we can unlock it jsjcPop(0); // pop LHS jsjcPush(0, JSJVT_JSVAR); // push LHS back on as this is our result value if (op=='=') { jsjcCall(jsvReplaceWithOrAddToRoot); + jsjcMov(0, 4); // unlock RHS + jsjcCall(jsvUnLock); } else { #if 0 if (op==LEX_PLUSEQUAL) op='+'; @@ -577,7 +580,7 @@ void jsjStatementFor() { jsvUnLock(iteratorBlock); // after the iterator, jump back to condition DEBUG_JIT("; FOR jump back to condition\n"); - jsjcBranchConditionalRelative(JSJAC_EQ, codePosCondition - jsjcGetByteCount()); + jsjcBranchRelative(codePosCondition - (jsjcGetByteCount()+2)); DEBUG_JIT("; FOR end\n"); } diff --git a/src/jsjitc.c b/src/jsjitc.c index 7e56c0a358..437f658bef 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -43,6 +43,8 @@ int blockCount = 0; void jsjcDebugPrintf(const char *fmt, ...) { if (jsFlags & JSF_JIT_DEBUG) { + if (!blockCount) jsiConsolePrintf("%6x: ", jsjcGetByteCount()); + else jsiConsolePrintf(" : "); va_list argp; va_start(argp, fmt); vcbprintf((vcbprintf_callback)jsiConsolePrint,0, fmt, argp); @@ -87,8 +89,10 @@ JsVar *jsjcStopBlock(JsVar *oldBlock) { void jsjcEmit16(uint16_t v) { DEBUG_JIT("> %04x\n", v); #ifdef JIT_OUTPUT_FILE - fputc(v&255, f); - fputc(v>>8, f); + if (!blockCount) { + fputc(v&255, f); + fputc(v>>8, f); + } #endif jsvAppendStringBuf(jitCode, (char *)&v, 2); } @@ -184,18 +188,18 @@ void jsjcCompareImm(int reg, int literal) { } void jsjcBranchRelative(int bytes) { + bytes -= 2; // because PC is ahead by 2 DEBUG_JIT("B %s%d (addr 0x%04x)\n", (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); - bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-4096 && bytes<4096); // only multiples of 2 bytes - int imm11 = (bytes>>1) & 2047; + int imm11 = ((unsigned int)(bytes)>>1) & 2047; jsjcEmit16((uint16_t)(0b1110000000000000 | imm11)); // unconditional branch } // Jump a number of bytes forward or back, based on condition flags void jsjcBranchConditionalRelative(JsjAsmCondition cond, int bytes) { + bytes -= 2; // because PC is ahead by 2 DEBUG_JIT("B[%d] %s%d (addr 0x%04x)\n", cond, (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); - bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-512 && bytes<512); // only multiples of 2 bytes int imm8 = (bytes>>1) & 255; @@ -214,9 +218,9 @@ void jsjcCall(void *c) { } else */{ jsjcLiteral32(7, (uint32_t)(size_t)c); // save address to r7 #ifdef DEBUG_JIT_CALLS - DEBUG_JIT("BL r7 (%s)\n", name); + DEBUG_JIT("BLX r7 (%s)\n", name); #else - DEBUG_JIT("BL r7\n"); + DEBUG_JIT("BLX r7\n"); #endif jsjcEmit16((uint16_t)(0b0100011110000000 | (7<<3))); // BL reg 7 - BROKEN? } From abee6df8cc13cb31edc7977c744bbb68b70d4e0a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 12 May 2022 13:20:46 +0100 Subject: [PATCH 0070/1183] i++ / i-- work --- src/jsjit.c | 62 ++++++++++++++++++++++++++++----------------------- src/jsjitc.c | 6 ++--- src/jsparse.c | 1 + 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/jsjit.c b/src/jsjit.c index be1979e582..99d5878652 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -213,28 +213,41 @@ void jsjFactorFunctionCall() { void __jsjPostfixExpression() { while (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { - int op = lex->tk; + int op = lex->tk; // POSFIX expression => i++, i-- JSP_ASSERT_MATCH(op); - - /*JsVar *one = jsvNewFromInteger(1); - JsVar *oldValue = jsvAsNumberAndUnLock(jsvSkipName(a)); // keep the old value (but convert to number) - JsVar *res = jsvMathsOpSkipNames(oldValue, one, op==LEX_PLUSPLUS ? '+' : '-'); - jsvUnLock(one); - - // in-place add/subtract - jsvReplaceWith(a, res); - jsvUnLock(res); - // but then use the old value - jsvUnLock(a); - a = oldValue;*/ + // Get the old value + jsjPopAsVar(0); // value -> r0 + jsjcMov(4, 0); // r0 -> r4 (save for later) + jsjcCall(jsvSkipName); + jsjcCall(jsvAsNumberAndUnLock); // convert old value to number + jsjcPush(0, JSJVT_JSVAR); // push result (value BEFORE we inc/dec) + // Create number 1 + jsjcLiteral32(0, (uint32_t)1); + jsjcCall(jsvNewFromInteger); + jsjcMov(5, 0); // r0(one) -> r5 ready for UnLock + jsjcMov(1, 0); // r0(one) -> r1 ready for MathsOp + jsjcMov(0, 4); // r4(value) -> r0 ready for MathsOp + jsjcLiteral32(2, op==LEX_PLUSPLUS ? '+' : '-'); + jsjcCall(jsvMathsOpSkipNames); + // r0 = result + jsjcMov(1, 0); // 2nd arg = result + jsjcMov(6, 0); // r6 = result - for unlock later + jsjcMov(0, 4); // 1st arg = value + jsjcCall(jsvReplaceWith); + // now unlock + jsjcMov(0, 6); // result + jsjcMov(1, 5); // one + jsjcMov(2, 4); // value + jsjcCall(jsvUnLock3); } } void jsjPostfixExpression() { if (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { + /*// PREFIX expression => ++i, --i int op = lex->tk; JSP_ASSERT_MATCH(op); - /* + a = jsjPostfixExpression(); if (JSP_SHOULD_EXECUTE) { JsVar *one = jsvNewFromInteger(1); @@ -270,9 +283,9 @@ void jsjPostfixExpression() { void jsjUnaryExpression() { if (lex->tk=='!' || lex->tk=='~' || lex->tk=='-' || lex->tk=='+') { - short tk = lex->tk; +/* short tk = lex->tk; JSP_ASSERT_MATCH(tk); -/* if (tk=='!') { // logical not + if (tk=='!') { // logical not return jsvNewFromBool(!jsvGetBoolAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); } else if (tk=='~') { // bitwise not return jsvNewFromInteger(~jsvGetIntegerAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); @@ -405,7 +418,7 @@ void jsjBinaryExpression() { __jsjBinaryExpression(0); } -JsVar *jsjConditionalExpression() { +void jsjConditionalExpression() { // FIXME return __jsjConditionalExpression(jsjBinaryExpression()); jsjBinaryExpression(); } @@ -419,21 +432,20 @@ NO_INLINE void jsjAssignmentExpression() { lex->tk==LEX_ANDEQUAL || lex->tk==LEX_OREQUAL || lex->tk==LEX_XOREQUAL || lex->tk==LEX_RSHIFTEQUAL || lex->tk==LEX_LSHIFTEQUAL || lex->tk==LEX_RSHIFTUNSIGNEDEQUAL*/) { - JsVar *rhs; int op = lex->tk; JSP_ASSERT_MATCH(op); jsjAssignmentExpression(); jsjPopNoName(1); // ensure we get rid of any references on the RHS - jsjcMov(4, 1); // save RHS in r4 so we can unlock it jsjcPop(0); // pop LHS jsjcPush(0, JSJVT_JSVAR); // push LHS back on as this is our result value + //jsjcPush(1, JSJVT_JSVAR); // push RHS back on, so we can pop it off and unlock after jsvReplaceWithOrAddToRoot if (op=='=') { jsjcCall(jsvReplaceWithOrAddToRoot); - jsjcMov(0, 4); // unlock RHS - jsjcCall(jsvUnLock); + // FIXME - the unlock causes a crash, but it looks like we are leaking locks... Maybe AssignmentExpression doesn't always lock? + //jsjPopAndUnLock(); // Unlock RHS, that we pushed earlier } else { #if 0 if (op==LEX_PLUSEQUAL) op='+'; @@ -496,8 +508,6 @@ void jsjBlock() { } void jsjStatementIf() { - bool cond; - JsVar *var, *result = 0; JSP_ASSERT_MATCH(LEX_R_IF); DEBUG_JIT("; IF condition\n"); JSP_MATCH('('); @@ -538,10 +548,6 @@ void jsjStatementIf() { void jsjStatementFor() { JSP_ASSERT_MATCH(LEX_R_FOR); JSP_MATCH('('); - bool wasInLoop = (execInfo.execute&EXEC_IN_LOOP)!=0; - execInfo.execute |= EXEC_FOR_INIT; - // initialisation - JsVar *forStatement = 0; // we could have 'for (;;)' - so don't munch up our semicolon if that's all we have // Parse initialiser - we always run this so march right in and create code DEBUG_JIT("; FOR initialiser\n"); @@ -580,7 +586,7 @@ void jsjStatementFor() { jsvUnLock(iteratorBlock); // after the iterator, jump back to condition DEBUG_JIT("; FOR jump back to condition\n"); - jsjcBranchRelative(codePosCondition - (jsjcGetByteCount()+2)); + jsjcBranchRelative(codePosCondition - jsjcGetByteCount()); DEBUG_JIT("; FOR end\n"); } diff --git a/src/jsjitc.c b/src/jsjitc.c index 437f658bef..b720639865 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -87,7 +87,7 @@ JsVar *jsjcStopBlock(JsVar *oldBlock) { } void jsjcEmit16(uint16_t v) { - DEBUG_JIT("> %04x\n", v); + //DEBUG_JIT("> %04x\n", v); #ifdef JIT_OUTPUT_FILE if (!blockCount) { fputc(v&255, f); @@ -188,8 +188,8 @@ void jsjcCompareImm(int reg, int literal) { } void jsjcBranchRelative(int bytes) { - bytes -= 2; // because PC is ahead by 2 DEBUG_JIT("B %s%d (addr 0x%04x)\n", (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); + bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-4096 && bytes<4096); // only multiples of 2 bytes int imm11 = ((unsigned int)(bytes)>>1) & 2047; @@ -198,8 +198,8 @@ void jsjcBranchRelative(int bytes) { // Jump a number of bytes forward or back, based on condition flags void jsjcBranchConditionalRelative(JsjAsmCondition cond, int bytes) { - bytes -= 2; // because PC is ahead by 2 DEBUG_JIT("B[%d] %s%d (addr 0x%04x)\n", cond, (bytes>0)?"+":"", (uint32_t)(bytes), jsjcGetByteCount()+bytes); + bytes -= 2; // because PC is ahead by 2 assert(!(bytes&1)); // only multiples of 2 bytes assert(bytes>=-512 && bytes<512); // only multiples of 2 bytes int imm8 = (bytes>>1) & 255; diff --git a/src/jsparse.c b/src/jsparse.c index 0d425c93d4..7c9198ddeb 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1831,6 +1831,7 @@ NO_INLINE JsVar *jspePostfixExpression() { JsVar *a; // TODO: should be in jspeUnaryExpression if (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { + // PREFIX expression int op = lex->tk; JSP_ASSERT_MATCH(op); a = jspePostfixExpression(); From 2914db84f0bb783b4b2a36dde0b8fdca637b0c5c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 12 May 2022 13:49:01 +0100 Subject: [PATCH 0071/1183] doc tweaks - ready for merge --- README_JIT.md | 148 ++++++++++++++++++++++++++++-------------- boards/RASPBERRYPI.py | 18 ++--- src/jswrap_espruino.c | 20 ------ src/jswrap_espruino.h | 2 - 4 files changed, 110 insertions(+), 78 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 806b94a37f..9e41c017f9 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -1,102 +1,156 @@ -JIT compiler testing -==================== +Espruino JIT compiler +====================== + +This compiler allows Espruino to compile JS code into ARM Thumb code. + +Right now this roughly doubles execution speed. + +Works: + +* Assignments +* Maths operators, postfix operators +* Function calls +* `for (;;)` loops +* `if ()` +* On the whole functions that can't be JITed will produce a message on the console and will be treated as normal functions. + +Doesn't work: + +* Everything else +* Function arguments +* `var/const/let` +* Member access (with `.` or `[]`) + +Performance: + +* Right now, variable accesses search for the variable each time - so this is pretty slow. Maybe they could all be referenced at the start just once? +* Built-in functions could be called directly, which would be a TON faster +* Peephole optimisation could still be added (eg. removing `push r0, pop r0`) but this is the least of our worries +* Stuff is in place to allow ints to be stored on the stack and converted when needed. This could maybe allow us to keep some vars as ints. + +Big stuff to do: + +* There seems to be a 'lock leak' - maybe on assignments +* When calling a JIT function, using existing FunctionCall code to set up args and an execution scope (so args can be passed in) + + +## Testing + +### Linux * Build for Linux `USE_JIT=1 DEBUG=1 make` -* Test with `./espruino --test-jit` -* CLI test `./espruino -e "E.JIT('\'Hello\'')"` -* Dump binary with `arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin` +* Test with `./espruino --test-jit` - doesn't do much useful right now +* CLI test `./espruino -e 'function jit() {"jit";return 123;}'` +* On Linux builds, a file `jit.bin` is created each time JIT runs. It contains the raw Thumb code. +* Disassemble binary with `arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin` + +You can see what code is created with stuff like: + +``` +./espruino -e "E.setFlags({jitDebug:1});trace(function jit() {'jit';return 1+2;})" + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";return "Hello"}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";print(42)}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";i=5}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";if (i<3) print("T"); else print("X");}}' + +./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";for (i=0;i<5;i=i+1) print(i);}' +``` + + +### Raspberry Pi + +The Pi can execute Thumb-2 code (Pi 3 and on only) + +* Just build a normal Pi Binary on the Pi: `USE_JIT=1 DEBUG=1 make` +* CLI test `./espruino -e 'function jit() {"jit";print("Hello World");};jit()'` +* This may or may not work - sometimes it does (especially when launched from GDB) but I'm unsure why it's flakey! * Dump binary on pi with `objdump -D -Mforce-thumb -b binary -m arm jit.bin` -* Build for ARM: `USE_JIT=1 BOARD=NRF52832DK_MIN RELEASE=1 make flash` +### Build for an actual device + +* Build for ARM: `USE_JIT=1 BOARD=BOARD_NAME RELEASE=1 make flash` ``` // Enable debug output E.setFlags({jitDebug:1}); -var jit = E.nativeCall(1, "JsVar()", E.JIT("1")) + +function jit() {'jit';return 1;} jit()==1 -var jit = E.nativeCall(1, "JsVar()", E.JIT("1+2+3+4-5")) -jit()==5 +function jit() {'jit';return 1+2+3+4+5;} +jit()==15 -var jit = E.nativeCall(1, "JsVar()", E.JIT("'Hello'")) +function jit() {'jit';return 'Hello';} jit()=="Hello" -var jit = E.nativeCall(1, "JsVar()", E.JIT("true")) +function jit() {'jit';return true;} jit()==true var test = "Hello world"; -var jit = E.nativeCall(1, "JsVar()", E.JIT("test")) - +function jit() {'jit';return test;} +jit()=="Hello world"; var test = "Hello "; var jit = E.nativeCall(1, "JsVar()", E.JIT("test+'World!'")) jit()=="Hello World!" -function jit() {'jit';return 1+2;} -jit()==3 - function t() { print("Hello"); } function jit() {'jit';t();} +jit(); // prints 'hello' function jit() {'jit';print(42);} function jit() {'jit';print(42);return 123;} +jit()==123 function t() { return "Hello"; } function jit() {'jit'; return t()+" world";} jit()=="Hello world" function jit() {'jit';digitalWrite(LED1,1);} +jit(); // LED on + function jit() {'jit';i=42;} -jit();print(i); +jit();i==42 function jit() {'jit';return 1<2;} -jit();print(i); +jit();i==true -E.setFlags({jitDebug:1}) -function jit() {"jit";if (i<3) print("T"); else print("X");} -i=2;jit() +function jit() {"jit";if (i<3) print("T"); else print("X");print("--")} +i=2;jit(); // prints T,-- +i=5;jit(); // prints X,-- -E.setFlags({jitDebug:1}) -function jit() {"jit";for (i=0;i<5;i=i+1) print(i);} - - -``` - - -``` -./espruino -e "trace(function jit() {'jit';return 1+2;})" -./espruino -e "E.JIT('\'Hello\'')" - -./espruino -e "E.JIT('print(42)')" - -./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";i=5}' - -./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";if (i<3) print("T"); else print("X");}}' +function jit() {"jit";for (i=0;i<5;i=i+1) print(i);} +jit(); // prints 0,1,2,3,4 -./espruino -e 'E.setFlags({jitDebug:1});function jit() {"jit";for (i=0;i<5;i=i+1) print(i);}' +function nojit() {for (i=0;i<1000;i=i+1);} +function jit() {"jit";for (i=0;i<1000;i=i+1);} +t=getTime();jit();getTime()-t // 0.14 sec +t=getTime();nojit();getTime()-t // 0.28 sec ``` -When running on Linux, `function jit() {'jit';print(42);}` seems to actually call the function ok, and prints 42. Stack is trashed after (and possibly even before!). -Tests seem to show it's caller's job to clear the stack (expected really - could be the issue!) - - -Run JIT on ARM and disassemble: +Run JIT on ARM and then disassemble: ``` -btoa(E.JIT("1")) +// on ARM +function jit() {"jit";return 1;} print(btoa(jit["\xffcod"])) + +// On Linux echo ASBL8Kz7AbQBvHBH | base64 -d > jit.bin arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin ``` -``` -arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 a.out -``` +## Useful links + http://www.cs.cornell.edu/courses/cs414/2001FA/armcallconvention.pdf https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/B diff --git a/boards/RASPBERRYPI.py b/boards/RASPBERRYPI.py index 655414aad8..c9502d24df 100644 --- a/boards/RASPBERRYPI.py +++ b/boards/RASPBERRYPI.py @@ -22,18 +22,18 @@ 'build' : { 'optimizeflags' : '-O3', 'libraries' : [ -# 'NET', -# 'GRAPHICS', -# 'FILESYSTEM', -# 'CRYPTO','SHA256','SHA512', -# 'TLS', -# 'TELNET', -# 'TENSORFLOW', - 'JIT' + 'NET', + 'GRAPHICS', + 'FILESYSTEM', + 'CRYPTO','SHA256','SHA512', + 'TLS', + 'TELNET', + 'TENSORFLOW', ], 'makefile' : [ 'LINUX=1', - 'DEFINES += -DRASPBERRYPI -DJSVAR_MALLOC=1', + 'DEFINES += -DRASPBERRYPI', + 'DEFINES += -DJSVAR_MALLOC=1', # This is needed for JIT testing because otherwise we can't exec from the heap ] } }; diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 304b2d9d46..97cbb68feb 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -24,9 +24,6 @@ #ifdef PUCKJS #include "jswrap_puck.h" // jswrap_puck_getTemperature #endif -#ifdef ESPR_JIT -#include "jsjit.h" -#endif /*JSON{ "type" : "class", @@ -2067,20 +2064,3 @@ JsVar *jswrap_espruino_decodeUTF8(JsVar *str, JsVar *lookup, JsVar *replaceFn) { return dst; } - -/*JSON{ - "type" : "staticmethod", - "ifndef" : "SAVE_ON_FLASH", - "class" : "E", - "name" : "JIT", - "generate" : "jswrap_espruino_JIT", - "params" : [ - ["str","JsVar","A string of JS to JIT compile"] - ], - "return" : ["JsVar","A flat string of binary ARM Thumb 2 code"] -} -TEMPORARY function for testing only - */ -JsVar *jswrap_espruino_JIT(JsVar *js) { - return jsjEvaluateVar(js); -} diff --git a/src/jswrap_espruino.h b/src/jswrap_espruino.h index 521548febc..0ec5800569 100644 --- a/src/jswrap_espruino.h +++ b/src/jswrap_espruino.h @@ -67,5 +67,3 @@ JsVarInt jswrap_espruino_getBattery(); void jswrap_espruino_setRTCPrescaler(int prescale); int jswrap_espruino_getRTCPrescaler(bool calibrate); JsVar *jswrap_espruino_decodeUTF8(JsVar *str, JsVar *lookup, JsVar *replaceFn); - -JsVar *jswrap_espruino_JIT(JsVar *js); From d9f23f46b3bd5fc02379e581c5b48e0d85c49a96 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 16 May 2022 15:03:52 +0100 Subject: [PATCH 0072/1183] Really fix recent regression with submenus - fix #2192 --- libs/js/banglejs/E_showMenu_Q3.js | 6 +++--- libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index 3ba29e87d6..c93a20a26d 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -42,7 +42,7 @@ Bangle.buzz(20); item.value = item.min + idx*step; if (item.onchange) item.onchange(item.value); - scr.scroll = s.scroll; // set scroll to prev position + scr.scroll = l.scroller.scroll; // set scroll to prev position show(); // redraw original menu } }); @@ -73,7 +73,7 @@ } else { // actually selected item.value = v; if (item.onchange) item.onchange(item.value); - scr.scroll = s.scroll; // set scroll to prev position + scr.scroll = l.scroller.scroll; // set scroll to prev position show(); // redraw original menu } }); @@ -136,4 +136,4 @@ } show(); return l; -}) \ No newline at end of file +}) diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index f180790cb7..8fde331f27 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:p,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; -g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f,1):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=s.scroll;p()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); -g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,l=12+d.y+d.h/2,u=a.format?a.format(e,2):e;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(d.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,l);g.fillPoly([c,l-45,c+15,l-30, -c-15,l-30]).fillPoly([c,l+45,c+15,l+30,c-15,l+30])}f();Bangle.setUI({mode:"updown",back:p},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=s.scroll;p()}})}}function p(){q.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var n=k[""]||{};n.title||(n.title="Menu");var t=n.back||k["< Back"],m=Object.keys(k).filter(a=>""!= -a&&"< Back"!=a);m.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var q={draw:()=>q.scroller.draw(),scroller:void 0},r={h:40,c:m.length,scrollMin:-24,scroll:void 0===n.scroll?-24:n.scroll,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ -n.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[m[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(m[a],b.w-h);1< -d.length&&(g.setFont("6x15"),d=g.wrapString(m[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[m[a]];Bangle.buzz(20);if("function"==typeof b)b(q);else if("object"==typeof b)if("number"==typeof b.value)v(b,m[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);q.scroller.drawItem(a)}}};p();return q}) \ No newline at end of file +(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:q,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; +g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f,1):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;q()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); +g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,m=12+d.y+d.h/2,u=a.format?a.format(e,2):e;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(d.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,m);g.fillPoly([c,m-45,c+15,m-30, +c-15,m-30]).fillPoly([c,m+45,c+15,m+30,c-15,m+30])}f();Bangle.setUI({mode:"updown",back:q},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;q()}})}}function q(){l.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var t=p.back||k["< Back"],n=Object.keys(k).filter(a=> +""!=a&&"< Back"!=a);n.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var l={draw:()=>l.scroller.draw(),scroller:void 0},r={h:40,c:n.length,scrollMin:-24,scroll:void 0===p.scroll?-24:p.scroll,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ +p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[n[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(n[a],b.w-h);1< +d.length&&(g.setFont("6x15"),d=g.wrapString(n[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[n[a]];Bangle.buzz(20);if("function"==typeof b)b(l);else if("object"==typeof b)if("number"==typeof b.value)v(b,n[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);l.scroller.drawItem(a)}}};q();return l}) \ No newline at end of file From 486c6cd0c513319d9815be3d5f8394a64156a90c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 16 May 2022 15:04:13 +0100 Subject: [PATCH 0073/1183] fix linux build with fixed size vars --- scripts/build_platform_config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/build_platform_config.py b/scripts/build_platform_config.py index 2b49e21626..1956a7118c 100755 --- a/scripts/build_platform_config.py +++ b/scripts/build_platform_config.py @@ -279,6 +279,8 @@ def codeOutDevicePins(device, definition_name): codeOut('#define RESIZABLE_JSVARS // Allocate variables in blocks using malloc - slow, and linux-only') else: codeOut("#define JSVAR_CACHE_SIZE "+str(variables)+" // Number of JavaScript variables in RAM") + if LINUX: + codeOut("#define JSVAR_MALLOC 1") if LINUX: codeOut("#define FLASH_START "+hex(0x10000000)) From 2d9b62458ffb179f27f4ba1ea46f9b1a5af98fce Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 17 May 2022 14:01:51 +0100 Subject: [PATCH 0074/1183] Fix recent class method regression (24247e4ec9) (fix #2197) --- ChangeLog | 1 + src/jswrap_object.c | 11 +++++++++-- tests/test_class_method.js | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tests/test_class_method.js diff --git a/ChangeLog b/ChangeLog index 528925fdac..8671b50416 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,7 @@ Graphics: Fix drawString with combination of g.setClipRect and g.setRotation nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. Bangle.js2: E.showMenu now returns 'scroller', `format` is called with a second argument, font in popup is scaled to fit (fix #2190) + Fix recent class method regression (24247e4ec9) (fix #2197) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jswrap_object.c b/src/jswrap_object.c index 8e04d326b3..8137a4716d 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -950,8 +950,15 @@ void jswrap_function_replaceWith(JsVar *oldFunc, JsVar *newFunc) { jsvObjectIteratorNext(&it); if (!jsvIsStringEqual(el, JSPARSE_FUNCTION_SCOPE_NAME) && !jsvIsStringEqual(el, JSPARSE_PROTOTYPE_VAR)) { - // don't copy function code - just use it as-is - JsVar *copy = jsvIsStringEqual(el, JSPARSE_FUNCTION_CODE_NAME) ? jsvLockAgain(el) : jsvCopy(el, true); + JsVar *copy; + if (jsvIsStringEqual(el, JSPARSE_FUNCTION_CODE_NAME)) { + // don't copy function code - just use it as-is. But we do have to + // make a new NAME for it! + JsVar *fnCode = jsvSkipName(el); + copy = jsvMakeIntoVariableName(jsvNewFromString(JSPARSE_FUNCTION_CODE_NAME), fnCode); + jsvUnLock(fnCode); + } else + copy = jsvCopy(el, true); if (copy) { jsvAddName(oldFunc, copy); jsvUnLock(copy); diff --git a/tests/test_class_method.js b/tests/test_class_method.js new file mode 100644 index 0000000000..3079a797f3 --- /dev/null +++ b/tests/test_class_method.js @@ -0,0 +1,9 @@ +//https://github.com/espruino/Espruino/issues/2197 + +class Thing { constructor() { this.prop1 = 10; } method1() { console.log("here!"); result = 1;} } +//trace(); +var foo = new Thing(); +//trace(); +console.log(foo.prop1); +foo.method1(); + From b5c79079f033e4013946364b913875418374d7f7 Mon Sep 17 00:00:00 2001 From: storm64 Date: Sat, 21 May 2022 12:44:38 +0200 Subject: [PATCH 0075/1183] [Bangle.setUI] Add "clockcustom" mode Think this might be useful for more complex clocks. For now it would be necessary to set `Bangle.CLOCK = 1` manually after a custom setUI to show other apps that a clock is used. --- ChangeLog | 1 + libs/js/banglejs/Bangle_setUI_F18.js | 3 ++- libs/js/banglejs/Bangle_setUI_F18.min.js | 4 ++-- libs/js/banglejs/Bangle_setUI_Q3.js | 5 +++-- libs/js/banglejs/Bangle_setUI_Q3.min.js | 4 ++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8671b50416..e5caf9e589 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. Bangle.js2: E.showMenu now returns 'scroller', `format` is called with a second argument, font in popup is scaled to fit (fix #2190) Fix recent class method regression (24247e4ec9) (fix #2197) + Bangle.js: Add "clockcustom" mode to setUI 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/Bangle_setUI_F18.js b/libs/js/banglejs/Bangle_setUI_F18.js index c7d6964bd1..a4d1e3bd36 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.js +++ b/libs/js/banglejs/Bangle_setUI_F18.js @@ -54,7 +54,8 @@ setWatch(function() { cb(1); }, BTN3, {repeat:1,edge:"falling"}), setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) ]; - } else if (mode=="custom") { + } else if (mode=="custom" || mode=="clockcustom") { + if (mode=="clockcustom") Bangle.CLOCK=1; if (options.touch) { Bangle.touchHandler = options.touch; Bangle.on("touch", Bangle.touchHandler); diff --git a/libs/js/banglejs/Bangle_setUI_F18.min.js b/libs/js/banglejs/Bangle_setUI_F18.min.js index 147c62d324..f4ed18e0ad 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.min.js +++ b/libs/js/banglejs/Bangle_setUI_F18.min.js @@ -1,5 +1,5 @@ (function(b,c){var a={};"object"==typeof b&&(a=b,b=a.mode);var e=!0;global.WIDGETS&&WIDGETS.back&&(e=!1,WIDGETS.back.remove(b&&a.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.touchHandler&&(Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove); if(b){if("updown"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})];else if("leftright"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})],Bangle.swipeHandler=d=>{c(d)},Bangle.on("swipe",Bangle.swipeHandler), -Bangle.touchHandler=d=>{c()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==b)a.touch&&(Bangle.touchHandler=a.touch,Bangle.on("touch",Bangle.touchHandler)), +Bangle.touchHandler=d=>{c()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==b||"clockcustom"==b)"clockcustom"==b&&Bangle.CLOCK=1,a.touch&&(Bangle.touchHandler=a.touch,Bangle.on("touch",Bangle.touchHandler)), a.swipe&&(Bangle.swipeHandler=a.swipe,Bangle.on("swipe",Bangle.swipeHandler)),a.btn&&(Bangle.btnWatches=[setWatch(function(){a.btn(1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(2)},BTN2,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(3)},BTN3,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(a.back){var f=d=>{1==d&&a.back()};Bangle.on("touch",f);WIDGETS=Object.assign({back:{area:"tl",width:24,draw:d=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="), -d.x,d.y),remove:d=>{Bangle.removeListener("touch",f);d||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;d||Bangle.drawWidgets()}}},global.WIDGETS);e&&Bangle.drawWidgets()}}}) \ No newline at end of file +d.x,d.y),remove:d=>{Bangle.removeListener("touch",f);d||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;d||Bangle.drawWidgets()}}},global.WIDGETS);e&&Bangle.drawWidgets()}}}) diff --git a/libs/js/banglejs/Bangle_setUI_Q3.js b/libs/js/banglejs/Bangle_setUI_Q3.js index 8451c976b4..52cf2a2cf7 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.js @@ -81,7 +81,8 @@ ]; } else if (mode=="touch") { Bangle.touchHandler = (_,e) => {b();cb(e);}; - } else if (mode=="custom") { + } else if (mode=="custom" || mode=="clockcustom") { + if (mode=="clockcustom") Bangle.CLOCK=1; if (options.touch) Bangle.touchHandler = options.touch; if (options.drag) { @@ -134,4 +135,4 @@ if (Bangle.touchHandler) Bangle.on("touch", Bangle.touchHandler); } -}) \ No newline at end of file +}) diff --git a/libs/js/banglejs/Bangle_setUI_Q3.min.js b/libs/js/banglejs/Bangle_setUI_Q3.min.js index 9685b4b3ad..1aa5633f21 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.min.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.min.js @@ -1,6 +1,6 @@ (function(c,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof c&&(b=c,c=b.mode);var l=!0;global.WIDGETS&&WIDGETS.back&&(l=!1,WIDGETS.back.remove(c&&b.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&& (Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(c){if("updown"==c){var h=0;Bangle.dragHandler=a=>{h+=a.dy;for(a.b||(h=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("leftright"==c){var k=0;Bangle.dragHandler=a=>{k+=a.dx;for(a.b||(k=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("clock"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})];else if("clockupdown"==c)Bangle.CLOCK=1,Bangle.touchHandler=(a,d)=>{120>d.x||(f(),e(88{f();e(d)};else if("custom"==c)b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn&&(Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&&48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler= +(a,d)=>{f();e(d)};else if("custom"==c||"clockcustom"==c)"clockcustom"==c&&Bangle.CLOCK=1,b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn&&(Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&&48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler= (a,d)=>{d.handled||n(a,d)};Bangle.on("touch",Bangle.touchHandler)}var p=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{clearWatch(p);Bangle.removeListener("touch",m);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}}, -global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file +global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) From 531c08e64c3909a508c22b93f3ebb5f68906426f Mon Sep 17 00:00:00 2001 From: storm64 Date: Sat, 21 May 2022 12:59:31 +0200 Subject: [PATCH 0076/1183] [Bangle.setUI] Default btnWatches on clockcustom While thinking about this new mode, I would suggest the default btn behavior should represent the "clock" mode. The .min.js need to be regenerated... --- libs/js/banglejs/Bangle_setUI_F18.js | 8 ++++++-- libs/js/banglejs/Bangle_setUI_Q3.js | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libs/js/banglejs/Bangle_setUI_F18.js b/libs/js/banglejs/Bangle_setUI_F18.js index a4d1e3bd36..36e3968c33 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.js +++ b/libs/js/banglejs/Bangle_setUI_F18.js @@ -53,7 +53,7 @@ setWatch(function() { cb(-1); }, BTN1, {repeat:1,edge:"falling"}), setWatch(function() { cb(1); }, BTN3, {repeat:1,edge:"falling"}), setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) - ]; + ]; } else if (mode=="custom" || mode=="clockcustom") { if (mode=="clockcustom") Bangle.CLOCK=1; if (options.touch) { @@ -63,13 +63,17 @@ if (options.swipe) { Bangle.swipeHandler = options.swipe; Bangle.on("swipe", Bangle.swipeHandler); - } + } if (options.btn) { Bangle.btnWatches = [ setWatch(function() { options.btn(1); }, BTN1, {repeat:1,edge:"falling"}), setWatch(function() { options.btn(2); }, BTN2, {repeat:1,edge:"falling"}), setWatch(function() { options.btn(3); }, BTN3, {repeat:1,edge:"falling"}) ]; + } else if (mode=="clockcustom") { + Bangle.btnWatches = [ + setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) + ]; } } else throw new Error("Unknown UI mode"); diff --git a/libs/js/banglejs/Bangle_setUI_Q3.js b/libs/js/banglejs/Bangle_setUI_Q3.js index 52cf2a2cf7..12af3c6c77 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.js @@ -97,6 +97,10 @@ Bangle.btnWatches = [ setWatch(function() { options.btn(1); }, BTN1, {repeat:1,edge:"falling"}) ]; + } else if (mode=="clockcustom") { + Bangle.btnWatches = [ + setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"falling"}) + ]; } } else throw new Error("Unknown UI mode"); From e0187f16ce6ab135518160c123c8930cfaf29354 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 23 May 2022 14:05:19 +0100 Subject: [PATCH 0077/1183] Bangle.js2: 6x15 font tweaks for better ISO8859-1 support --- ChangeLog | 1 + libs/graphics/jswrap_font_6x15.c | 271 +++++++++++++++---------------- 2 files changed, 129 insertions(+), 143 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8671b50416..d995deb201 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ nRF5x: Allow 'high speed' watches via 'hispeed' argument to setWatch. Higher power consumption but detects fast (<25us) pulses. Bangle.js2: E.showMenu now returns 'scroller', `format` is called with a second argument, font in popup is scaled to fit (fix #2190) Fix recent class method regression (24247e4ec9) (fix #2197) + Bangle.js2: 6x15 font tweaks for better ISO8859-1 support 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/graphics/jswrap_font_6x15.c b/libs/graphics/jswrap_font_6x15.c index 9c540d56cd..b89d544f04 100644 --- a/libs/graphics/jswrap_font_6x15.c +++ b/libs/graphics/jswrap_font_6x15.c @@ -17,155 +17,140 @@ #include "jswrap_font_6x15.h" #include "jswrap_graphics.h" -// Generated from "+FONTFILE+" at https://github.com/Tecate/bitmap-fonts +// Generated from HaxorNarrow-15.bdf at https://github.com/Tecate/bitmap-fonts with tweaks by Gordon Williams for ISO8859-1 support // -ucw.cz-Haxor-Narrow-R-Normal--15-120-72-72-M-72-iso8859-2// BOUNDINGBOX 8 17 0 -3// _ASCENT 13// _DESCENT 3 // Charset iso8859 -static const unsigned char fontBitmap[] = { -0, 0, 0, 0, 0, 0, 0, 15, 230, 0, 0, 36, 0, 112, 0, 0, -1, 32, 3, 128, 0, 0, 0, 16, 1, 60, 3, 192, 60, 240, 15, 0, -242, 0, 32, 0, 0, 3, 136, 8, 136, 17, 16, 127, 240, 68, 64, 136, -128, 142, 0, 0, 6, 6, 18, 16, 36, 192, 50, 96, 25, 32, 66, 67, -3, 0, 0, 0, 60, 14, 132, 34, 8, 70, 16, 115, 32, 1, 128, 30, -128, 0, 9, 0, 28, 0, 0, 0, 7, 192, 48, 96, 128, 34, 0, 32, -0, 8, 0, 136, 2, 12, 24, 7, 192, 0, 0, 36, 0, 48, 1, 248, -0, 192, 2, 64, 0, 0, 2, 0, 4, 0, 8, 0, 254, 0, 32, 0, -64, 0, 128, 0, 0, 0, 72, 0, 224, 0, 0, 16, 0, 32, 0, 64, -0, 128, 1, 0, 0, 0, 0, 96, 0, 192, 0, 0, 1, 0, 12, 0, -96, 3, 0, 24, 0, 192, 0, 0, 0, 254, 2, 2, 8, 98, 17, 132, -16, 16, 31, 192, 0, 0, 64, 1, 0, 4, 0, 15, 254, 0, 0, 16, -56, 65, 144, 132, 33, 16, 65, 192, 128, 0, 4, 4, 16, 4, 33, 8, -66, 16, 123, 192, 0, 0, 12, 0, 104, 1, 16, 12, 32, 63, 248, 0, -128, 0, 1, 240, 130, 32, 132, 65, 8, 130, 16, 248, 0, 0, 63, 224, -136, 33, 16, 66, 32, 130, 62, 0, 0, 16, 0, 32, 120, 67, 0, 152, -1, 192, 0, 0, 3, 222, 8, 66, 16, 132, 33, 8, 61, 224, 0, 0, -240, 130, 16, 132, 33, 8, 66, 15, 248, 0, 0, 24, 96, 48, 192, 0, -0, 194, 129, 134, 0, 0, 0, 128, 2, 128, 8, 128, 32, 128, 128, 128, -0, 0, 136, 1, 16, 2, 32, 4, 64, 8, 128, 17, 0, 0, 1, 1, -1, 4, 1, 16, 1, 64, 1, 0, 0, 0, 64, 1, 0, 2, 9, 132, -32, 8, 128, 14, 0, 0, 0, 63, 224, 128, 33, 28, 66, 68, 132, 137, -7, 240, 0, 0, 7, 248, 49, 0, 130, 0, 196, 0, 127, 128, 0, 15, -254, 16, 132, 33, 8, 66, 16, 123, 192, 0, 1, 255, 4, 1, 8, 2, -16, 4, 16, 16, 0, 0, 255, 225, 0, 66, 0, 130, 2, 3, 248, 0, -0, 63, 248, 66, 16, 132, 33, 8, 66, 0, 128, 0, 15, 254, 17, 0, -34, 0, 68, 0, 128, 0, 0, 1, 255, 4, 1, 8, 2, 16, 132, 17, -240, 0, 0, 255, 224, 8, 0, 16, 0, 32, 15, 254, 0, 0, 32, 8, -127, 240, 128, 32, 0, 2, 3, 4, 1, 8, 2, 16, 4, 63, 240, 0, -0, 255, 224, 8, 0, 40, 1, 140, 12, 6, 0, 0, 63, 248, 0, 16, -0, 32, 0, 64, 0, 128, 0, 15, 254, 12, 0, 6, 0, 48, 0, 255, -224, 0, 3, 255, 131, 0, 1, 128, 0, 192, 63, 248, 0, 0, 127, 193, -0, 66, 0, 132, 1, 7, 252, 0, 0, 63, 248, 66, 0, 132, 1, 8, -1, 224, 0, 0, 7, 252, 16, 4, 32, 40, 64, 32, 127, 160, 0, 3, -255, 132, 32, 8, 64, 16, 224, 30, 56, 0, 0, 112, 65, 16, 66, 16, -132, 17, 4, 28, 0, 0, 32, 0, 64, 0, 255, 225, 0, 2, 0, 0, -0, 15, 252, 0, 4, 0, 8, 0, 16, 255, 192, 0, 3, 224, 0, 60, -0, 6, 0, 240, 62, 0, 0, 0, 255, 128, 0, 192, 6, 0, 48, 0, -24, 0, 12, 63, 224, 0, 0, 192, 224, 102, 0, 48, 1, 152, 12, 14, -0, 0, 56, 0, 12, 0, 7, 224, 48, 3, 128, 0, 0, 8, 6, 16, -52, 35, 136, 88, 16, 192, 32, 0, 3, 255, 196, 0, 136, 1, 0, 0, -48, 0, 24, 0, 12, 0, 6, 0, 3, 0, 1, 0, 0, 16, 2, 32, -4, 127, 248, 0, 0, 32, 1, 128, 4, 0, 6, 0, 2, 0, 0, 0, -0, 16, 0, 32, 0, 64, 0, 128, 1, 0, 2, 0, 0, 0, 0, 64, -0, 64, 0, 0, 0, 39, 0, 145, 1, 34, 2, 72, 3, 248, 0, 0, -255, 224, 16, 128, 64, 128, 129, 0, 252, 0, 0, 3, 240, 8, 16, 16, -32, 32, 64, 33, 0, 0, 0, 252, 2, 4, 4, 8, 4, 32, 255, 224, -0, 0, 63, 0, 145, 1, 34, 2, 68, 3, 144, 0, 0, 16, 0, 255, -194, 64, 4, 128, 9, 0, 0, 0, 3, 172, 8, 164, 17, 72, 34, 144, -121, 32, 129, 128, 0, 31, 252, 2, 0, 8, 0, 16, 0, 31, 192, 0, -0, 1, 1, 2, 19, 252, 0, 8, 0, 16, 0, 0, 0, 32, 0, 32, -0, 65, 0, 147, 254, 0, 0, 127, 240, 1, 0, 6, 0, 50, 0, 131, -0, 0, 0, 4, 32, 8, 127, 240, 0, 32, 0, 64, 0, 0, 255, 1, -0, 3, 252, 4, 0, 7, 240, 0, 0, 63, 192, 32, 0, 128, 1, 0, -1, 252, 0, 0, 7, 224, 16, 32, 32, 64, 64, 128, 126, 0, 0, 3, -255, 2, 16, 8, 16, 16, 32, 31, 128, 0, 0, 126, 1, 2, 2, 4, -2, 16, 15, 252, 0, 0, 63, 192, 32, 0, 128, 1, 0, 1, 0, 0, -0, 6, 32, 18, 32, 36, 64, 68, 128, 70, 0, 0, 2, 0, 63, 240, -8, 16, 16, 32, 32, 64, 0, 0, 254, 0, 2, 0, 4, 0, 16, 15, -240, 0, 0, 56, 0, 14, 0, 3, 0, 56, 3, 128, 0, 0, 15, 192, -0, 96, 7, 0, 1, 128, 252, 0, 0, 3, 12, 1, 32, 1, 128, 4, -128, 48, 192, 0, 0, 240, 96, 27, 0, 8, 0, 96, 15, 0, 0, 0, -32, 192, 66, 128, 153, 1, 66, 3, 4, 0, 0, 57, 56, 141, 137, 0, -16, 0, 7, 255, 0, 0, 16, 1, 35, 98, 57, 56, 0, 0, 8, 0, -32, 0, 64, 0, 64, 0, 64, 0, 128, 2, 0, 0, 0, 63, 193, 136, -4, 16, 6, 33, 131, 252, 128, 1, 0, 0, 1, 1, 255, 224, 16, 64, -64, 128, 1, 0, 2, 0, 0, 46, 128, 34, 0, 130, 1, 4, 2, 8, -2, 32, 11, 160, 0, 0, 127, 248, 0, 16, 128, 34, 0, 64, 0, 128, -0, 14, 8, 34, 8, 66, 16, 130, 32, 131, 128, 0, 3, 99, 9, 33, -17, 34, 33, 36, 49, 176, 0, 0, 224, 130, 32, 132, 33, 8, 34, 8, -56, 0, 0, 56, 32, 136, 37, 8, 106, 8, 162, 14, 0, 0, 16, 0, -32, 0, 127, 240, 128, 1, 0, 0, 0, 0, 131, 1, 10, 10, 100, 37, -8, 12, 16, 0, 0, 32, 194, 66, 130, 153, 9, 66, 3, 4, 0, 0, -8, 48, 16, 160, 166, 64, 80, 128, 193, 0, 0, 12, 0, 36, 0, 72, -0, 96, 0, 0, 0, 39, 0, 145, 65, 35, 66, 72, 131, 248, 0, 0, -2, 33, 8, 67, 255, 128, 129, 2, 2, 0, 0, 16, 0, 64, 0, 0, -0, 0, 33, 0, 67, 255, 132, 1, 16, 2, 0, 0, 6, 32, 82, 33, -36, 65, 68, 128, 70, 0, 0, 16, 0, 16, 0, 64, 0, 0, 0, 24, -130, 72, 130, 145, 9, 18, 1, 24, 0, 0, 6, 32, 18, 36, 36, 104, -68, 160, 70, 0, 0, 1, 0, 31, 248, 4, 8, 8, 17, 80, 35, 0, -0, 0, 1, 6, 2, 20, 20, 200, 74, 16, 24, 32, 0, 0, 65, 132, -133, 5, 50, 18, 132, 6, 8, 0, 0, 16, 96, 33, 65, 76, 128, 161, -1, 130, 0, 0, 63, 248, 66, 0, 132, 1, 14, 1, 227, 128, 0, 1, -254, 12, 64, 32, 128, 49, 0, 31, 224, 0, 0, 127, 131, 16, 8, 32, -12, 64, 7, 248, 0, 0, 31, 224, 196, 2, 8, 3, 16, 1, 254, 0, -0, 7, 248, 49, 0, 130, 0, 196, 0, 127, 128, 0, 15, 254, 0, 4, -0, 8, 0, 16, 0, 32, 0, 1, 255, 4, 1, 8, 2, 16, 4, 16, -16, 0, 0, 127, 193, 0, 74, 0, 212, 1, 68, 4, 0, 0, 31, 240, -64, 16, 128, 33, 0, 65, 1, 0, 0, 15, 254, 16, 132, 33, 8, 66, -16, 128, 32, 0, 3, 255, 132, 33, 72, 67, 80, 132, 160, 8, 0, 0, -255, 225, 8, 66, 16, 132, 33, 8, 2, 0, 0, 63, 248, 66, 16, 132, -33, 8, 66, 0, 128, 0, 8, 2, 31, 252, 32, 8, 0, 0, 128, 33, -255, 194, 0, 128, 0, 15, 254, 16, 4, 32, 8, 32, 32, 63, 128, 0, -3, 255, 132, 33, 8, 66, 8, 8, 15, 224, 0, 0, 255, 224, 192, 0, -96, 0, 48, 15, 254, 0, 0, 63, 248, 48, 0, 24, 0, 12, 3, 255, -128, 0, 7, 252, 16, 4, 32, 8, 64, 16, 127, 192, 0, 1, 255, 4, -1, 8, 2, 16, 4, 31, 240, 0, 0, 127, 193, 0, 66, 0, 132, 1, -7, 252, 0, 0, 31, 240, 64, 16, 128, 33, 0, 65, 255, 0, 0, 15, -254, 16, 128, 33, 0, 67, 128, 120, 224, 0, 1, 255, 128, 0, 136, 1, -0, 2, 31, 248, 0, 0, 255, 192, 0, 64, 0, 128, 1, 15, 252, 0, -0, 63, 240, 0, 16, 0, 32, 0, 67, 255, 0, 0, 15, 252, 0, 4, -0, 8, 0, 16, 255, 192, 0, 3, 128, 0, 192, 0, 126, 3, 0, 56, -0, 0, 0, 128, 1, 0, 11, 255, 228, 0, 8, 0, 0, 0, 31, 248, -64, 0, 136, 33, 16, 65, 208, 128, 30, 0, 0, 3, 252, 2, 0, 40, -0, 144, 0, 16, 0, 0, 0, 78, 1, 34, 10, 68, 36, 144, 7, 240, -0, 0, 19, 129, 72, 132, 145, 5, 36, 1, 252, 0, 0, 4, 224, 146, -32, 164, 66, 73, 0, 127, 0, 0, 1, 56, 20, 136, 9, 16, 82, 64, -31, 192, 0, 0, 1, 8, 2, 31, 252, 0, 8, 0, 16, 0, 0, 31, -128, 64, 130, 129, 9, 2, 1, 8, 0, 0, 7, 224, 16, 32, 32, 112, -64, 144, 66, 0, 0, 1, 248, 36, 8, 40, 16, 144, 32, 16, 128, 0, -0, 126, 1, 34, 10, 68, 36, 136, 7, 32, 0, 0, 31, 128, 72, 128, -145, 193, 34, 65, 200, 0, 0, 7, 224, 82, 32, 36, 65, 72, 128, 114, -0, 0, 1, 248, 36, 136, 41, 16, 146, 32, 28, 128, 0, 0, 1, 1, -2, 11, 252, 32, 8, 0, 16, 0, 0, 0, 65, 64, 132, 255, 4, 2, -0, 4, 0, 0, 7, 240, 16, 16, 32, 32, 32, 131, 255, 136, 0, 0, -0, 3, 240, 8, 16, 16, 32, 144, 131, 255, 130, 0, 0, 0, 3, 252, -2, 0, 40, 0, 144, 0, 31, 192, 0, 0, 255, 8, 128, 10, 0, 36, -0, 7, 240, 0, 0, 31, 128, 64, 130, 129, 9, 2, 1, 248, 0, 0, -7, 224, 80, 33, 32, 65, 64, 128, 126, 0, 0, 1, 248, 20, 8, 72, -16, 80, 33, 31, 128, 0, 0, 126, 5, 2, 2, 4, 20, 8, 7, 224, -0, 0, 63, 194, 32, 2, 128, 9, 0, 1, 0, 0, 0, 7, 240, 64, -17, 64, 33, 0, 128, 127, 128, 0, 3, 248, 0, 8, 32, 16, 128, 64, -63, 192, 0, 0, 254, 4, 2, 16, 4, 16, 16, 79, 240, 0, 0, 63, -129, 0, 128, 1, 4, 4, 3, 252, 0, 0, 15, 6, 1, 176, 128, 130, -6, 0, 240, 0, 0, 2, 0, 63, 240, 8, 18, 16, 56, 32, 64, 0, -0, +static const unsigned char fontBitmap[] = { +0, 0, 0, 0, 0, 0, 0, 15, 230, 0, 0, 36, 0, 112, 0, 0, +1, 32, 3, 128, 0, 0, 0, 16, 1, 60, 3, 192, 60, 240, 15, 0, +242, 0, 32, 0, 0, 3, 136, 8, 136, 17, 16, 127, 240, 68, 64, 136, +128, 142, 0, 0, 6, 6, 18, 16, 36, 192, 50, 96, 25, 32, 66, 67, +3, 0, 0, 0, 60, 14, 132, 34, 8, 70, 16, 115, 32, 1, 128, 30, +128, 0, 9, 0, 28, 0, 0, 0, 7, 192, 48, 96, 128, 34, 0, 32, +0, 8, 0, 136, 2, 12, 24, 7, 192, 0, 0, 36, 0, 48, 1, 248, +0, 192, 2, 64, 0, 0, 2, 0, 4, 0, 8, 0, 254, 0, 32, 0, +64, 0, 128, 0, 0, 0, 72, 0, 224, 0, 0, 16, 0, 32, 0, 64, +0, 128, 1, 0, 0, 0, 0, 96, 0, 192, 0, 0, 1, 0, 12, 0, +96, 3, 0, 24, 0, 192, 0, 0, 0, 254, 2, 2, 8, 98, 17, 132, +16, 16, 31, 192, 0, 0, 64, 1, 0, 4, 0, 15, 254, 0, 0, 16, +56, 65, 144, 132, 33, 16, 65, 192, 128, 0, 4, 4, 16, 4, 33, 8, +66, 16, 123, 192, 0, 0, 12, 0, 104, 1, 16, 12, 32, 63, 248, 0, +128, 0, 1, 240, 130, 32, 132, 65, 8, 130, 16, 248, 0, 0, 63, 224, +136, 33, 16, 66, 32, 130, 62, 0, 0, 16, 0, 32, 120, 67, 0, 152, +1, 192, 0, 0, 3, 222, 8, 66, 16, 132, 33, 8, 61, 224, 0, 0, +240, 130, 16, 132, 33, 8, 66, 15, 248, 0, 0, 24, 96, 48, 192, 0, +0, 194, 129, 134, 0, 0, 0, 128, 2, 128, 8, 128, 32, 128, 128, 128, +0, 0, 136, 1, 16, 2, 32, 4, 64, 8, 128, 17, 0, 0, 1, 1, +1, 4, 1, 16, 1, 64, 1, 0, 0, 0, 64, 1, 0, 2, 9, 132, +32, 8, 128, 14, 0, 0, 0, 63, 224, 128, 33, 28, 66, 68, 132, 137, +7, 240, 0, 0, 7, 248, 49, 0, 130, 0, 196, 0, 127, 128, 0, 15, +254, 16, 132, 33, 8, 66, 16, 123, 192, 0, 1, 255, 4, 1, 8, 2, +16, 4, 16, 16, 0, 0, 255, 225, 0, 66, 0, 130, 2, 3, 248, 0, +0, 63, 248, 66, 16, 132, 33, 8, 66, 0, 128, 0, 15, 254, 17, 0, +34, 0, 68, 0, 128, 0, 0, 1, 255, 4, 1, 8, 2, 16, 132, 17, +240, 0, 0, 255, 224, 8, 0, 16, 0, 32, 15, 254, 0, 0, 32, 8, +127, 240, 128, 32, 0, 2, 3, 4, 1, 8, 2, 16, 4, 63, 240, 0, +0, 255, 224, 8, 0, 40, 1, 140, 12, 6, 0, 0, 63, 248, 0, 16, +0, 32, 0, 64, 0, 128, 0, 15, 254, 12, 0, 6, 0, 48, 0, 255, +224, 0, 3, 255, 131, 0, 1, 128, 0, 192, 63, 248, 0, 0, 127, 193, +0, 66, 0, 132, 1, 7, 252, 0, 0, 63, 248, 66, 0, 132, 1, 8, +1, 224, 0, 0, 7, 252, 16, 4, 32, 40, 64, 32, 127, 160, 0, 3, +255, 132, 32, 8, 64, 16, 224, 30, 56, 0, 0, 112, 65, 16, 66, 16, +132, 17, 4, 28, 0, 0, 32, 0, 64, 0, 255, 225, 0, 2, 0, 0, +0, 15, 252, 0, 4, 0, 8, 0, 16, 255, 192, 0, 3, 224, 0, 60, +0, 6, 0, 240, 62, 0, 0, 0, 255, 128, 0, 192, 6, 0, 48, 0, +24, 0, 12, 63, 224, 0, 0, 192, 224, 102, 0, 48, 1, 152, 12, 14, +0, 0, 56, 0, 12, 0, 7, 224, 48, 3, 128, 0, 0, 8, 6, 16, +52, 35, 136, 88, 16, 192, 32, 0, 3, 255, 196, 0, 136, 1, 0, 0, +48, 0, 24, 0, 12, 0, 6, 0, 3, 0, 1, 0, 0, 16, 2, 32, +4, 127, 248, 0, 0, 32, 1, 128, 4, 0, 6, 0, 2, 0, 0, 0, +0, 16, 0, 32, 0, 64, 0, 128, 1, 0, 2, 0, 0, 32, 0, 32, +0, 32, 0, 0, 0, 39, 0, 145, 1, 34, 2, 72, 3, 248, 0, 0, +255, 224, 16, 128, 64, 128, 129, 0, 252, 0, 0, 3, 240, 8, 16, 16, +32, 32, 64, 33, 0, 0, 0, 252, 2, 4, 4, 8, 4, 32, 255, 224, +0, 0, 63, 0, 145, 1, 34, 2, 68, 3, 144, 0, 0, 16, 0, 255, +194, 64, 4, 128, 9, 0, 0, 0, 3, 172, 8, 164, 17, 72, 34, 144, +121, 32, 129, 128, 0, 31, 252, 2, 0, 8, 0, 16, 0, 31, 192, 0, +0, 1, 1, 2, 19, 252, 0, 8, 0, 16, 0, 0, 0, 32, 0, 32, +0, 65, 0, 147, 254, 0, 0, 127, 240, 1, 0, 6, 0, 50, 0, 131, +0, 0, 0, 4, 32, 8, 127, 240, 0, 32, 0, 64, 0, 0, 255, 1, +0, 3, 252, 4, 0, 7, 240, 0, 0, 63, 192, 32, 0, 128, 1, 0, +1, 252, 0, 0, 7, 224, 16, 32, 32, 64, 64, 128, 126, 0, 0, 3, +255, 2, 16, 8, 16, 16, 32, 31, 128, 0, 0, 126, 1, 2, 2, 4, +2, 16, 15, 252, 0, 0, 63, 192, 32, 0, 128, 1, 0, 1, 0, 0, +0, 6, 32, 18, 32, 36, 64, 68, 128, 70, 0, 0, 2, 0, 63, 240, +8, 16, 16, 32, 32, 64, 0, 0, 254, 0, 2, 0, 4, 0, 16, 15, +240, 0, 0, 56, 0, 14, 0, 3, 0, 56, 3, 128, 0, 0, 15, 192, +0, 96, 7, 0, 1, 128, 252, 0, 0, 3, 12, 1, 32, 1, 128, 4, +128, 48, 192, 0, 0, 240, 96, 27, 0, 8, 0, 96, 15, 0, 0, 0, +32, 192, 66, 128, 153, 1, 66, 3, 4, 0, 0, 57, 56, 141, 137, 0, +16, 0, 7, 255, 0, 0, 16, 1, 35, 98, 57, 56, 0, 0, 8, 0, +32, 0, 64, 0, 64, 0, 64, 0, 128, 2, 0, 0, 0, 192, 2, 64, +4, 128, 6, 0, 0, 0, 46, 0, 84, 0, 72, 0, 0, 2, 160, 5, +64, 5, 0, 0, 0, 16, 0, 64, 0, 0, 0, 7, 250, 49, 2, 130, +0, 196, 0, 127, 128, 0, 1, 254, 12, 64, 160, 130, 49, 0, 31, 224, +0, 0, 127, 147, 16, 72, 32, 76, 64, 7, 248, 0, 0, 31, 232, 196, +10, 8, 35, 16, 1, 254, 0, 0, 15, 242, 98, 1, 4, 9, 136, 0, +255, 0, 0, 1, 254, 76, 65, 96, 129, 49, 0, 31, 224, 0, 1, 255, +4, 1, 40, 2, 144, 4, 16, 16, 0, 3, 254, 8, 2, 80, 6, 160, +10, 32, 32, 0, 0, 31, 242, 64, 18, 128, 41, 0, 65, 1, 0, 0, +15, 254, 16, 132, 161, 10, 66, 16, 128, 32, 0, 31, 252, 33, 10, 66, +26, 132, 37, 0, 64, 0, 1, 255, 202, 16, 132, 33, 40, 66, 16, 4, +0, 1, 32, 9, 127, 240, 128, 32, 0, 2, 0, 151, 255, 72, 2, 0, +0, 160, 10, 127, 242, 128, 32, 0, 20, 1, 15, 254, 80, 4, 0, 1, +255, 194, 16, 132, 33, 4, 4, 7, 240, 0, 0, 15, 254, 12, 0, 134, +2, 3, 0, 255, 224, 0, 3, 255, 163, 0, 33, 128, 128, 192, 63, 248, +0, 0, 127, 193, 0, 74, 0, 164, 1, 7, 252, 0, 0, 31, 241, 64, +20, 128, 37, 0, 65, 255, 0, 0, 7, 252, 80, 5, 32, 9, 64, 20, +127, 192, 0, 3, 254, 40, 2, 16, 4, 160, 8, 63, 224, 0, 2, 16, +2, 64, 3, 0, 6, 0, 18, 0, 66, 0, 0, 0, 127, 244, 132, 5, +8, 18, 28, 3, 199, 0, 0, 31, 248, 128, 10, 128, 18, 0, 33, 255, +128, 0, 7, 254, 0, 2, 64, 5, 0, 8, 127, 224, 0, 1, 255, 136, +0, 160, 1, 32, 2, 159, 248, 0, 0, 255, 196, 0, 64, 0, 144, 1, +15, 252, 0, 0, 28, 0, 6, 1, 3, 244, 24, 1, 192, 0, 0, 32, +0, 64, 2, 255, 249, 0, 2, 0, 0, 0, 7, 254, 16, 0, 34, 8, +68, 16, 116, 32, 7, 128, 0, 0, 255, 0, 128, 10, 0, 36, 0, 4, +0, 0, 0, 19, 128, 72, 130, 145, 9, 36, 1, 252, 0, 0, 4, 224, +82, 33, 36, 65, 73, 0, 127, 0, 0, 1, 56, 36, 136, 41, 16, 146, +64, 31, 192, 0, 0, 78, 5, 34, 2, 68, 20, 144, 7, 240, 0, 0, +9, 193, 36, 69, 72, 132, 146, 0, 254, 0, 0, 4, 224, 18, 32, 36, +64, 63, 0, 145, 1, 34, 1, 200, 0, 0, 7, 224, 16, 32, 32, 112, +64, 144, 66, 0, 0, 1, 248, 36, 8, 40, 16, 144, 32, 16, 128, 0, +0, 126, 1, 34, 10, 68, 36, 136, 7, 32, 0, 0, 31, 128, 72, 128, +145, 193, 34, 65, 200, 0, 0, 7, 224, 82, 32, 36, 65, 72, 128, 114, +0, 0, 1, 248, 36, 136, 41, 16, 146, 32, 28, 128, 0, 0, 1, 1, +2, 11, 252, 32, 8, 0, 16, 0, 0, 0, 65, 64, 132, 255, 4, 2, +0, 4, 0, 0, 3, 248, 8, 8, 16, 16, 16, 69, 255, 204, 0, 0, +0, 3, 240, 8, 16, 16, 32, 144, 131, 255, 130, 0, 0, 0, 3, 252, +2, 0, 40, 0, 144, 0, 31, 192, 0, 0, 255, 8, 128, 10, 0, 36, +0, 7, 240, 0, 0, 31, 128, 64, 130, 129, 9, 2, 1, 248, 0, 0, +7, 224, 80, 33, 32, 65, 64, 128, 126, 0, 0, 1, 248, 20, 8, 72, +16, 80, 33, 31, 128, 0, 0, 126, 5, 2, 2, 4, 20, 8, 7, 224, +0, 0, 8, 0, 16, 1, 172, 3, 88, 0, 128, 1, 0, 0, 0, 31, +225, 16, 1, 64, 4, 128, 0, 128, 0, 0, 3, 248, 32, 8, 160, 16, +128, 64, 63, 192, 0, 1, 252, 0, 4, 16, 8, 64, 32, 31, 224, 0, +0, 127, 2, 1, 8, 2, 8, 8, 39, 248, 0, 0, 31, 192, 128, 64, +0, 130, 2, 1, 254, 0, 0, 7, 131, 0, 216, 64, 65, 3, 0, 120, +0, 0, 1, 0, 31, 248, 4, 9, 8, 28, 16, 32, 0, 0, }; -static const unsigned char fontWidths[] = { -3, 2, 6, 8, 8, 8, 8, 3, 5, 5, 6, 8, 3, 6, 3, 7, -7, 5, 6, 6, 7, 6, 6, 6, 6, 6, 3, 3, 6, 7, 6, 7, -7, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, -6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 4, 7, 4, 6, 7, -4, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, -6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 2, 4, 8, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 7, 0, 7, 8, 6, 6, 6, 0, 6, 6, 6, 6, 0, 6, 6, -5, 6, 0, 6, 3, 6, 6, 4, 0, 6, 6, 7, 6, 0, 6, 6, -6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 6, -6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 7, -6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, -7, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, +static const unsigned char fontWidths[] = { +3, 2, 6, 8, 8, 8, 8, 3, 5, 5, 6, 8, 3, 6, 3, 7, +7, 5, 6, 6, 7, 6, 6, 6, 6, 6, 3, 3, 6, 7, 6, 7, +7, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, +6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 4, 7, 4, 6, 7, +4, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, +6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 2, 4, 8, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +5, 0, 4, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, +6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 7, +6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 7, +7, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, }; From 1fee1b20456b94751296f37ceb96ce234612d46b Mon Sep 17 00:00:00 2001 From: storm64 Date: Tue, 24 May 2022 07:39:06 +0200 Subject: [PATCH 0078/1183] [Bangle.setUI] Change to clock property Feature added to Bangle.setUI reference. @gfwilliams please update the .min.js-files, --- libs/banglejs/jswrap_bangle.c | 1 + libs/js/banglejs/Bangle_setUI_F18.js | 6 +++--- libs/js/banglejs/Bangle_setUI_Q3.js | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index b4ba5d3a68..ed0f1fa9ad 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -5161,6 +5161,7 @@ Bangle.setUI({ swipe : function(dir) {}, // optional - handler for 'swipe' events drag : function(e) {}, // optional - handler for 'drag' events (Bangle.js 2 only) btn : function(n) {}, // optional - handler for 'button' events (n==1 on Bangle.js 2, n==1/2/3 depending on button for Bangle.js 1) + clock : 0 // optional - if set the behavior of 'clock' mode is added (does not override btn if defined) }); ``` */ diff --git a/libs/js/banglejs/Bangle_setUI_F18.js b/libs/js/banglejs/Bangle_setUI_F18.js index 36e3968c33..e9b8c6da03 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.js +++ b/libs/js/banglejs/Bangle_setUI_F18.js @@ -54,8 +54,8 @@ setWatch(function() { cb(1); }, BTN3, {repeat:1,edge:"falling"}), setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) ]; - } else if (mode=="custom" || mode=="clockcustom") { - if (mode=="clockcustom") Bangle.CLOCK=1; + } else if (mode=="custom") { + if (options.clock) Bangle.CLOCK=1; if (options.touch) { Bangle.touchHandler = options.touch; Bangle.on("touch", Bangle.touchHandler); @@ -70,7 +70,7 @@ setWatch(function() { options.btn(2); }, BTN2, {repeat:1,edge:"falling"}), setWatch(function() { options.btn(3); }, BTN3, {repeat:1,edge:"falling"}) ]; - } else if (mode=="clockcustom") { + } else if (options.clock) { Bangle.btnWatches = [ setWatch(Bangle.showLauncher, BTN2, {repeat:1,edge:"falling"}) ]; diff --git a/libs/js/banglejs/Bangle_setUI_Q3.js b/libs/js/banglejs/Bangle_setUI_Q3.js index 12af3c6c77..970e3c58ce 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.js @@ -81,8 +81,8 @@ ]; } else if (mode=="touch") { Bangle.touchHandler = (_,e) => {b();cb(e);}; - } else if (mode=="custom" || mode=="clockcustom") { - if (mode=="clockcustom") Bangle.CLOCK=1; + } else if (mode=="custom") { + if (options.clock) Bangle.CLOCK=1; if (options.touch) Bangle.touchHandler = options.touch; if (options.drag) { @@ -92,12 +92,12 @@ if (options.swipe) { Bangle.swipeHandler = options.swipe; Bangle.on("swipe", Bangle.swipeHandler); - } + } if (options.btn) { Bangle.btnWatches = [ setWatch(function() { options.btn(1); }, BTN1, {repeat:1,edge:"falling"}) ]; - } else if (mode=="clockcustom") { + } else if (options.clock) { Bangle.btnWatches = [ setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"falling"}) ]; From 4acac94c03dda22cb0722670fa7501f43d08d4fe Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 09:38:37 +0100 Subject: [PATCH 0079/1183] js for https://github.com/espruino/Espruino/pull/2199 --- libs/js/banglejs/Bangle_setUI_F18.min.js | 6 +++--- libs/js/banglejs/Bangle_setUI_Q3.min.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/js/banglejs/Bangle_setUI_F18.min.js b/libs/js/banglejs/Bangle_setUI_F18.min.js index f4ed18e0ad..0d780144dd 100644 --- a/libs/js/banglejs/Bangle_setUI_F18.min.js +++ b/libs/js/banglejs/Bangle_setUI_F18.min.js @@ -1,5 +1,5 @@ (function(b,c){var a={};"object"==typeof b&&(a=b,b=a.mode);var e=!0;global.WIDGETS&&WIDGETS.back&&(e=!1,WIDGETS.back.remove(b&&a.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.touchHandler&&(Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove); if(b){if("updown"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})];else if("leftright"==b)Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(function(){c()},BTN2,{repeat:1,edge:"falling"})],Bangle.swipeHandler=d=>{c(d)},Bangle.on("swipe",Bangle.swipeHandler), -Bangle.touchHandler=d=>{c()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==b||"clockcustom"==b)"clockcustom"==b&&Bangle.CLOCK=1,a.touch&&(Bangle.touchHandler=a.touch,Bangle.on("touch",Bangle.touchHandler)), -a.swipe&&(Bangle.swipeHandler=a.swipe,Bangle.on("swipe",Bangle.swipeHandler)),a.btn&&(Bangle.btnWatches=[setWatch(function(){a.btn(1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(2)},BTN2,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(3)},BTN3,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(a.back){var f=d=>{1==d&&a.back()};Bangle.on("touch",f);WIDGETS=Object.assign({back:{area:"tl",width:24,draw:d=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="), -d.x,d.y),remove:d=>{Bangle.removeListener("touch",f);d||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;d||Bangle.drawWidgets()}}},global.WIDGETS);e&&Bangle.drawWidgets()}}}) +Bangle.touchHandler=d=>{c()},Bangle.on("touch",Bangle.touchHandler);else if("clock"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("clockupdown"==b)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(function(){c(-1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){c(1)},BTN3,{repeat:1,edge:"falling"}),setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})];else if("custom"==b)a.clock&&(Bangle.CLOCK=1),a.touch&&(Bangle.touchHandler=a.touch, +Bangle.on("touch",Bangle.touchHandler)),a.swipe&&(Bangle.swipeHandler=a.swipe,Bangle.on("swipe",Bangle.swipeHandler)),a.btn?Bangle.btnWatches=[setWatch(function(){a.btn(1)},BTN1,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(2)},BTN2,{repeat:1,edge:"falling"}),setWatch(function(){a.btn(3)},BTN3,{repeat:1,edge:"falling"})]:a.clock&&(Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN2,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(a.back){var f=d=>{1==d&&a.back()};Bangle.on("touch", +f);WIDGETS=Object.assign({back:{area:"tl",width:24,draw:d=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),d.x,d.y),remove:d=>{Bangle.removeListener("touch",f);d||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;d||Bangle.drawWidgets()}}},global.WIDGETS);e&&Bangle.drawWidgets()}}}) \ No newline at end of file diff --git a/libs/js/banglejs/Bangle_setUI_Q3.min.js b/libs/js/banglejs/Bangle_setUI_Q3.min.js index 1aa5633f21..0f8118f12e 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.min.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.min.js @@ -1,6 +1,6 @@ (function(c,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof c&&(b=c,c=b.mode);var l=!0;global.WIDGETS&&WIDGETS.back&&(l=!1,WIDGETS.back.remove(c&&b.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&& (Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(c){if("updown"==c){var h=0;Bangle.dragHandler=a=>{h+=a.dy;for(a.b||(h=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("leftright"==c){var k=0;Bangle.dragHandler=a=>{k+=a.dx;for(a.b||(k=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("clock"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})];else if("clockupdown"==c)Bangle.CLOCK=1,Bangle.touchHandler=(a,d)=>{120>d.x||(f(),e(88{f();e(d)};else if("custom"==c||"clockcustom"==c)"clockcustom"==c&&Bangle.CLOCK=1,b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn&&(Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&&48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler= -(a,d)=>{d.handled||n(a,d)};Bangle.on("touch",Bangle.touchHandler)}var p=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{clearWatch(p);Bangle.removeListener("touch",m);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}}, -global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) +(a,d)=>{f();e(d)};else if("custom"==c)b.clock&&(Bangle.CLOCK=1),b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn?Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]:b.clock&&(Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&& +48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler=(a,d)=>{d.handled||n(a,d)};Bangle.on("touch",Bangle.touchHandler)}var p=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{clearWatch(p);Bangle.removeListener("touch", +m);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}},global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file From af55d57840636585b76d98c0224c41a760988b39 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Tue, 24 May 2022 11:14:01 +0200 Subject: [PATCH 0080/1183] Basic support for numeric separator This is an initial working version, but it has some known bugs: * parseInt("1_0") returns 10, not 1. That's a breaking change * multiple separators in a row is supported, but that's not supported according to the spec --- src/jslex.c | 6 ++--- src/jsutils.c | 44 ++++++++++++++++++++-------------- tests/test_integer_literals.js | 3 +++ 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/jslex.c b/src/jslex.c index 103169bfa7..daf3289562 100644 --- a/src/jslex.c +++ b/src/jslex.c @@ -542,7 +542,7 @@ void jslGetNextToken() { } } lex->tk = LEX_INT; - while (isNumeric(lex->currCh) || (!canBeFloating && isHexadecimal(lex->currCh))) { + while (isNumeric(lex->currCh) || (!canBeFloating && isHexadecimal(lex->currCh)) || lex->currCh=='_') { jslTokenAppendChar(lex->currCh); jslGetNextCh(); } @@ -554,7 +554,7 @@ void jslGetNextToken() { } // parse fractional part if (lex->tk == LEX_FLOAT) { - while (isNumeric(lex->currCh)) { + while (isNumeric(lex->currCh) || lex->currCh=='_') { jslTokenAppendChar(lex->currCh); jslGetNextCh(); } @@ -564,7 +564,7 @@ void jslGetNextToken() { lex->tk = LEX_FLOAT; jslTokenAppendChar(lex->currCh); jslGetNextCh(); if (lex->currCh=='-' || lex->currCh=='+') { jslTokenAppendChar(lex->currCh); jslGetNextCh(); } - while (isNumeric(lex->currCh)) { + while (isNumeric(lex->currCh) || lex->currCh=='_') { jslTokenAppendChar(lex->currCh); jslGetNextCh(); } } diff --git a/src/jsutils.c b/src/jsutils.c index abba121947..3cd6473fef 100644 --- a/src/jsutils.c +++ b/src/jsutils.c @@ -185,10 +185,12 @@ long long stringToIntWithRadix(const char *s, if (!radix) return 0; while (*s) { - int digit = chtod(*s); - if (digit<0 || digit>=radix) - break; - v = v*radix + digit; + if (*s != '_') { + int digit = chtod(*s); + if (digit<0 || digit>=radix) + break; + v = v*radix + digit; + } s++; } @@ -524,10 +526,12 @@ JsVarFloat stringToFloatWithRadix( // handle integer part while (*s) { - int digit = chtod(*s); - if (digit<0 || digit>=radix) - break; - v = (v*radix) + digit; + if (*s != '_') { + int digit = chtod(*s); + if (digit<0 || digit>=radix) + break; + v = (v*radix) + digit; + } s++; } @@ -537,10 +541,12 @@ JsVarFloat stringToFloatWithRadix( s++; // skip . while (*s) { - if (*s >= '0' && *s <= '9') - v += mul*(*s - '0'); - else break; - mul /= 10; + if (*s != '_') { + if (*s >= '0' && *s <= '9') + v += mul*(*s - '0'); + else break; + mul /= 10; + } s++; } } @@ -555,9 +561,11 @@ JsVarFloat stringToFloatWithRadix( } int e = 0; while (*s) { - if (*s >= '0' && *s <= '9') - e = (e*10) + (*s - '0'); - else break; + if (*s != '_') { + if (*s >= '0' && *s <= '9') + e = (e*10) + (*s - '0'); + else break; + } s++; } if (isENegated) e=-e; @@ -684,7 +692,7 @@ void ftoa_bounded_extra(JsVarFloat val,char *str, size_t len, int radix, int fra int v = (int)(val+((fractionalDigits==1) ? 0.5 : 0.00000001) ); val = (val-v)*radix; if (v==radix) v=radix-1; - if (!hasPt) { + if (!hasPt) { hasPt = true; if (--len <= 0) { *str=0; return; } // bounds check *(str++)='.'; @@ -922,12 +930,12 @@ size_t jsuGetFreeStack() { //Early entries are in higher memory locations. //Later entries are in lower memory locations. - + uint32_t stackPos = (uint32_t)&ptr; uint32_t stackStart = (uint32_t)espruino_stackHighPtr - ESP_STACK_SIZE; if (stackPos < stackStart) return 0; // should never happen, but just in case of overflow! - + return stackPos - stackStart; #else // stack depth seems pretty platform-specific :( Default to a value that disables it diff --git a/tests/test_integer_literals.js b/tests/test_integer_literals.js index 38d07ac34f..06d419d9fe 100644 --- a/tests/test_integer_literals.js +++ b/tests/test_integer_literals.js @@ -14,4 +14,7 @@ t( 0B01 === 1); t( 0o01 === 1); t( 0O01 === 1); +t( 1_0 === 10); +t( 0x0_1 === 1); + result = tests==testpass; From b6d72889920264b3c5a964a110ce1e418b955af9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 12:14:03 +0100 Subject: [PATCH 0081/1183] JIT record access --- README_JIT.md | 9 ++++++ src/jsjit.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 9e41c017f9..91cd215133 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -135,6 +135,15 @@ function nojit() {for (i=0;i<1000;i=i+1);} function jit() {"jit";for (i=0;i<1000;i=i+1);} t=getTime();jit();getTime()-t // 0.14 sec t=getTime();nojit();getTime()-t // 0.28 sec + + +a = {b:42,c:function(){print("hello",this)}}; +function jit() {"jit";return a.b;} +jit()==42 +function jit() {"jit";return a["b"];} +jit()==42 +function jit() {"jit";a.c();} +jit(); // prints 'hello {b:42,...}' ``` Run JIT on ARM and then disassemble: diff --git a/src/jsjit.c b/src/jsjit.c index 99d5878652..f8c4faf0cb 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -19,6 +19,7 @@ #include "jsinteractive.h" #define JSP_ASSERT_MATCH(TOKEN) { assert(lex->tk==(TOKEN));jslGetNextToken(); } // Match where if we have the wrong token, it's an internal error +#define JSP_MATCH_WITH_RETURN(TOKEN, RETURN_VAL) if (!jslMatch((TOKEN))) return RETURN_VAL; #define JSP_MATCH(TOKEN) if (!jslMatch((TOKEN))) return; // Match where the user could have given us the wrong token #define JSJ_PARSING (!(execInfo.execute&EXEC_EXCEPTION)) @@ -142,12 +143,77 @@ void jsjFactor() { } else JSP_MATCH(LEX_EOF); } +/// Look up 'parent.a[index]'. Utility function called from JIT code +uint64_t _jsjxObjectLookup(JsVar *index, JsVar *parent, JsVar *a) { + JsVar *resultParent = jsvSkipNameWithParent(a,true,parent); + jsvUnLock2(a, parent); + JsVar *resultA = 0; + if (resultParent) + resultA = jspGetVarNamedField(resultParent, index, true); + if (!resultA) { + if (jsvHasChildren(resultParent)) { + // if no child found, create a pointer to where it could be + // as we don't want to allocate it until it's written + resultA = jsvCreateNewChild(resultParent, index, 0); + } else { + jsExceptionHere(JSET_ERROR, "Field or method %q does not already exist, and can't create it on %t", index, resultParent); + } + } + jsvUnLock(index); + return ((uint64_t)(size_t)resultA) | (((uint64_t)(size_t)resultParent)<<32); +} + +// Parse ./[] - return true if the parent of the current item is currently on the stack +bool jsjFactorMember() { + bool parentOnStack = false; + while ((lex->tk=='.' || lex->tk=='[') && JSJ_PARSING) { + if (lex->tk == '.') { // ------------------------------------- Record Access + JSP_ASSERT_MATCH('.'); + if (jslIsIDOrReservedWord()) { + JsVar *a = jslGetTokenValueAsVar(); + jsjcLiteralString(0, a, true); // null terminated + jsvUnLock(a); + // r0 = string pointer + jslGetNextToken(); // skip over current token (we checked above that it was an ID or reserved word) + jsjcCall(jsvNewFromString); + // r0 = index (as JsVar) + } else { + // incorrect token - force a match fail by asking for an ID + JSP_MATCH_WITH_RETURN(LEX_ID, false); // if we fail we're stopping compilation anyway + } + } else if (lex->tk == '[') { // ------------------------------------- Array Access + JSP_ASSERT_MATCH('['); + jsjAssignmentExpression(); + jsjcPop(0); + jsjcCall(jsvAsArrayIndexAndUnLock); + JSP_MATCH_WITH_RETURN(']', false); // if we fail we're stopping compilation anyway + // r0 = index + } else { + assert(0); + } + // r0 currently = index + if (parentOnStack) jsjcPop(1); // r1 = parent + else jsjcLiteral32(1, 0); + jsjcPop(2); // r2 = the variable itself + jsjcCall(_jsjxObjectLookup); // (a,parent) = _jsjxObjectLookup(index, parent, a) + jsjcPush(0, JSJVT_JSVAR); // a + jsjcPush(1, JSJVT_JSVAR); // parent + parentOnStack = true; + } + return parentOnStack; +} + void jsjFactorFunctionCall() { jsjFactor(); - // jsjFactorMember(); // FIXME we need to call this and also somehow remember 'parent' + bool parentOnStack = jsjFactorMember(); // FIXME we need to call this and also somehow remember 'parent' // FIXME: what about 'new'? while (lex->tk=='(' /*|| (isConstructor && JSP_SHOULD_EXECUTE))*/ && JSJ_PARSING) { + if (parentOnStack) { + DEBUG_JIT("; FUNCTION CALL r6 = 'this'\n"); + jsjcPop(6); // r6 = this/parent + parentOnStack = false; + } DEBUG_JIT("; FUNCTION CALL r4 = funcName\n"); jsjcPop(4); // r4 = funcName DEBUG_JIT("; FUNCTION CALL arguments\n"); @@ -193,9 +259,9 @@ void jsjFactorFunctionCall() { // Second arg jsjcMov(1, 4); // r1 = funcName // - jsjcLiteral32(2, argCount); + jsjcLiteral32(2, argCount); jsjcPush(2, JSJVT_INT); // argCount - jsjcLiteral32(2, 0); // parent = 0 FIXME (see above) + jsjcMov(2, 6); // parent (from r6) jsjcLiteral32(3, 0); // isParsing = false jsjcCall(jspeFunctionCall); // a = jspeFunctionCall(func, funcName, thisArg/parent, isParsing, argCount, argPtr); DEBUG_JIT("; FUNCTION CALL cleanup\n"); @@ -209,6 +275,9 @@ void jsjFactorFunctionCall() { // parent=0; // a = jsjFactorMember(a, &parent); } + if (parentOnStack) { + jsjcPop(4); // just remove parent from the stack. We don't care where it goes! + } } void __jsjPostfixExpression() { @@ -675,7 +744,7 @@ JsVar *jsjParseFunction() { // with native function code... jsjcPushAll(); // Function start jsjBlockNoBrackets(); - // optimisation: if the last statement was a return, no need for this + // optimisation: if the last statement was a return, no need for this. Could check if last instruction was 'POP {r4,r5,r6,r7,pc}' // Return 'undefined' from function if no other return statement jsjcLiteral32(0, 0); jsjcPopAllAndReturn(); From 8701937e9304ad46056d3d380724f00099c7e5d1 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Tue, 24 May 2022 13:35:58 +0200 Subject: [PATCH 0082/1183] Added support for method declaration in objects (similar to what is possible in classes) --- src/jsparse.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/jsparse.c b/src/jsparse.c index 7c9198ddeb..1e9f6da6ab 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1295,7 +1295,13 @@ NO_INLINE JsVar *jspeFactorObject() { } } else #endif - { + if (lex->tk == '(') { + JsVar *contentsName = jsvFindChildFromVar(contents, varName, true); + if (contentsName) { + JsVar *method = jspeFunctionDefinition(false); + jsvUnLock2(jsvSetValueOfName(contentsName, method), method); + } + } else { JSP_MATCH_WITH_CLEANUP_AND_RETURN(':', jsvUnLock(varName), contents); if (JSP_SHOULD_EXECUTE) { varName = jsvAsArrayIndexAndUnLock(varName); From 1165d780390f493887edbe589109ceb1daa262fc Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 14:15:41 +0100 Subject: [PATCH 0083/1183] Allow method declarations in objects - ES6 'Enhanced Object Literals' (#2202 / #1302) --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 6ad1b1844a..0aca05c4c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,7 @@ Fix recent class method regression (24247e4ec9) (fix #2197) Bangle.js2: 6x15 font tweaks for better ISO8859-1 support Bangle.js: Add clock property to "custom" mode in setUI + Allow method declarations in objects - ES6 'Enhanced Object Literals' (#2202 / #1302) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From 48fde7600c05e6c3f82e8a3db0d9296778e94e2c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 14:28:30 +0100 Subject: [PATCH 0084/1183] Refactor jswrap_object_keys_or_property_names to use flags for better readability/expandability --- libs/graphics/jswrap_graphics.c | 2 +- src/jsinteractive.c | 4 ++-- src/jswrap_object.c | 19 ++++++++----------- src/jswrap_object.h | 13 +++++++++---- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 86a078d26a..955ae43201 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -1849,7 +1849,7 @@ JsVar *jswrap_graphics_getFonts(JsVar *parent) { #endif // vector font is added by below.. // scan for any functions 'setFont*' and add those names - jswrap_object_keys_or_property_names_cb(parent, true, true, jswrap_graphics_getFonts_callback, arr); + jswrap_object_keys_or_property_names_cb(parent, JSWOKPF_INCLUDE_NON_ENUMERABLE|JSWOKPF_INCLUDE_PROTOTYPE, jswrap_graphics_getFonts_callback, arr); return arr; #else return 0; diff --git a/src/jsinteractive.c b/src/jsinteractive.c index 6f35b7022c..c3815161a6 100644 --- a/src/jsinteractive.c +++ b/src/jsinteractive.c @@ -1386,7 +1386,7 @@ void jsiTabComplete() { // Now try and autocomplete data.possible = 0; data.matches = 0; - jswrap_object_keys_or_property_names_cb(object, true, true, jsiTabComplete_findCommon, &data); + jswrap_object_keys_or_property_names_cb(object, JSWOKPF_INCLUDE_NON_ENUMERABLE|JSWOKPF_INCLUDE_PROTOTYPE, jsiTabComplete_findCommon, &data); // If we've got >1 match and are at the end of a line, print hints if (data.matches>1) { // Remove the current line and add a newline @@ -1395,7 +1395,7 @@ void jsiTabComplete() { jsiConsolePrint("\n\n"); data.lineLength = 0; // Output hints - jswrap_object_keys_or_property_names_cb(object, true, true, jsiTabComplete_printCommon, &data); + jswrap_object_keys_or_property_names_cb(object, JSWOKPF_INCLUDE_NON_ENUMERABLE|JSWOKPF_INCLUDE_PROTOTYPE, jsiTabComplete_printCommon, &data); if (data.lineLength) jsiConsolePrint("\n"); jsiConsolePrint("\n"); // Return the input line diff --git a/src/jswrap_object.c b/src/jswrap_object.c index 8137a4716d..2632fd0d8c 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -150,7 +150,7 @@ JsVar *jswrap_object_clone(JsVar *parent) { "type" : "staticmethod", "class" : "Object", "name" : "keys", - "generate_full" : "jswrap_object_keys_or_property_names(object, false, false)", + "generate_full" : "jswrap_object_keys_or_property_names(object, JSWOKPF_NONE)", "params" : [ ["object","JsVar","The object to return keys for"] ], @@ -162,7 +162,7 @@ Return all enumerable keys of the given object "type" : "staticmethod", "class" : "Object", "name" : "getOwnPropertyNames", - "generate_full" : "jswrap_object_keys_or_property_names(object, true, false)", + "generate_full" : "jswrap_object_keys_or_property_names(object, JSWOKPF_INCLUDE_NON_ENUMERABLE)", "params" : [ ["object","JsVar","The Object to return a list of property names for"] ], @@ -171,7 +171,6 @@ Return all enumerable keys of the given object Returns an array of all properties (enumerable or not) found directly on a given object. */ - static void _jswrap_object_keys_or_property_names_iterator( const JswSymList *symbols, void (*callback)(void *data, JsVar *name), @@ -200,8 +199,7 @@ static void _jswrap_object_keys_or_property_names_iterator( /** This is for Object.keys and Object. However it uses a callback so doesn't allocate anything */ void jswrap_object_keys_or_property_names_cb( JsVar *obj, - bool includeNonEnumerable, ///< include 'hidden' items - bool includePrototype, ///< include items for the prototype too (for autocomplete) + JswObjectKeysOrPropertiesFlags flags, void (*callback)(void *data, JsVar *name), void *data ) { @@ -233,7 +231,7 @@ void jswrap_object_keys_or_property_names_cb( /* Search our built-in symbol table Assume that ALL builtins are non-enumerable. This isn't great but seems to work quite well right now! */ - if (includeNonEnumerable) { + if (flags & JSWOKPF_INCLUDE_NON_ENUMERABLE) { const JswSymList *objSymbols = jswGetSymbolListForObjectProto(0); JsVar *protoOwner = jspGetPrototypeOwner(obj); @@ -248,14 +246,14 @@ void jswrap_object_keys_or_property_names_cb( _jswrap_object_keys_or_property_names_iterator(symbols, callback, data); } - if (includePrototype) { + if (flags & JSWOKPF_INCLUDE_PROTOTYPE) { JsVar *proto = 0; if (jsvIsObject(obj) || jsvIsFunction(obj)) { proto = jsvObjectGetChild(obj, JSPARSE_INHERITS_VAR, 0); } if (jsvIsObject(proto)) { - jswrap_object_keys_or_property_names_cb(proto, includeNonEnumerable, includePrototype, callback, data); + jswrap_object_keys_or_property_names_cb(proto, flags, callback, data); } else { // include Object/String/etc const JswSymList *symbols = jswGetSymbolListForObjectProto(obj); @@ -289,13 +287,12 @@ void jswrap_object_keys_or_property_names_cb( JsVar *jswrap_object_keys_or_property_names( JsVar *obj, - bool includeNonEnumerable, ///< include 'hidden' items - bool includePrototype ///< include items for the prototype too (for autocomplete) + JswObjectKeysOrPropertiesFlags flags ) { JsVar *arr = jsvNewEmptyArray(); if (!arr) return 0; - jswrap_object_keys_or_property_names_cb(obj, includeNonEnumerable, includePrototype, (void (*)(void *, JsVar *))jsvArrayAddUnique, arr); + jswrap_object_keys_or_property_names_cb(obj, flags, (void (*)(void *, JsVar *))jsvArrayAddUnique, arr); return arr; } diff --git a/src/jswrap_object.h b/src/jswrap_object.h index bba27291fa..7a969bb2f8 100644 --- a/src/jswrap_object.h +++ b/src/jswrap_object.h @@ -19,18 +19,23 @@ JsVar *jswrap_object_length(JsVar *parent); JsVar *jswrap_object_valueOf(JsVar *parent); JsVar *jswrap_object_toString(JsVar *parent, JsVar *arg0); JsVar *jswrap_object_clone(JsVar *parent); + +typedef enum { + JSWOKPF_NONE, + JSWOKPF_INCLUDE_NON_ENUMERABLE = 1, ///< include 'hidden' items + JSWOKPF_INCLUDE_PROTOTYPE = 2 ///< include items for the prototype too (for autocomplete) +} JswObjectKeysOrPropertiesFlags; + /** This is for Object.keys and Object. However it uses a callback so doesn't allocate anything */ void jswrap_object_keys_or_property_names_cb( JsVar *obj, - bool includeNonEnumerable, ///< include 'hidden' items - bool includePrototype, ///< include items for the prototype too (for autocomplete) + JswObjectKeysOrPropertiesFlags flags, void (*callback)(void *data, JsVar *name), void *data ); JsVar *jswrap_object_keys_or_property_names( JsVar *obj, - bool includeNonEnumerable, - bool includePrototype); + JswObjectKeysOrPropertiesFlags flags); JsVar *jswrap_object_create(JsVar *proto, JsVar *propertiesObject); JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name); bool jswrap_object_hasOwnProperty(JsVar *parent, JsVar *name); From ae664896d01716aef6b035d16eac4ccbee59a254 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 14:45:41 +0100 Subject: [PATCH 0085/1183] Added Object.values/Object.entries (#1302) --- ChangeLog | 1 + src/jswrap_object.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/jswrap_object.h | 1 + 3 files changed, 54 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0aca05c4c1..fdb18e95e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,7 @@ Bangle.js2: 6x15 font tweaks for better ISO8859-1 support Bangle.js: Add clock property to "custom" mode in setUI Allow method declarations in objects - ES6 'Enhanced Object Literals' (#2202 / #1302) + Added Object.values/Object.entries (#1302) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jswrap_object.c b/src/jswrap_object.c index 2632fd0d8c..a222913e72 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -297,6 +297,58 @@ JsVar *jswrap_object_keys_or_property_names( return arr; } +/*JSON{ + "type" : "staticmethod", + "class" : "Object", + "name" : "values", + "ifndef" : "SAVE_ON_FLASH", + "generate_full" : "jswrap_object_values_or_entries(object, false);", + "params" : [ + ["object","JsVar","The object to return values for"] + ], + "return" : ["JsVar","An array of values - one for each key on the given object"] +} +Return all enumerable values of the given object + */ +/*JSON{ + "type" : "staticmethod", + "class" : "Object", + "name" : "entries", + "ifndef" : "SAVE_ON_FLASH", + "generate_full" : "jswrap_object_values_or_entries(object, true);", + "params" : [ + ["object","JsVar","The object to return values for"] + ], + "return" : ["JsVar","An array of `[key,value]` pairs - one for each key on the given object"] +} +Return all enumerable keys and values of the given object + */ +void _jswrap_object_values_cb(void *data, JsVar *name) { + JsVar **cbData = (JsVar**)data; + jsvArrayPushAndUnLock(cbData[0], jspGetVarNamedField(cbData[1], name, false)); +} +void _jswrap_object_entries_cb(void *data, JsVar *name) { + JsVar **cbData = (JsVar**)data; + JsVar *tuple = jsvNewEmptyArray(); + if (!tuple) return; + jsvArrayPush(tuple, name); + jsvArrayPushAndUnLock(tuple, jspGetVarNamedField(cbData[1], name, false)); + jsvArrayPushAndUnLock(cbData[0], tuple); +} +JsVar *jswrap_object_values_or_entries(JsVar *object, bool returnEntries) { + JsVar *cbData[2]; + cbData[0] = jsvNewEmptyArray(); + cbData[1] = object; + if (!cbData[0]) return 0; + jswrap_object_keys_or_property_names_cb( + object, JSWOKPF_NONE, + returnEntries ? _jswrap_object_entries_cb : _jswrap_object_values_cb, + (void*)cbData + ); + return cbData[0]; +} + + /*JSON{ "type" : "staticmethod", "class" : "Object", diff --git a/src/jswrap_object.h b/src/jswrap_object.h index 7a969bb2f8..afebdbb797 100644 --- a/src/jswrap_object.h +++ b/src/jswrap_object.h @@ -36,6 +36,7 @@ void jswrap_object_keys_or_property_names_cb( JsVar *jswrap_object_keys_or_property_names( JsVar *obj, JswObjectKeysOrPropertiesFlags flags); +JsVar *jswrap_object_values_or_entries(JsVar *object, bool returnEntries); JsVar *jswrap_object_create(JsVar *proto, JsVar *propertiesObject); JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name); bool jswrap_object_hasOwnProperty(JsVar *parent, JsVar *name); From 6b872b1efb61bd9fcdc0efbd6387cd871b0bd11e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 15:38:39 +0100 Subject: [PATCH 0086/1183] Added block scoping for let and const (#971) --- ChangeLog | 1 + src/jsparse.c | 62 +++++++++++++++++++++++++++------------ src/jsparse.h | 9 ++++-- tests/test_let_scoping.js | 47 +++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 tests/test_let_scoping.js diff --git a/ChangeLog b/ChangeLog index fdb18e95e2..f61d9035d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,7 @@ Bangle.js: Add clock property to "custom" mode in setUI Allow method declarations in objects - ES6 'Enhanced Object Literals' (#2202 / #1302) Added Object.values/Object.entries (#1302) + Added block scoping for let and const (#971) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsparse.c b/src/jsparse.c index 1e9f6da6ab..648087db33 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -131,18 +131,6 @@ JsVar *jspeiGetTopScope() { } return jsvLockAgain(execInfo.root); } -JsVar *jspeiFindOnTop(const char *name, bool createIfNotFound) { - JsVar *scope = jspeiGetTopScope(); - JsVar *result = jsvFindChildFromString(scope, name, createIfNotFound); - jsvUnLock(scope); - return result; -} -JsVar *jspeiFindNameOnTop(JsVar *childName, bool createIfNotFound) { - JsVar *scope = jspeiGetTopScope(); - JsVar *result = jsvFindChildFromVar(scope, childName, createIfNotFound); - jsvUnLock(scope); - return result; -} JsVar *jspFindPrototypeFor(const char *className) { JsVar *obj = jsvObjectGetChild(execInfo.root, className, 0); @@ -772,6 +760,8 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t } // add the function's execute space to the symbol table so we can recurse if (jspeiAddScope(functionRoot)) { + JsVar *oldBaseScope = execInfo.baseScope; + execInfo.baseScope = functionRoot; /* Adding scope may have failed - we may have descended too deep - so be sure * not to pull somebody else's scope off */ @@ -843,6 +833,7 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t JsExecFlags hasError = execInfo.execute&EXEC_ERROR_MASK; JSP_RESTORE_EXECUTE(); // because return will probably have set execute to false + #ifdef USE_DEBUGGER bool calledDebugger = false; if (execInfo.execute & EXEC_DEBUGGER_MASK) { @@ -881,6 +872,7 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t execInfo.thisVar = oldThisVar; jspeiRemoveScope(); + execInfo.baseScope = oldBaseScope; } // Unlock scopes and restore old ones @@ -2146,6 +2138,9 @@ NO_INLINE void jspeSkipBlock() { /** Parse a block `{ ... }` but assume brackets are already parsed */ NO_INLINE void jspeBlockNoBrackets() { + execInfo.blockCount++; + JsVar *oldBlockScope = execInfo.blockScope; + execInfo.blockScope = 0; if (JSP_SHOULD_EXECUTE) { while (lex->tk && lex->tk!='}') { JsVar *a = jspeStatement(); @@ -2163,16 +2158,23 @@ NO_INLINE void jspeBlockNoBrackets() { } } if (JSP_SHOULDNT_PARSE) - return; + break; if (!JSP_SHOULD_EXECUTE) { jspeSkipBlock(); - return; + break; } } } else { jspeSkipBlock(); } - return; + // If we had a block scope defined, for LET/CONST, remove it + if (execInfo.blockScope) { + jspeiRemoveScope(); + jsvUnLock(execInfo.blockScope); + execInfo.blockScope = 0; + } + execInfo.blockScope = oldBlockScope; + execInfo.blockCount--; } /** Parse a block `{ ... }` */ @@ -2212,13 +2214,25 @@ NO_INLINE JsVar *jspeStatementVar() { * hand side. Maybe just have a flag called can_create_var that we * set and then we parse as if we're doing a normal equals.*/ assert(lex->tk==LEX_R_VAR || lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST); + // LET and CONST are block scoped *except* when we're not in a block! + bool isBlockScoped = (lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST) && execInfo.blockCount; + + jslGetNextToken(); - ///TODO: Correctly implement CONST and LET - we just treat them like 'var' at the moment bool hasComma = true; // for first time in loop while (hasComma && lex->tk == LEX_ID && !jspIsInterrupted()) { JsVar *a = 0; if (JSP_SHOULD_EXECUTE) { - a = jspeiFindOnTop(jslGetTokenValueAsString(), true); + char *name = jslGetTokenValueAsString(); + if (isBlockScoped) { + if (!execInfo.blockScope) { + execInfo.blockScope = jsvNewObject(); + jspeiAddScope(execInfo.blockScope); + } + a = jsvFindChildFromString(execInfo.blockScope, name, true); + } else { + a = jsvFindChildFromString(execInfo.baseScope, name, true); + } if (!a) { // out of memory jspSetError(false); return lastDefined; @@ -2768,7 +2782,7 @@ NO_INLINE JsVar *jspeStatementFunctionDecl(bool isClass) { if (actuallyCreateFunction) { // find a function with the same name (or make one) // OPT: can Find* use just a JsVar that is a 'name'? - JsVar *existingName = jspeiFindNameOnTop(funcName, true); + JsVar *existingName = jsvFindChildFromVar(execInfo.baseScope, funcName, true); JsVar *existingFunc = jsvSkipName(existingName); if (jsvIsFunction(existingFunc)) { // 'proper' replace, that keeps the original function var and swaps the children @@ -2995,9 +3009,16 @@ void jspSoftInit() { // Root now has a lock and a ref execInfo.hiddenRoot = jsvObjectGetChild(execInfo.root, JS_HIDDEN_CHAR_STR, JSV_OBJECT); execInfo.execute = EXEC_YES; + execInfo.baseScope = execInfo.root; + execInfo.scopesVar = 0; + execInfo.blockScope = 0; + execInfo.blockCount = 0; } void jspSoftKill() { + assert(execInfo.baseScope==execInfo.root); + assert(execInfo.blockScope==0); + assert(execInfo.blockCount==0); jsvUnLock(execInfo.scopesVar); execInfo.scopesVar = 0; jsvUnLock(execInfo.hiddenRoot); @@ -3056,7 +3077,10 @@ JsVar *jspEvaluateVar(JsVar *str, JsVar *scope, uint16_t lineNumberOffset) { if (scope) { // if we're adding a scope, make sure it's the *only* scope execInfo.scopesVar = 0; - if (scope!=execInfo.root) jspeiAddScope(scope); // it's searched by default anyway + if (scope!=execInfo.root) { + jspeiAddScope(scope); // it's searched by default anyway + execInfo.baseScope = scope; // this gets replaces after with execInfo = oldExecInfo + } } // actually do the parsing diff --git a/src/jsparse.h b/src/jsparse.h index 71dde0a05e..c3e4663fdd 100644 --- a/src/jsparse.h +++ b/src/jsparse.h @@ -134,12 +134,17 @@ typedef struct { JsVar *root; //!< root of symbol table JsVar *hiddenRoot; //!< root of the symbol table that's hidden - /// JsVar array of scopes + /// JsVar array of all execution scopes (`root` is not included) JsVar *scopesVar; + /// This is the base scope of execution - `root`, or the execution scope of the function. Scopes added for let/const are not included + JsVar *baseScope; + /// IF nonzero, this the scope of the current block (which gets added when 'let/const' is used in a block) + JsVar *blockScope; /// Value of 'this' reserved word JsVar *thisVar; - volatile JsExecFlags execute; + volatile JsExecFlags execute; //!< Should we be executing, do we have errors, etc + uint8_t blockCount; //!< how many blocks '{}' deep are we? } JsExecInfo; /* Info about execution when Parsing - this saves passing it on the stack diff --git a/tests/test_let_scoping.js b/tests/test_let_scoping.js new file mode 100644 index 0000000000..28a494069b --- /dev/null +++ b/tests/test_let_scoping.js @@ -0,0 +1,47 @@ +var results=[]; + +{ + let x = 1; + if (x === 1) { + let x = 2; + console.log(x); results.push(x==2); + } + console.log(x); results.push(x==1); +} + +function test1() { + let x = 1; + if (x === 1) { + let x = 2; + console.log(x); results.push(x==2); + } + console.log(x); results.push(x==1); +} + +test1(); + + +function test2() { + var x = 1; + + if (x === 1) { + let x = 2; + var y = 3; + let z = 4; + + console.log(x); results.push(x==2); + console.log(y); results.push(y==3); + + } + + console.log(x); results.push(x==1); + console.log(y); results.push(y==3); + console.log(typeof z);results.push("undefined" == typeof z); + +} + +test2(); + +console.log("Results:",results); + +result = results.every(r=>r); From 7b5a8295f603881b31257561d556a9becdfdefaf Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 16:10:50 +0100 Subject: [PATCH 0087/1183] Honour non-writable const vars (fix #971) --- ChangeLog | 1 + src/jsparse.c | 3 +++ src/jsvar.c | 6 ++++++ src/jsvar.h | 9 ++++++--- src/jswrap_object.c | 8 ++++++-- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index f61d9035d5..98ab19ef91 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,7 @@ Allow method declarations in objects - ES6 'Enhanced Object Literals' (#2202 / #1302) Added Object.values/Object.entries (#1302) Added block scoping for let and const (#971) + Honour non-writable const vars (fix #971) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsparse.c b/src/jsparse.c index 648087db33..039074fa42 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2216,6 +2216,7 @@ NO_INLINE JsVar *jspeStatementVar() { assert(lex->tk==LEX_R_VAR || lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST); // LET and CONST are block scoped *except* when we're not in a block! bool isBlockScoped = (lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST) && execInfo.blockCount; + bool isConstant = lex->tk==LEX_R_CONST; jslGetNextToken(); @@ -2248,6 +2249,8 @@ NO_INLINE JsVar *jspeStatementVar() { jsvReplaceWith(a, var); jsvUnLock(var); } + if (isConstant) + a->flags |= JSV_CONSTANT; jsvUnLock(lastDefined); lastDefined = a; hasComma = lex->tk == ','; diff --git a/src/jsvar.c b/src/jsvar.c index 007dff87a9..128cf4843b 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -96,6 +96,7 @@ bool jsvIsBasicString(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>= bool jsvIsStringExt(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>=JSV_STRING_EXT_0 && (v->flags&JSV_VARTYPEMASK)<=JSV_STRING_EXT_MAX; } ///< The extra bits dumped onto the end of a string to store more data bool jsvIsFlatString(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)==JSV_FLAT_STRING; } bool jsvIsNativeString(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)==JSV_NATIVE_STRING; } +bool jsvIsConstant(const JsVar *v) { return v && (v->flags&JSV_CONSTANT)==JSV_CONSTANT; } bool jsvIsFlashString(const JsVar *v) { #ifdef SPIFLASH_BASE return v && (v->flags&JSV_VARTYPEMASK)==JSV_FLASH_STRING; @@ -2055,6 +2056,10 @@ void jsvReplaceWith(JsVar *dst, JsVar *src) { jsExceptionHere(JSET_ERROR, "Unable to assign value to non-reference %t", dst); return; } + if (jsvIsConstant(dst)) { + jsExceptionHere(JSET_TYPEERROR, "Assignment to a constant"); + return; + } #ifndef SAVE_ON_FLASH JsVar *v = jsvGetValueOfName(dst); if (jsvIsGetterOrSetter(v)) { @@ -3709,6 +3714,7 @@ void _jsvTrace(JsVar *var, int indent, JsVar *baseVar, int level) { } else { jsiConsolePrintf("Unknown %d", var->flags & (JsVarFlags)~(JSV_LOCK_MASK)); } + if (jsvIsConstant(var)) jsiConsolePrintf(" CONST "); // print a value if it was stored in here as well... if (jsvIsNameInt(var)) { diff --git a/src/jsvar.h b/src/jsvar.h index c31eb9e2a1..d22337e46a 100644 --- a/src/jsvar.h +++ b/src/jsvar.h @@ -83,18 +83,20 @@ typedef enum { // _JSV_VAR_END is: // 39 on systems with 8 bit JsVarRefs // 43 on systems with 16 bit JsVarRefs - // 51 on systems with 32 bit JsVarRefs (more if on a 64 bit platform though) + // 51 on systems with 32 bit JsVarRefs + // 81 on a 64 bit platform JSV_VARTYPEMASK = NEXT_POWER_2(_JSV_VAR_END)-1, // probably this is 63 - JSV_NATIVE = JSV_VARTYPEMASK+1, ///< to specify if this is a function parameter + JSV_CONSTANT = JSV_VARTYPEMASK+1, ///< to specify if this variable is a constant or not. Only used for NAMEs + JSV_NATIVE = JSV_CONSTANT<<1, ///< to specify if this is a function parameter JSV_GARBAGE_COLLECT = JSV_NATIVE<<1, ///< When garbage collecting, this flag is true IF we should GC! JSV_IS_RECURSING = JSV_GARBAGE_COLLECT<<1, ///< used to stop recursive loops in jsvTrace JSV_LOCK_ONE = JSV_IS_RECURSING<<1, JSV_LOCK_MASK = JSV_LOCK_MAX * JSV_LOCK_ONE, JSV_LOCK_SHIFT = GET_BIT_NUMBER(JSV_LOCK_ONE), ///< The amount of bits we must shift to get the number of locks - forced to be a constant - JSV_VARIABLEINFOMASK = JSV_VARTYPEMASK | JSV_NATIVE, // if we're copying a variable, this is all the stuff we want to copy + JSV_VARIABLEINFOMASK = JSV_VARTYPEMASK | JSV_NATIVE | JSV_CONSTANT, // if we're copying a variable, this is all the stuff we want to copy } PACKED_FLAGS JsVarFlags; // aiming to get this in 2 bytes! @@ -373,6 +375,7 @@ bool jsvIsBasicString(const JsVar *v); ///< Just a string (NOT a name) bool jsvIsStringExt(const JsVar *v); ///< The extra bits dumped onto the end of a string to store more data bool jsvIsFlatString(const JsVar *v); bool jsvIsNativeString(const JsVar *v); +bool jsvIsConstant(const JsVar *v); bool jsvIsFlashString(const JsVar *v); bool jsvIsNumeric(const JsVar *v); bool jsvIsFunction(const JsVar *v); diff --git a/src/jswrap_object.c b/src/jswrap_object.c index a222913e72..a7f70ccafa 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -412,7 +412,7 @@ JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name) { JsvIsInternalChecker checkerFunction = jsvGetInternalFunctionCheckerFor(parent); - jsvObjectSetChildAndUnLock(obj, "writable", jsvNewFromBool(true)); + jsvObjectSetChildAndUnLock(obj, "writable", jsvNewFromBool(!jsvIsConstant(varName))); jsvObjectSetChildAndUnLock(obj, "enumerable", jsvNewFromBool(!checkerFunction || !checkerFunction(varName))); jsvObjectSetChildAndUnLock(obj, "configurable", jsvNewFromBool(!isBuiltIn)); #ifndef SAVE_ON_FLASH @@ -494,7 +494,7 @@ Add a new property to the Object. 'Desc' is an object with the following fields: * `configurable` (bool = false) - can this property be changed/deleted (not implemented) * `enumerable` (bool = false) - can this property be enumerated (not implemented) * `value` (anything) - the value of this property -* `writable` (bool = false) - can the value be changed with the assignment operator? (not implemented) +* `writable` (bool = false) - can the value be changed with the assignment operator? * `get` (function) - the getter function, or undefined if no getter (only supported on some platforms) * `set` (function) - the setter function, or undefined if no setter (only supported on some platforms) @@ -532,6 +532,10 @@ JsVar *jswrap_object_defineProperty(JsVar *parent, JsVar *propName, JsVar *desc) if (!value) value = jsvObjectGetChild(desc, "value", 0); jsvObjectSetChildVar(parent, name, value); + JsVar *writable = jsvObjectGetChild(desc, "writable", 0); + if (!jsvIsUndefined(writable) && !jsvGetBoolAndUnLock(writable)) + name->flags |= JSV_CONSTANT; + jsvUnLock2(name, value); return jsvLockAgain(parent); From 72cfe260a0c8de04825083858eecf31a9124b601 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 24 May 2022 17:01:18 +0100 Subject: [PATCH 0088/1183] Remove un-needed type checks (https://github.com/espruino/Espruino/pull/2202#issuecomment-1135961591) Remove Line Numbers from 'save on flash' builds Also tidying up switchable functionality - still more to go! --- ChangeLog | 1 + README_BuildProcess.md | 9 +++++++- src/jsparse.c | 48 ++++++++++++++++++++++++++++++++---------- src/jsparse.h | 5 ++++- src/jsutils.h | 7 +++--- src/jsvar.c | 8 +++---- src/jsvar.h | 6 ++---- src/jswrap_object.c | 4 ++-- 8 files changed, 61 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 98ab19ef91..80f7670bbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,7 @@ Added Object.values/Object.entries (#1302) Added block scoping for let and const (#971) Honour non-writable const vars (fix #971) + Remove Line Numbers from 'save on flash' builds 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/README_BuildProcess.md b/README_BuildProcess.md index 808c101612..c59289bbda 100644 --- a/README_BuildProcess.md +++ b/README_BuildProcess.md @@ -111,7 +111,6 @@ These contain: This is a partial list of definitions that can be added in a `BOARD.py` file's `info.build.makefile` array, eg: `'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"Puck.js"\''` * `SAVE_ON_FLASH` - Remove some features (like any ES6 support) to target devices with ~128kB Flash -* `SAVE_ON_FLASH_MATH` - Remove some less-used Maths functions that use a bunch of Flash memory * `SAVE_ON_FLASH_EXTREME` - Pull out as many features as possible to target devices with ~128kB Flash that also want things like Filesystem support * `BLUETOOTH_NAME_PREFIX="..."` - Make the Bluetooth LE device's name `BLUETOOTH_NAME_PREFIX` followed by the last 2 bytes of the MAC address. * `BLUETOOTH_ADVERTISING_INTERVAL=375` - set the default Bluetooth advertising interval (default 375) @@ -136,7 +135,15 @@ This is a partial list of definitions that can be added in a `BOARD.py` file's ` * `ESPR_NO_LOADING_SCREEN` - Bangle.js, don't show a 'loading' screen when loading a new app * `ESPR_BOOTLOADER_SPIFLASH` - Allow bootloader to flash direct from a file in SPI flash storage * `ESPR_BANGLE_UNISTROKE` - Build in 'unistroke' touch gesture recognition + +These are set automatically when `SAVE_ON_FLASH` is set (see `jsutils.h`) + +* `SAVE_ON_FLASH_MATH` - Remove some less-used Maths functions that use a bunch of Flash memory +* `ESPR_NO_GET_SET` - No Getter/setter functionality +* `ESPR_NO_OBJECT_METHODS` - No methods in objects like `{method() { ... }}` * `ESPR_NO_LINE_NUMBERS` - disable storing and reporting of Line Numbers. Usually these take 1 var per function, but if we're executing a function from flash we can just work it out from the file when needed +* `ESPR_NO_LET_SCOPING` - don't create scopes for `let` (treat it like `var`, which was the 2v13 and earlier behaviour) + ### chip diff --git a/src/jsparse.c b/src/jsparse.c index 039074fa42..f2add51f83 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -760,11 +760,13 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t } // add the function's execute space to the symbol table so we can recurse if (jspeiAddScope(functionRoot)) { +#ifndef ESPR_NO_LET_SCOPING JsVar *oldBaseScope = execInfo.baseScope; execInfo.baseScope = functionRoot; /* Adding scope may have failed - we may have descended too deep - so be sure * not to pull somebody else's scope off */ +#endif JsVar *oldThisVar = execInfo.thisVar; if (thisVar) @@ -870,9 +872,10 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t /* Return to old 'this' var. No need to unlock as we never locked before */ if (execInfo.thisVar) jsvUnRef(execInfo.thisVar); execInfo.thisVar = oldThisVar; - +#ifndef ESPR_NO_LET_SCOPING jspeiRemoveScope(); execInfo.baseScope = oldBaseScope; +#endif } // Unlock scopes and restore old ones @@ -1264,16 +1267,12 @@ NO_INLINE JsVar *jspeFactorObject() { } else if ( lex->tk==LEX_STR || lex->tk==LEX_FLOAT || - lex->tk==LEX_INT || - lex->tk==LEX_R_TRUE || - lex->tk==LEX_R_FALSE || - lex->tk==LEX_R_NULL || - lex->tk==LEX_R_UNDEFINED) { + lex->tk==LEX_INT) { varName = jspeFactor(); } else { JSP_MATCH_WITH_RETURN(LEX_ID, contents); } -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET if (lex->tk==LEX_ID && jsvIsString(varName)) { bool isGetter = jsvIsStringEqual(varName, "get"); bool isSetter = jsvIsStringEqual(varName, "set"); @@ -1287,13 +1286,16 @@ NO_INLINE JsVar *jspeFactorObject() { } } else #endif +#ifndef ESPR_NO_OBJECT_METHODS if (lex->tk == '(') { JsVar *contentsName = jsvFindChildFromVar(contents, varName, true); if (contentsName) { JsVar *method = jspeFunctionDefinition(false); jsvUnLock2(jsvSetValueOfName(contentsName, method), method); } - } else { + } else +#endif + { JSP_MATCH_WITH_CLEANUP_AND_RETURN(':', jsvUnLock(varName), contents); if (JSP_SHOULD_EXECUTE) { varName = jsvAsArrayIndexAndUnLock(varName); @@ -1597,7 +1599,7 @@ NO_INLINE JsVar *jspeClassDefinition(bool parseNamedClass) { JsVar *funcName = jslGetTokenValueAsVar(); JSP_MATCH_WITH_CLEANUP_AND_RETURN(LEX_ID,jsvUnLock4(funcName,classFunction,classInternalName,classPrototype),0); -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET bool isGetter = false, isSetter = false; if (lex->tk==LEX_ID) { isGetter = jsvIsStringEqual(funcName, "get"); @@ -1614,7 +1616,7 @@ NO_INLINE JsVar *jspeClassDefinition(bool parseNamedClass) { JsVar *obj = isStatic ? classFunction : classPrototype; if (jsvIsStringEqual(funcName, "constructor")) { jswrap_function_replaceWith(classFunction, method); -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET } else if (isGetter || isSetter) { jsvAddGetterOrSetter(obj, funcName, isGetter, method); #endif @@ -2138,9 +2140,11 @@ NO_INLINE void jspeSkipBlock() { /** Parse a block `{ ... }` but assume brackets are already parsed */ NO_INLINE void jspeBlockNoBrackets() { +#ifndef ESPR_NO_LET_SCOPING execInfo.blockCount++; JsVar *oldBlockScope = execInfo.blockScope; execInfo.blockScope = 0; +#endif if (JSP_SHOULD_EXECUTE) { while (lex->tk && lex->tk!='}') { JsVar *a = jspeStatement(); @@ -2167,6 +2171,7 @@ NO_INLINE void jspeBlockNoBrackets() { } else { jspeSkipBlock(); } +#ifndef ESPR_NO_LET_SCOPING // If we had a block scope defined, for LET/CONST, remove it if (execInfo.blockScope) { jspeiRemoveScope(); @@ -2175,6 +2180,7 @@ NO_INLINE void jspeBlockNoBrackets() { } execInfo.blockScope = oldBlockScope; execInfo.blockCount--; +#endif } /** Parse a block `{ ... }` */ @@ -2214,8 +2220,10 @@ NO_INLINE JsVar *jspeStatementVar() { * hand side. Maybe just have a flag called can_create_var that we * set and then we parse as if we're doing a normal equals.*/ assert(lex->tk==LEX_R_VAR || lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST); +#ifndef ESPR_NO_LET_SCOPING // LET and CONST are block scoped *except* when we're not in a block! bool isBlockScoped = (lex->tk==LEX_R_LET || lex->tk==LEX_R_CONST) && execInfo.blockCount; +#endif bool isConstant = lex->tk==LEX_R_CONST; @@ -2225,6 +2233,7 @@ NO_INLINE JsVar *jspeStatementVar() { JsVar *a = 0; if (JSP_SHOULD_EXECUTE) { char *name = jslGetTokenValueAsString(); +#ifndef ESPR_NO_LET_SCOPING if (isBlockScoped) { if (!execInfo.blockScope) { execInfo.blockScope = jsvNewObject(); @@ -2234,6 +2243,11 @@ NO_INLINE JsVar *jspeStatementVar() { } else { a = jsvFindChildFromString(execInfo.baseScope, name, true); } +#else + JsVar *scope = jspeiGetTopScope(); + a = jsvFindChildFromString(scope, name, true); + jsvUnLock(scope); +#endif if (!a) { // out of memory jspSetError(false); return lastDefined; @@ -2785,7 +2799,13 @@ NO_INLINE JsVar *jspeStatementFunctionDecl(bool isClass) { if (actuallyCreateFunction) { // find a function with the same name (or make one) // OPT: can Find* use just a JsVar that is a 'name'? +#ifndef ESPR_NO_LET_SCOPING JsVar *existingName = jsvFindChildFromVar(execInfo.baseScope, funcName, true); +#else + JsVar *scope = jspeiGetTopScope(); + JsVar *existingName = jsvFindChildFromVar(scope, funcName, true); + jsvUnLock(scope); +#endif JsVar *existingFunc = jsvSkipName(existingName); if (jsvIsFunction(existingFunc)) { // 'proper' replace, that keeps the original function var and swaps the children @@ -3012,16 +3032,20 @@ void jspSoftInit() { // Root now has a lock and a ref execInfo.hiddenRoot = jsvObjectGetChild(execInfo.root, JS_HIDDEN_CHAR_STR, JSV_OBJECT); execInfo.execute = EXEC_YES; - execInfo.baseScope = execInfo.root; execInfo.scopesVar = 0; +#ifndef ESPR_NO_LET_SCOPING + execInfo.baseScope = execInfo.root; execInfo.blockScope = 0; execInfo.blockCount = 0; +#endif } void jspSoftKill() { +#ifndef ESPR_NO_LET_SCOPING assert(execInfo.baseScope==execInfo.root); assert(execInfo.blockScope==0); assert(execInfo.blockCount==0); +#endif jsvUnLock(execInfo.scopesVar); execInfo.scopesVar = 0; jsvUnLock(execInfo.hiddenRoot); @@ -3082,7 +3106,9 @@ JsVar *jspEvaluateVar(JsVar *str, JsVar *scope, uint16_t lineNumberOffset) { execInfo.scopesVar = 0; if (scope!=execInfo.root) { jspeiAddScope(scope); // it's searched by default anyway +#ifndef ESPR_NO_LET_SCOPING execInfo.baseScope = scope; // this gets replaces after with execInfo = oldExecInfo +#endif } } diff --git a/src/jsparse.h b/src/jsparse.h index c3e4663fdd..5a7e1122aa 100644 --- a/src/jsparse.h +++ b/src/jsparse.h @@ -136,15 +136,18 @@ typedef struct { /// JsVar array of all execution scopes (`root` is not included) JsVar *scopesVar; +#ifndef ESPR_NO_LET_SCOPING /// This is the base scope of execution - `root`, or the execution scope of the function. Scopes added for let/const are not included JsVar *baseScope; /// IF nonzero, this the scope of the current block (which gets added when 'let/const' is used in a block) JsVar *blockScope; + /// how many blocks '{}' deep are we? + uint8_t blockCount; +#endif /// Value of 'this' reserved word JsVar *thisVar; volatile JsExecFlags execute; //!< Should we be executing, do we have errors, etc - uint8_t blockCount; //!< how many blocks '{}' deep are we? } JsExecInfo; /* Info about execution when Parsing - this saves passing it on the stack diff --git a/src/jsutils.h b/src/jsutils.h index 17ab5c9c6c..094dc29e1c 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -39,9 +39,10 @@ #ifdef SAVE_ON_FLASH #define SAVE_ON_FLASH_MATH 1 -#ifndef BLUETOOTH -#define NO_DATAVIEW -#endif +#define ESPR_NO_OBJECT_METHODS 1 +#define ESPR_NO_GET_SET 1 +#define ESPR_NO_LINE_NUMBERS 1 +#define ESPR_NO_LET_SCOPING 1 #endif #ifndef alloca diff --git a/src/jsvar.c b/src/jsvar.c index 128cf4843b..34482680c7 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -127,7 +127,7 @@ bool jsvIsNameIntBool(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)== bool jsvIsNewChild(const JsVar *v) { return jsvIsName(v) && jsvGetNextSibling(v) && jsvGetNextSibling(v)==jsvGetPrevSibling(v); } /// Returns true if v is a getter/setter bool jsvIsGetterOrSetter(const JsVar *v) { -#ifdef SAVE_ON_FLASH +#ifdef ESPR_NO_GET_SET return false; #else return v && (v->flags&JSV_VARTYPEMASK)==JSV_GET_SET; @@ -1989,7 +1989,7 @@ JsVarFloat jsvGetFloatAndUnLock(JsVar *v) { return _jsvGetFloatAndUnLock(v); } bool jsvGetBoolAndUnLock(JsVar *v) { return _jsvGetBoolAndUnLock(v); } -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET // Executes the given getter, or if there are problems returns undefined JsVar *jsvExecuteGetter(JsVar *parent, JsVar *getset) { assert(jsvIsGetterOrSetter(getset)); @@ -2060,7 +2060,7 @@ void jsvReplaceWith(JsVar *dst, JsVar *src) { jsExceptionHere(JSET_TYPEERROR, "Assignment to a constant"); return; } -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET JsVar *v = jsvGetValueOfName(dst); if (jsvIsGetterOrSetter(v)) { JsVar *parent = jsvIsNewChild(dst)?jsvLock(jsvGetNextSibling(dst)):0; @@ -4195,7 +4195,6 @@ JsVar *jsvNewTypedArray(JsVarDataArrayBufferViewType type, JsVarInt length) { return array; } -#ifndef NO_DATAVIEW JsVar *jsvNewDataViewWithData(JsVarInt length, unsigned char *data) { JsVar *buf = jswrap_arraybuffer_constructor(length); if (!buf) return 0; @@ -4213,7 +4212,6 @@ JsVar *jsvNewDataViewWithData(JsVarInt length, unsigned char *data) { jsvUnLock(buf); return view; } -#endif JsVar *jsvNewArrayBufferWithPtr(unsigned int length, char **ptr) { assert(ptr); diff --git a/src/jsvar.h b/src/jsvar.h index d22337e46a..dc37b3c862 100644 --- a/src/jsvar.h +++ b/src/jsvar.h @@ -39,7 +39,7 @@ typedef enum { JSV_ARRAY, ///< A JavaScript Array Buffer - Implemented just like a String at the moment JSV_ARRAYBUFFER, ///< An arraybuffer (see varData.arraybuffer) JSV_OBJECT, -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET JSV_GET_SET, ///< Getter/setter (an object with get/set fields) #endif JSV_FUNCTION, @@ -516,7 +516,7 @@ JsVarFloat jsvGetFloatAndUnLock(JsVar *v); bool jsvGetBoolAndUnLock(JsVar *v); long long jsvGetLongIntegerAndUnLock(JsVar *v); -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET // Executes the given getter, or if there are problems returns undefined JsVar *jsvExecuteGetter(JsVar *parent, JsVar *getset); // Executes the given setter @@ -731,10 +731,8 @@ bool jsvIsInstanceOf(JsVar *var, const char *constructorName); /// Create a new typed array of the given type and length JsVar *jsvNewTypedArray(JsVarDataArrayBufferViewType type, JsVarInt length); -#ifndef NO_DATAVIEW /// Create a new DataView of the given length (in elements), and fill it with the given data (if set) JsVar *jsvNewDataViewWithData(JsVarInt length, unsigned char *data); -#endif /** Create a new arraybuffer of the given type and length, also return a pointer * to the contiguous memory area containing it. Returns 0 if it was unable to diff --git a/src/jswrap_object.c b/src/jswrap_object.c index a7f70ccafa..8b13b30bde 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -415,7 +415,7 @@ JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name) { jsvObjectSetChildAndUnLock(obj, "writable", jsvNewFromBool(!jsvIsConstant(varName))); jsvObjectSetChildAndUnLock(obj, "enumerable", jsvNewFromBool(!checkerFunction || !checkerFunction(varName))); jsvObjectSetChildAndUnLock(obj, "configurable", jsvNewFromBool(!isBuiltIn)); -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET JsVar *getset = jsvGetValueOfName(varName); if (jsvIsGetterOrSetter(getset)) { jsvObjectSetChildAndUnLock(obj, "get", jsvObjectGetChild(getset,"get",0)); @@ -423,7 +423,7 @@ JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name) { } else { #endif jsvObjectSetChildAndUnLock(obj, "value", jsvSkipName(varName)); -#ifndef SAVE_ON_FLASH +#ifndef ESPR_NO_GET_SET } jsvUnLock(getset); #endif From 5b4068072bd66720814606f4a444c28fca2de9e0 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 06:52:36 +0200 Subject: [PATCH 0089/1183] Just don't include the numeric separator in the numeric token --- src/jslex.c | 16 +++++++++++----- src/jsutils.c | 44 ++++++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/jslex.c b/src/jslex.c index daf3289562..b61ae5b841 100644 --- a/src/jslex.c +++ b/src/jslex.c @@ -543,7 +543,7 @@ void jslGetNextToken() { } lex->tk = LEX_INT; while (isNumeric(lex->currCh) || (!canBeFloating && isHexadecimal(lex->currCh)) || lex->currCh=='_') { - jslTokenAppendChar(lex->currCh); + if (lex->currCh != '_') jslTokenAppendChar(lex->currCh); jslGetNextCh(); } if (canBeFloating && lex->currCh=='.') { @@ -555,17 +555,23 @@ void jslGetNextToken() { // parse fractional part if (lex->tk == LEX_FLOAT) { while (isNumeric(lex->currCh) || lex->currCh=='_') { - jslTokenAppendChar(lex->currCh); + if (lex->currCh != '_') jslTokenAppendChar(lex->currCh); jslGetNextCh(); } } // do fancy e-style floating point if (canBeFloating && (lex->currCh=='e'||lex->currCh=='E')) { lex->tk = LEX_FLOAT; - jslTokenAppendChar(lex->currCh); jslGetNextCh(); - if (lex->currCh=='-' || lex->currCh=='+') { jslTokenAppendChar(lex->currCh); jslGetNextCh(); } + jslTokenAppendChar(lex->currCh); + jslGetNextCh(); + if (lex->currCh=='-' || lex->currCh=='+') + { + jslTokenAppendChar(lex->currCh); + jslGetNextCh(); + } while (isNumeric(lex->currCh) || lex->currCh=='_') { - jslTokenAppendChar(lex->currCh); jslGetNextCh(); + if (lex->currCh != '_') jslTokenAppendChar(lex->currCh); + jslGetNextCh(); } } } break; diff --git a/src/jsutils.c b/src/jsutils.c index 3cd6473fef..abba121947 100644 --- a/src/jsutils.c +++ b/src/jsutils.c @@ -185,12 +185,10 @@ long long stringToIntWithRadix(const char *s, if (!radix) return 0; while (*s) { - if (*s != '_') { - int digit = chtod(*s); - if (digit<0 || digit>=radix) - break; - v = v*radix + digit; - } + int digit = chtod(*s); + if (digit<0 || digit>=radix) + break; + v = v*radix + digit; s++; } @@ -526,12 +524,10 @@ JsVarFloat stringToFloatWithRadix( // handle integer part while (*s) { - if (*s != '_') { - int digit = chtod(*s); - if (digit<0 || digit>=radix) - break; - v = (v*radix) + digit; - } + int digit = chtod(*s); + if (digit<0 || digit>=radix) + break; + v = (v*radix) + digit; s++; } @@ -541,12 +537,10 @@ JsVarFloat stringToFloatWithRadix( s++; // skip . while (*s) { - if (*s != '_') { - if (*s >= '0' && *s <= '9') - v += mul*(*s - '0'); - else break; - mul /= 10; - } + if (*s >= '0' && *s <= '9') + v += mul*(*s - '0'); + else break; + mul /= 10; s++; } } @@ -561,11 +555,9 @@ JsVarFloat stringToFloatWithRadix( } int e = 0; while (*s) { - if (*s != '_') { - if (*s >= '0' && *s <= '9') - e = (e*10) + (*s - '0'); - else break; - } + if (*s >= '0' && *s <= '9') + e = (e*10) + (*s - '0'); + else break; s++; } if (isENegated) e=-e; @@ -692,7 +684,7 @@ void ftoa_bounded_extra(JsVarFloat val,char *str, size_t len, int radix, int fra int v = (int)(val+((fractionalDigits==1) ? 0.5 : 0.00000001) ); val = (val-v)*radix; if (v==radix) v=radix-1; - if (!hasPt) { + if (!hasPt) { hasPt = true; if (--len <= 0) { *str=0; return; } // bounds check *(str++)='.'; @@ -930,12 +922,12 @@ size_t jsuGetFreeStack() { //Early entries are in higher memory locations. //Later entries are in lower memory locations. - + uint32_t stackPos = (uint32_t)&ptr; uint32_t stackStart = (uint32_t)espruino_stackHighPtr - ESP_STACK_SIZE; if (stackPos < stackStart) return 0; // should never happen, but just in case of overflow! - + return stackPos - stackStart; #else // stack depth seems pretty platform-specific :( Default to a value that disables it From 27e1703fc9da19bed2a4ce8163b5b6ba699f42b9 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 07:35:39 +0200 Subject: [PATCH 0090/1183] Implemented property shorthand As wished for in https://github.com/espruino/Espruino/issues/1302#issuecomment-389628601 --- README_BuildProcess.md | 3 ++- src/jsparse.c | 18 ++++++++++++++++++ src/jsutils.h | 15 ++++++++------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/README_BuildProcess.md b/README_BuildProcess.md index c59289bbda..04561ea177 100644 --- a/README_BuildProcess.md +++ b/README_BuildProcess.md @@ -141,7 +141,8 @@ These are set automatically when `SAVE_ON_FLASH` is set (see `jsutils.h`) * `SAVE_ON_FLASH_MATH` - Remove some less-used Maths functions that use a bunch of Flash memory * `ESPR_NO_GET_SET` - No Getter/setter functionality * `ESPR_NO_OBJECT_METHODS` - No methods in objects like `{method() { ... }}` -* `ESPR_NO_LINE_NUMBERS` - disable storing and reporting of Line Numbers. Usually these take 1 var per function, but if we're executing a function from flash we can just work it out from the file when needed +* `ESPR_NO_PROPERTY_SHORTHAND` - No property shorthand in objects like `{a}` +* `ESPR_NO_LINE_NUMBERS` - disable storing and reporting of Line Numbers. Usually these take 1 var per function, but if we're executing a function from flash we can just work it out from the file when needed * `ESPR_NO_LET_SCOPING` - don't create scopes for `let` (treat it like `var`, which was the 2v13 and earlier behaviour) diff --git a/src/jsparse.c b/src/jsparse.c index f2add51f83..32ab3bf1ca 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1259,8 +1259,12 @@ NO_INLINE JsVar *jspeFactorObject() { JSP_MATCH_WITH_RETURN('{', contents); while (!JSP_SHOULDNT_PARSE && lex->tk != '}') { JsVar *varName = 0; +#ifndef ESPR_NO_PROPERTY_SHORTHAND + bool isIdentifier = 0; +#endif // we only allow strings or IDs on the left hand side of an initialisation if (jslIsIDOrReservedWord()) { + isIdentifier = lex->tk == LEX_ID; if (JSP_SHOULD_EXECUTE) varName = jslGetTokenValueAsVar(); jslGetNextToken(); // skip over current token @@ -1294,6 +1298,20 @@ NO_INLINE JsVar *jspeFactorObject() { jsvUnLock2(jsvSetValueOfName(contentsName, method), method); } } else +#endif +#ifndef ESPR_NO_PROPERTY_SHORTHAND + if (isIdentifier && (lex->tk == ',' || lex->tk == '}') && jsvIsString(varName)) { + if (JSP_SHOULD_EXECUTE) { + varName = jsvAsArrayIndexAndUnLock(varName); + JsVar *contentsName = jsvFindChildFromVar(contents, varName, true); + if (contentsName) { + char buf[JSLEX_MAX_TOKEN_LENGTH]; + jsvGetString(varName, buf, JSLEX_MAX_TOKEN_LENGTH); + JsVar *value = jsvSkipNameAndUnLock(jspGetNamedVariable(buf)); // value can be 0 (could be undefined!) + jsvUnLock2(jsvSetValueOfName(contentsName, value), value); + } + } + } else #endif { JSP_MATCH_WITH_CLEANUP_AND_RETURN(':', jsvUnLock(varName), contents); diff --git a/src/jsutils.h b/src/jsutils.h index 094dc29e1c..9cb8d733c1 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -40,6 +40,7 @@ #ifdef SAVE_ON_FLASH #define SAVE_ON_FLASH_MATH 1 #define ESPR_NO_OBJECT_METHODS 1 +#define ESPR_NO_PROPERTY_SHORTHAND 1 #define ESPR_NO_GET_SET 1 #define ESPR_NO_LINE_NUMBERS 1 #define ESPR_NO_LET_SCOPING 1 @@ -409,7 +410,7 @@ typedef int64_t JsSysTime; #define UNALIGNED_UINT16(addr) ((((uint16_t)*((uint8_t*)(addr)+1)) << 8) | (*(uint8_t*)(addr))) #else #define UNALIGNED_UINT16(addr) (*(uint16_t*)addr) -#endif +#endif bool isWhitespace(char ch); bool isNumeric(char ch); @@ -458,15 +459,15 @@ void jsAssertFail(const char *file, int line, const char *expr); /* #if defined(DEBUG) || __FILE__ == DEBUG_FILE - #define jsDebug(dbg_type, format, ...) jsiConsolePrintf("[" __FILE__ "]:" format, ## __VA_ARGS__) - #else - #define jsDebug(dbg_type, format, ...) do { } while(0) + #define jsDebug(dbg_type, format, ...) jsiConsolePrintf("[" __FILE__ "]:" format, ## __VA_ARGS__) + #else + #define jsDebug(dbg_type, format, ...) do { } while(0) #endif */ #if (defined DEBUG ) || ( defined __FILE__ == DEBUG_FILE) - #define jsDebug(dbg_type, format, ...) jsiConsolePrintf("[" __FILE__ "]:" format, ## __VA_ARGS__) -#else - #define jsDebug(dbg_type, format, ...) do { } while(0) + #define jsDebug(dbg_type, format, ...) jsiConsolePrintf("[" __FILE__ "]:" format, ## __VA_ARGS__) +#else + #define jsDebug(dbg_type, format, ...) do { } while(0) #endif #ifndef USE_FLASH_MEMORY From d6a5bfa785cd4c6b6614d817aa65881b6a70a33d Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 07:40:42 +0200 Subject: [PATCH 0091/1183] Fixed missing if --- src/jsparse.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/jsparse.c b/src/jsparse.c index 32ab3bf1ca..a72fe4b9c2 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1264,7 +1264,9 @@ NO_INLINE JsVar *jspeFactorObject() { #endif // we only allow strings or IDs on the left hand side of an initialisation if (jslIsIDOrReservedWord()) { +#ifndef ESPR_NO_PROPERTY_SHORTHAND isIdentifier = lex->tk == LEX_ID; +#endif if (JSP_SHOULD_EXECUTE) varName = jslGetTokenValueAsVar(); jslGetNextToken(); // skip over current token From 4fecc86cd5121d57835248c6762e5d42d9d10e25 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 07:43:15 +0200 Subject: [PATCH 0092/1183] Test for property shorthand --- tests/test_object_property_shorthand.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tests/test_object_property_shorthand.js diff --git a/tests/test_object_property_shorthand.js b/tests/test_object_property_shorthand.js new file mode 100644 index 0000000000..a60b0b90f0 --- /dev/null +++ b/tests/test_object_property_shorthand.js @@ -0,0 +1,6 @@ +// test for property shorthand + +var a = 5; +var obj = {a}; + +result = obj.a === a; \ No newline at end of file From b41a8d807ac501e2b08baf63456ab21a4e25d6a1 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 08:30:50 +0200 Subject: [PATCH 0093/1183] Parse the nullish coalescing operator --- src/jslex.c | 29 ++++++++++++++++++----------- src/jslex.h | 1 + src/jsparse.c | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/jslex.c b/src/jslex.c index 103169bfa7..c917bd395f 100644 --- a/src/jslex.c +++ b/src/jslex.c @@ -112,6 +112,7 @@ typedef enum { JSLJT_NUMBER, JSLJT_STRING, + JSJLT_QUESTION, JSLJT_EXCLAMATION, JSLJT_PLUS, JSLJT_MINUS, @@ -196,7 +197,7 @@ const jslJumpTableEnum jslJumpTable[jslJumpTableEnd+2] = { JSLJT_LESSTHAN, // < JSLJT_EQUAL, // = JSLJT_GREATERTHAN, // > - JSLJT_SINGLE_CHAR, // ? + JSJLT_QUESTION, // ? // 64 JSLJT_SINGLE_CHAR, // @ JSLJT_ID, // A @@ -580,47 +581,52 @@ void jslGetNextToken() { } } break; case JSLJT_PLUS: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // += lex->tk = LEX_PLUSEQUAL; jslGetNextCh(); - } else if (lex->currCh=='+') { + } else if (lex->currCh=='+') { // ++ lex->tk = LEX_PLUSPLUS; jslGetNextCh(); } break; case JSLJT_MINUS: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // -= lex->tk = LEX_MINUSEQUAL; jslGetNextCh(); - } else if (lex->currCh=='-') { + } else if (lex->currCh=='-') { // -- lex->tk = LEX_MINUSMINUS; jslGetNextCh(); } break; case JSLJT_AND: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // &= lex->tk = LEX_ANDEQUAL; jslGetNextCh(); - } else if (lex->currCh=='&') { + } else if (lex->currCh=='&') { // && lex->tk = LEX_ANDAND; jslGetNextCh(); } break; case JSLJT_OR: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // |= lex->tk = LEX_OREQUAL; jslGetNextCh(); - } else if (lex->currCh=='|') { + } else if (lex->currCh=='|') { // || lex->tk = LEX_OROR; jslGetNextCh(); } break; case JSLJT_TOPHAT: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // ^= lex->tk = LEX_XOREQUAL; jslGetNextCh(); } break; case JSLJT_STAR: jslSingleChar(); - if (lex->currCh=='=') { + if (lex->currCh=='=') { // *= lex->tk = LEX_MULEQUAL; jslGetNextCh(); } break; + case JSJLT_QUESTION: jslSingleChar(); + if(lex->currCh=='?'){ // ?? + lex->tk = LEX_NULLISH; + jslGetNextCh(); + } break; case JSLJT_FORWARDSLASH: // yay! JS is so awesome. if (lastToken==LEX_EOF || @@ -811,6 +817,7 @@ const char* jslReservedWordAsString(int token) { /* LEX_ANDAND : */ "&&\0" /* LEX_OREQUAL : */ "|=\0" /* LEX_OROR : */ "||\0" + /* LEX_NULLISH : */ "??\0" /* LEX_XOREQUAL : */ "^=\0" /* LEX_ARROW_FUNCTION */ "=>\0" diff --git a/src/jslex.h b/src/jslex.h index 15e1d7a460..62c5080f8a 100644 --- a/src/jslex.h +++ b/src/jslex.h @@ -56,6 +56,7 @@ _LEX_OPERATOR_START, LEX_ANDAND, LEX_OREQUAL, LEX_OROR, + LEX_NULLISH, LEX_XOREQUAL, // Note: single character operators are represented by themselves _LEX_OPERATOR_END = LEX_XOREQUAL, diff --git a/src/jsparse.c b/src/jsparse.c index f2add51f83..03ef22315c 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1877,6 +1877,7 @@ NO_INLINE JsVar *jspeUnaryExpression() { // Get the precedence of a BinaryExpression - or return 0 if not one unsigned int jspeGetBinaryExpressionPrecedence(int op) { switch (op) { + case LEX_NULLISH: case LEX_OROR: return 1; break; case LEX_ANDAND: return 2; break; case '|' : return 3; break; From 6f68fb45cf1772af2cc8853f8b71134eef69bb96 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 25 May 2022 09:27:16 +0200 Subject: [PATCH 0094/1183] Interpret the nullish coalescing operator in binary expressions --- src/jsparse.c | 14 ++++++++++++++ tests/test_nullish.js | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/test_nullish.js diff --git a/src/jsparse.c b/src/jsparse.c index 03ef22315c..6d121b90ff 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1935,6 +1935,20 @@ NO_INLINE JsVar *__jspeBinaryExpression(JsVar *a, unsigned int lastPrecedence) { jsvUnLock(a); a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } + } else if (op==LEX_NULLISH){ + JsVar* value = jsvSkipName(a); + if (jsvIsNull(value) || jsvIsUndefined(value)) { + // use second argument (B) + if(!jsvIsUndefined(value)) jsvUnLock(value); + jsvUnLock(a); + a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); + } else { + jsvUnLock(value); + // use first argument (A) + JSP_SAVE_EXECUTE(); + jspSetNoExecute(); + jsvUnLock(__jspeBinaryExpression(jspeUnaryExpression(),precedence)); + JSP_RESTORE_EXECUTE();} } else { // else it's a more 'normal' logical expression - just use Maths JsVar *b = __jspeBinaryExpression(jspeUnaryExpression(),precedence); if (JSP_SHOULD_EXECUTE) { diff --git a/tests/test_nullish.js b/tests/test_nullish.js new file mode 100644 index 0000000000..8ae562cac1 --- /dev/null +++ b/tests/test_nullish.js @@ -0,0 +1,21 @@ +// test the nullish coalescing operator + +result = true; + +result &= null ?? true; +result &= undefined ?? true; + +var a = null; +result &= a ?? true; + +var b = undefined; +result &= b ?? true; + +var c = true; +result &= c ?? true; + +var d = 0; +result &= (d ?? 1) === 0; + +var e = false; +result &= (e ?? 1) === false; \ No newline at end of file From c827eba18862cb675708823692e8b585172fe3df Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 25 May 2022 08:35:07 +0100 Subject: [PATCH 0095/1183] changelog --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 80f7670bbc..83c3417ccd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24,6 +24,7 @@ Added block scoping for let and const (#971) Honour non-writable const vars (fix #971) Remove Line Numbers from 'save on flash' builds + Added Object shorthand, eg. x={a} 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From a816b726ebf786fd074eb8030426d28ef3a75681 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 25 May 2022 08:42:09 +0100 Subject: [PATCH 0096/1183] changelog --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 83c3417ccd..9631cc974f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,7 @@ Honour non-writable const vars (fix #971) Remove Line Numbers from 'save on flash' builds Added Object shorthand, eg. x={a} + Added numeric separator support eg. 12_34 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From aa8167b2477d0e67347f6c9f17971a671b38a1c9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 25 May 2022 09:34:20 +0100 Subject: [PATCH 0097/1183] Tweaks to allow latest PR to work with existing pretokenised code (keep token ordering) --- ChangeLog | 1 + src/jslex.c | 22 +++++++++++----------- src/jslex.h | 31 ++++++++++++++++++++++++++----- tests/test_nullish.js | 9 ++++++++- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9631cc974f..acbe6a787c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,7 @@ Remove Line Numbers from 'save on flash' builds Added Object shorthand, eg. x={a} Added numeric separator support eg. 12_34 + Add Nullish coalescing operator 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jslex.c b/src/jslex.c index 512f44cc07..f9abf40d1e 100644 --- a/src/jslex.c +++ b/src/jslex.c @@ -636,6 +636,7 @@ void jslGetNextToken() { case JSLJT_FORWARDSLASH: // yay! JS is so awesome. if (lastToken==LEX_EOF || + (lastToken>=_LEX_TOKENS_START && lastToken<=_LEX_TOKENS_END) || // any keyword or operator lastToken=='!' || lastToken=='%' || lastToken=='&' || @@ -647,18 +648,13 @@ void jslGetNextToken() { lastToken=='=' || lastToken=='>' || lastToken=='?' || - (lastToken>=_LEX_OPERATOR_START && lastToken<=_LEX_OPERATOR_END) || - (lastToken>=_LEX_R_LIST_START && lastToken<=_LEX_R_LIST_END) || // keywords - lastToken==LEX_R_CASE || - lastToken==LEX_R_NEW || lastToken=='[' || lastToken=='{' || lastToken=='}' || lastToken=='(' || lastToken==',' || lastToken==';' || - lastToken==':' || - lastToken==LEX_ARROW_FUNCTION) { + lastToken==':') { // EOF operator keyword case new [ { } ( , ; : => // phew. We're a regex jslLexRegex(); @@ -800,6 +796,7 @@ void jslFunctionCharAsString(unsigned char ch, char *str, size_t len) { const char* jslReservedWordAsString(int token) { static const char tokenNames[] = + // Operators 1 /* LEX_EQUAL : */ "==\0" /* LEX_TYPEEQUAL : */ "===\0" /* LEX_NEQUAL : */ "!=\0" @@ -823,7 +820,6 @@ const char* jslReservedWordAsString(int token) { /* LEX_ANDAND : */ "&&\0" /* LEX_OREQUAL : */ "|=\0" /* LEX_OROR : */ "||\0" - /* LEX_NULLISH : */ "??\0" /* LEX_XOREQUAL : */ "^=\0" /* LEX_ARROW_FUNCTION */ "=>\0" @@ -861,12 +857,16 @@ const char* jslReservedWordAsString(int token) { /*LEX_R_DEBUGGER : */ "debugger\0" /*LEX_R_CLASS : */ "class\0" /*LEX_R_EXTENDS : */ "extends\0" - /*LEX_R_SUPER : */ "super\0" + /*LEX_R_SUPER : */ "super\0" /*LEX_R_STATIC : */ "static\0" - /*LEX_R_OF : */ "of\0" + /*LEX_R_OF : */ "of\0" + /* padding to be replaced with new reserved words */ "\0\0\0\0\0\0\0\0\0" + + // operators 2 + /* LEX_NULLISH : */ "??\0" ; unsigned int p = 0; - int n = token-_LEX_OPERATOR_START; + int n = token-_LEX_TOKENS_START; while (n>0 && p=_LEX_OPERATOR_START && token<=_LEX_R_LIST_END) { + if (token>=_LEX_TOKENS_START && token<=_LEX_TOKENS_END) { strcpy(str, jslReservedWordAsString(token)); return; } diff --git a/src/jslex.h b/src/jslex.h index 62c5080f8a..37fcd494a3 100644 --- a/src/jslex.h +++ b/src/jslex.h @@ -32,8 +32,24 @@ typedef enum LEX_TYPES { LEX_UNFINISHED_REGEX, // always after LEX_REGEX LEX_UNFINISHED_COMMENT, -_LEX_OPERATOR_START, - LEX_EQUAL = _LEX_OPERATOR_START, + // ------------------------------------------------ + // DO NOT MODIFY THE ORDERING OF THIS LIST. + // + // The Web IDE/Bangle.js App Loader can pretokenise code + // which means they rely on each ID/token mapping to the + // correct number. + // + // Also jslReservedWordAsString needs updating to reflect + // any new symbols/ordering + // + // To ease adding new operators/reserved words we've + // now added the OPERATOR2 list below, as well as some + // padding before it. + // ------------------------------------------------ + +_LEX_TOKENS_START, +_LEX_OPERATOR1_START = _LEX_TOKENS_START, + LEX_EQUAL = _LEX_OPERATOR1_START, LEX_TYPEEQUAL, LEX_NEQUAL, LEX_NTYPEEQUAL, @@ -56,10 +72,9 @@ _LEX_OPERATOR_START, LEX_ANDAND, LEX_OREQUAL, LEX_OROR, - LEX_NULLISH, LEX_XOREQUAL, // Note: single character operators are represented by themselves -_LEX_OPERATOR_END = LEX_XOREQUAL, +_LEX_OPERATOR1_END = LEX_XOREQUAL, LEX_ARROW_FUNCTION, // reserved words @@ -100,7 +115,13 @@ _LEX_R_LIST_START, LEX_R_SUPER, LEX_R_STATIC, LEX_R_OF, -_LEX_R_LIST_END = LEX_R_OF /* always the last entry */ +_LEX_R_LIST_END = LEX_R_OF, /* always the last entry for symbols */ + +_LEX_OPERATOR2_START = _LEX_R_LIST_END+10, // padding for adding new symbols in the future! + LEX_NULLISH = _LEX_OPERATOR2_START, +_LEX_OPERATOR2_END = LEX_NULLISH, + +_LEX_TOKENS_END = _LEX_OPERATOR2_END, /* always the last entry for symbols */ } LEX_TYPES; diff --git a/tests/test_nullish.js b/tests/test_nullish.js index 8ae562cac1..dc67de8179 100644 --- a/tests/test_nullish.js +++ b/tests/test_nullish.js @@ -18,4 +18,11 @@ var d = 0; result &= (d ?? 1) === 0; var e = false; -result &= (e ?? 1) === false; \ No newline at end of file +result &= (e ?? 1) === false; + +// Check token is handled correctly by the internal pretokeniser +E.setFlags({pretokenise:1}) +function a(a) { return a??5 } +print (a.toString()); +result &= a.toString() == "function (a) {return a ?? 5}"; + From f6514fb9059919f4c4949b5b0a92e92b02cd1dfc Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 25 May 2022 10:18:01 +0100 Subject: [PATCH 0098/1183] Switch bare ESP8266 board to using slightly slower (but far more memory efficient trig functions) --- boards/ESP8266_BOARD.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/boards/ESP8266_BOARD.py b/boards/ESP8266_BOARD.py index df35421a95..f9cc4f5773 100644 --- a/boards/ESP8266_BOARD.py +++ b/boards/ESP8266_BOARD.py @@ -28,6 +28,9 @@ #'GRAPHICS', 'CRYPTO', 'NEOPIXEL', + ], + 'makefile' : [ + 'DEFINES+=-DSAVE_ON_FLASH_MATH', ] } }; From 4c799132882804929b0c241f4410344aa4fa0993 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 25 May 2022 14:48:17 +0100 Subject: [PATCH 0099/1183] Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) --- .github/workflows/build.yml | 2 +- ChangeLog | 1 + dist_readme.txt | 6 ++++++ scripts/create_zip.sh | 6 +++++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57c23c05f8..42cf0ab8ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: strategy: # devices to build for matrix: - board: [PUCKJS, PIXLJS, MDBT42Q, BANGLEJS, BANGLEJS2] + board: [PUCKJS, PIXLJS, MDBT42Q, BANGLEJS, BANGLEJS2, PUCKJS_MINIMAL] # try and build for all devices even if one fails fail-fast: false steps: diff --git a/ChangeLog b/ChangeLog index acbe6a787c..3c64c1cc5d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -27,6 +27,7 @@ Added Object shorthand, eg. x={a} Added numeric separator support eg. 12_34 Add Nullish coalescing operator + Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/dist_readme.txt b/dist_readme.txt index 2c6eb7d482..5606c835b1 100644 --- a/dist_readme.txt +++ b/dist_readme.txt @@ -43,6 +43,12 @@ espruino_#v##_wifi.bin espruino_#v##_puckjs.zip - The firmware image for Espruino Puck.js Devices See http://www.espruino.com/Puck.js#firmware-updates for more information + +espruino_#v##_puckjs_minimal.zip + - The firmware image for Espruino Puck.js Devices + Networking, graphics and crypto are removed which frees up roughly 60kB extra + Flash memory which can be used for Storage, bringing the total to 98kB. + See http://www.espruino.com/Puck.js#firmware-updates for more information espruino_#v##_pixljs.zip - The firmware image for Espruino Pixl.js Devices diff --git a/scripts/create_zip.sh b/scripts/create_zip.sh index 962ec61975..d82f66be82 100755 --- a/scripts/create_zip.sh +++ b/scripts/create_zip.sh @@ -44,7 +44,7 @@ echo ------------------------------------------------------ # The following have been removed because it's too hard to keep the build going: # STM32F3DISCOVERY OLIMEXINO_STM32 HYSTM32_32 HYSTM32_28 HYSTM32_24 RAK8211 RAK8212 RUUVITAG THINGY52 RASPBERRYPI # -for BOARDNAME in ESPRUINO_1V3 ESPRUINO_1V3_AT ESPRUINO_1V3_WIZ PICO_1V3 PICO_1V3_CC3000 PICO_1V3_WIZ ESPRUINOWIFI PUCKJS PIXLJS BANGLEJS BANGLEJS2 MDBT42Q NUCLEOF401RE NUCLEOF411RE STM32VLDISCOVERY STM32F4DISCOVERY STM32L496GDISCOVERY MICROBIT1 MICROBIT2 ESP8266_BOARD ESP8266_4MB ESP32 WIO_LTE RAK5010 SMARTIBOT +for BOARDNAME in ESPRUINO_1V3 ESPRUINO_1V3_AT ESPRUINO_1V3_WIZ PICO_1V3 PICO_1V3_CC3000 PICO_1V3_WIZ ESPRUINOWIFI PUCKJS PUCKJS_MINIMAL PIXLJS BANGLEJS BANGLEJS2 MDBT42Q NUCLEOF401RE NUCLEOF411RE STM32VLDISCOVERY STM32F4DISCOVERY STM32L496GDISCOVERY MICROBIT1 MICROBIT2 ESP8266_BOARD ESP8266_4MB ESP32 WIO_LTE RAK5010 SMARTIBOT do echo ------------------------------ echo $BOARDNAME @@ -87,6 +87,10 @@ do ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip EXTRADEFS=DFU_UPDATE_BUILD=1 fi + if [ "$BOARDNAME" == "PUCKJS_MINIMAL" ]; then + ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip + EXTRADEFS=DFU_UPDATE_BUILD=1 + fi if [ "$BOARDNAME" == "PIXLJS" ]; then ESP_BINARY_NAME=`basename $ESP_BINARY_NAME .hex`.zip EXTRADEFS=DFU_UPDATE_BUILD=1 From f60da7dbcdd8a9fe94518c7880ad1f13f5539a4b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 26 May 2022 08:45:28 +0100 Subject: [PATCH 0100/1183] Fix let scoping for FOR loops --- src/jsparse.c | 49 ++++++++++++++++++++++++++------------- tests/test_let_scoping.js | 8 ++++++- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/jsparse.c b/src/jsparse.c index 427d57c40c..e92297cf03 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2173,13 +2173,35 @@ NO_INLINE void jspeSkipBlock() { } } -/** Parse a block `{ ... }` but assume brackets are already parsed */ -NO_INLINE void jspeBlockNoBrackets() { +/// Called when a block starts, ensures that 'let/const' have the correct scoping +NO_INLINE JsVar * jspeBlockStart() { #ifndef ESPR_NO_LET_SCOPING execInfo.blockCount++; JsVar *oldBlockScope = execInfo.blockScope; execInfo.blockScope = 0; + return oldBlockScope; +#else + return 0; +#endif +} + +/// Called when a block ends, ensures that 'let/const' have the correct scoping. Pass in the return value of jspeBlockStart +NO_INLINE void jspeBlockEnd(JsVar *oldBlockScope) { +#ifndef ESPR_NO_LET_SCOPING + // If we had a block scope defined, for LET/CONST, remove it + if (execInfo.blockScope) { + jspeiRemoveScope(); + jsvUnLock(execInfo.blockScope); + execInfo.blockScope = 0; + } + execInfo.blockScope = oldBlockScope; + execInfo.blockCount--; #endif +} + +/** Parse a block `{ ... }` but assume brackets are already parsed */ +NO_INLINE void jspeBlockNoBrackets() { + JsVar *oldBlockScope = jspeBlockStart(); if (JSP_SHOULD_EXECUTE) { while (lex->tk && lex->tk!='}') { JsVar *a = jspeStatement(); @@ -2206,16 +2228,7 @@ NO_INLINE void jspeBlockNoBrackets() { } else { jspeSkipBlock(); } -#ifndef ESPR_NO_LET_SCOPING - // If we had a block scope defined, for LET/CONST, remove it - if (execInfo.blockScope) { - jspeiRemoveScope(); - jsvUnLock(execInfo.blockScope); - execInfo.blockScope = 0; - } - execInfo.blockScope = oldBlockScope; - execInfo.blockCount--; -#endif + jspeBlockEnd(oldBlockScope); } /** Parse a block `{ ... }` */ @@ -2519,6 +2532,7 @@ NO_INLINE JsVar *jspeStatementFor() { JSP_MATCH('('); bool wasInLoop = (execInfo.execute&EXEC_IN_LOOP)!=0; execInfo.execute |= EXEC_FOR_INIT; + JsVar *oldBlockScope = jspeBlockStart(); // initialisation JsVar *forStatement = 0; // we could have 'for (;;)' - so don't munch up our semicolon if that's all we have @@ -2526,6 +2540,7 @@ NO_INLINE JsVar *jspeStatementFor() { forStatement = jspeStatement(); if (jspIsInterrupted()) { jsvUnLock(forStatement); + jspeBlockEnd(oldBlockScope); return 0; } execInfo.execute &= (JsExecFlags)~EXEC_FOR_INIT; @@ -2537,6 +2552,7 @@ NO_INLINE JsVar *jspeStatementFor() { if (JSP_SHOULD_EXECUTE && !jsvIsName(forStatement)) { jsvUnLock(forStatement); jsExceptionHere(JSET_ERROR, "for(a %s b) - 'a' must be a variable name, not %t", isForOf?"of":"in", forStatement); + jspeBlockEnd(oldBlockScope); return 0; } @@ -2545,7 +2561,7 @@ NO_INLINE JsVar *jspeStatementFor() { JslCharPos forBodyStart; jslCharPosFromLex(&forBodyStart); - JSP_MATCH_WITH_CLEANUP_AND_RETURN(')', jsvUnLock2(forStatement, array);jslCharPosFree(&forBodyStart), 0); + JSP_MATCH_WITH_CLEANUP_AND_RETURN(')', jsvUnLock2(forStatement, array);jslCharPosFree(&forBodyStart);jspeBlockEnd(oldBlockScope);, 0); // Simply scan over the loop the first time without executing to figure out where it ends // OPT: we could skip the first parse and actually execute the first time @@ -2639,7 +2655,7 @@ NO_INLINE JsVar *jspeStatementFor() { jsvUnLock(forStatement); JslCharPos forCondStart; jslCharPosFromLex(&forCondStart); - JSP_MATCH_WITH_CLEANUP_AND_RETURN(';',jslCharPosFree(&forCondStart);,0); + JSP_MATCH_WITH_CLEANUP_AND_RETURN(';',jslCharPosFree(&forCondStart);jspeBlockEnd(oldBlockScope);jspeBlockEnd(oldBlockScope);,0); if (lex->tk != ';') { JsVar *cond = jspeExpression(); // condition @@ -2648,7 +2664,7 @@ NO_INLINE JsVar *jspeStatementFor() { } JslCharPos forIterStart; jslCharPosFromLex(&forIterStart); - JSP_MATCH_WITH_CLEANUP_AND_RETURN(';',jslCharPosFree(&forCondStart);jslCharPosFree(&forIterStart);,0); + JSP_MATCH_WITH_CLEANUP_AND_RETURN(';',jslCharPosFree(&forCondStart);jslCharPosFree(&forIterStart);jspeBlockEnd(oldBlockScope);,0); if (lex->tk != ')') { // we could have 'for (;;)' JSP_SAVE_EXECUTE(); jspSetNoExecute(); @@ -2658,7 +2674,7 @@ NO_INLINE JsVar *jspeStatementFor() { JslCharPos forBodyStart; jslSkipWhiteSpace(); jslCharPosFromLex(&forBodyStart); // actual for body - JSP_MATCH_WITH_CLEANUP_AND_RETURN(')',jslCharPosFree(&forCondStart);jslCharPosFree(&forIterStart);jslCharPosFree(&forBodyStart);,0); + JSP_MATCH_WITH_CLEANUP_AND_RETURN(')',jslCharPosFree(&forCondStart);jslCharPosFree(&forIterStart);jslCharPosFree(&forBodyStart);jspeBlockEnd(oldBlockScope);,0); JSP_SAVE_EXECUTE(); if (!loopCond) jspSetNoExecute(); @@ -2716,6 +2732,7 @@ NO_INLINE JsVar *jspeStatementFor() { } #endif } + jspeBlockEnd(oldBlockScope); return 0; } diff --git a/tests/test_let_scoping.js b/tests/test_let_scoping.js index 28a494069b..774b7ee8e6 100644 --- a/tests/test_let_scoping.js +++ b/tests/test_let_scoping.js @@ -37,11 +37,17 @@ function test2() { console.log(x); results.push(x==1); console.log(y); results.push(y==3); console.log(typeof z);results.push("undefined" == typeof z); - } test2(); + +function test3() { + for(let g=0;g<1;g++); + results.push("undefined" == typeof g); +} +test3(); + console.log("Results:",results); result = results.every(r=>r); From b7ebc81b4a80f8c7277211fef86603f146d7d83c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 26 May 2022 11:08:24 +0100 Subject: [PATCH 0101/1183] nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice --- ChangeLog | 1 + libs/bluetooth/jswrap_bluetooth.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3c64c1cc5d..2e4a47c34f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,6 +28,7 @@ Added numeric separator support eg. 12_34 Add Nullish coalescing operator Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) + nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 13ae95be04..fe1353be86 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -1836,7 +1836,6 @@ void jswrap_ble_setScan_cb(JsVar *callback, JsVar *filters, JsVar *adv) { } jsvUnLock(arr); } - jsvUnLock(deviceAddr); if (deviceMatchedFilters) jspExecuteFunction(callback, 0, 1, &device); From 6130edfa3521af41fff3b636872b9edc7f814366 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 26 May 2022 11:12:00 +0100 Subject: [PATCH 0102/1183] update changelog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 2e4a47c34f..b7730ec54b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,7 +28,7 @@ Added numeric separator support eg. 12_34 Add Nullish coalescing operator Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) - nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice + nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice (regression in 2v13) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) From 2645dcb7c7a6853594d3be640384865b3b6707c9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 26 May 2022 13:00:29 +0100 Subject: [PATCH 0103/1183] Allow 'for (const i in [1,2,3])' which failed with 'can't write const' error before --- src/jsparse.c | 4 ++++ tests/test_const.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/test_const.js diff --git a/src/jsparse.c b/src/jsparse.c index e92297cf03..ed33910ccf 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2535,6 +2535,7 @@ NO_INLINE JsVar *jspeStatementFor() { JsVar *oldBlockScope = jspeBlockStart(); // initialisation JsVar *forStatement = 0; + bool startsWithConst = lex->tk==LEX_R_CONST; // we could have 'for (;;)' - so don't munch up our semicolon if that's all we have if (lex->tk != ';') forStatement = jspeStatement(); @@ -2606,8 +2607,11 @@ NO_INLINE JsVar *jspeStatementFor() { assert(jsvGetRefs(iteratorValue)==0); } if (isForOf || iteratorValue) { // could be out of memory + // Now write the value to our iterator assert(!jsvIsName(iteratorValue)); + if (startsWithConst) forStatement->flags &= ~JSV_CONSTANT; // for (const i in [1,2,3]) has to work jsvReplaceWithOrAddToRoot(forStatement, iteratorValue); + if (startsWithConst) forStatement->flags |= JSV_CONSTANT; if (iteratorValue!=loopIndexVar) jsvUnLock(iteratorValue); jslSeekToP(&forBodyStart); diff --git a/tests/test_const.js b/tests/test_const.js new file mode 100644 index 0000000000..33a383bb83 --- /dev/null +++ b/tests/test_const.js @@ -0,0 +1,32 @@ + +var results = []; + +const x = 42; +try { + x = 43; + results.push(false); +} catch (e) { + results.push(true); +} + +const y = 42; +try { + y += 1; + results.push(false); +} catch (e) { + results.push(true); +} + +// Normal FOR loops fail +try { + for (const z=0;z<5;z++); + results.push(false); +} catch (e) { + results.push(true); +} + +// FOR..IN loops are ok +for (const w in [1,2,3]) ; + +print(results); +result = results.every(x=>x); From 1fa2ff00fd92912da07a96057b0b8f383a884ebb Mon Sep 17 00:00:00 2001 From: naveen <172697+naveensrinivasan@users.noreply.github.com> Date: Fri, 27 May 2022 00:32:46 +0000 Subject: [PATCH 0104/1183] chore: Set permissions for GitHub actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 42cf0ab8ef..6999e09372 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ master ] +permissions: + contents: read + jobs: # normal builds From 2cf87398ec5163236374ea3e917023b1fd10f9b0 Mon Sep 17 00:00:00 2001 From: naveen <172697+naveensrinivasan@users.noreply.github.com> Date: Mon, 30 May 2022 01:32:43 +0000 Subject: [PATCH 0105/1183] chore: Included githubactions in the dependabot config This should help with keeping the GitHub actions updated on new releases. This will also help with keeping it secure. Dependabot helps in keeping the supply chain secure https://docs.github.com/en/code-security/dependabot GitHub actions up to date https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot https://github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..203f3c889b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From acd6f7741e2a7120d207cc1a701a979c3bcbfbd8 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Mon, 30 May 2022 07:50:30 +0200 Subject: [PATCH 0106/1183] accessing properties from null should throw an error --- src/jsparse.c | 8 ++++---- src/jsvar.c | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/jsparse.c b/src/jsparse.c index ed33910ccf..736de411ed 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1082,7 +1082,7 @@ NO_INLINE JsVar *jspeFactorMember(JsVar *a, JsVar **parentResult) { if (aVar) child = jspGetNamedField(aVar, name, true); if (!child) { - if (!jsvIsUndefined(aVar)) { + if (!jsvIsNullish(aVar)) { // if no child found, create a pointer to where it could be // as we don't want to allocate it until it's written JsVar *nameVar = jslGetTokenValueAsVar(); @@ -1090,7 +1090,7 @@ NO_INLINE JsVar *jspeFactorMember(JsVar *a, JsVar **parentResult) { jsvUnLock(nameVar); } else { // could have been a string... - jsExceptionHere(JSET_ERROR, "Cannot read property '%s' of undefined", name); + jsExceptionHere(JSET_ERROR, "Cannot read property '%s' of %s", name, jsvIsUndefined(aVar) ? "undefined" : "null"); } } jsvUnLock(parent); @@ -1957,9 +1957,9 @@ NO_INLINE JsVar *__jspeBinaryExpression(JsVar *a, unsigned int lastPrecedence) { } } else if (op==LEX_NULLISH){ JsVar* value = jsvSkipName(a); - if (jsvIsNull(value) || jsvIsUndefined(value)) { + if (jsvIsNullish(value)) { // use second argument (B) - if(!jsvIsUndefined(value)) jsvUnLock(value); + if (!jsvIsUndefined(value)) jsvUnLock(value); jsvUnLock(a); a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } else { diff --git a/src/jsvar.c b/src/jsvar.c index 34482680c7..2e34907346 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -115,6 +115,7 @@ bool jsvIsArrayBufferName(const JsVar *v) { return v && (v->flags&(JSV_VARTYPEMA bool jsvIsNativeFunction(const JsVar *v) { return v && (v->flags&(JSV_VARTYPEMASK))==JSV_NATIVE_FUNCTION; } bool jsvIsUndefined(const JsVar *v) { return v==0; } bool jsvIsNull(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)==JSV_NULL; } +bool jsvIsNullish(const JsVar *v) { return v==0 || (v->flags&JSV_VARTYPEMASK)==JSV_NULL; } bool jsvIsBasic(const JsVar *v) { return jsvIsNumeric(v) || jsvIsString(v);} ///< Is this *not* an array/object/etc bool jsvIsName(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>=_JSV_NAME_START && (v->flags&JSV_VARTYPEMASK)<=_JSV_NAME_END; } ///< NAMEs are what's used to name a variable (it is not the data itself) bool jsvIsBasicName(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>=JSV_NAME_STRING_0 && (v->flags&JSV_VARTYPEMASK)<=JSV_NAME_STRING_MAX; } ///< Simple NAME that links to a variable via firstChild @@ -3511,7 +3512,7 @@ JsVar *jsvMathsOp(JsVar *a, JsVar *b, int op) { if (jsvIsNativeFunction(a) || jsvIsNativeFunction(b)) { // even if one is not native, the contents will be different - equal = a && b && + equal = a && b && a->varData.native.ptr == b->varData.native.ptr && a->varData.native.argTypes == b->varData.native.argTypes && jsvGetFirstChild(a) == jsvGetFirstChild(b); From 078fe7c0b2fbb8bfe8a15f82c74a2d6cd0d418f2 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Mon, 30 May 2022 08:50:06 +0200 Subject: [PATCH 0107/1183] Forgot to declare function --- src/jsvar.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jsvar.h b/src/jsvar.h index dc37b3c862..ad3a9ca39b 100644 --- a/src/jsvar.h +++ b/src/jsvar.h @@ -388,6 +388,7 @@ bool jsvIsArrayBufferName(const JsVar *v); bool jsvIsNativeFunction(const JsVar *v); bool jsvIsUndefined(const JsVar *v); bool jsvIsNull(const JsVar *v); +bool jsvIsNullish(const JsVar *v); bool jsvIsBasic(const JsVar *v); ///< Is this *not* an array/object/etc bool jsvIsName(const JsVar *v); ///< NAMEs are what's used to name a variable (it is not the data itself) bool jsvIsBasicName(const JsVar *v); ///< Simple NAME that links to a variable via firstChild From 4c9f942b45fd9cb23064bbb516db0a65422c2fa2 Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Wed, 1 Jun 2022 14:33:46 +0200 Subject: [PATCH 0108/1183] This is not used from anywhere --- src/jsparse.c | 18 ++++-------------- src/jsparse.h | 7 ------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/jsparse.c b/src/jsparse.c index ed33910ccf..e424c1a47e 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -783,10 +783,10 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t bool hadDebuggerNextLineOnly = false; if (execInfo.execute&EXEC_DEBUGGER_STEP_INTO) { - if (functionName) - jsiConsolePrintf("Stepping into %v\n", functionName); - else - jsiConsolePrintf("Stepping into function\n", functionName); + if (functionName) + jsiConsolePrintf("Stepping into %v\n", functionName); + else + jsiConsolePrintf("Stepping into function\n", functionName); } else { hadDebuggerNextLineOnly = execInfo.execute&EXEC_DEBUGGER_NEXT_LINE; if (hadDebuggerNextLineOnly) @@ -1055,16 +1055,6 @@ JsVar *jspGetVarNamedField(JsVar *object, JsVar *nameVar, bool returnName) { else return jsvSkipNameAndUnLock(child); } -/// Call the named function on the object - whether it's built in, or predefined. Returns the return value of the function. -JsVar *jspCallNamedFunction(JsVar *object, char* name, int argCount, JsVar **argPtr) { - JsVar *child = jspGetNamedField(object, name, false); - JsVar *r = 0; - if (jsvIsFunction(child)) - r = jspeFunctionCall(child, 0, object, false, argCount, argPtr); - jsvUnLock(child); - return r; -} - NO_INLINE JsVar *jspeFactorMember(JsVar *a, JsVar **parentResult) { /* The parent if we're executing a method call */ JsVar *parent = 0; diff --git a/src/jsparse.h b/src/jsparse.h index 5a7e1122aa..e2af49b29e 100644 --- a/src/jsparse.h +++ b/src/jsparse.h @@ -198,13 +198,6 @@ JsVar *jspGetNamedVariable(const char *tokenName); JsVar *jspGetNamedField(JsVar *object, const char* name, bool returnName); JsVar *jspGetVarNamedField(JsVar *object, JsVar *nameVar, bool returnName); -/** Call the function named on the given object. For example you might call: - * - * JsVar *str = jspCallNamedFunction(var, "toString", 0, 0); - */ -JsVar *jspCallNamedFunction(JsVar *object, char* name, int argCount, JsVar **argPtr); - - // These are exported for the Web IDE's compiler. See exportPtrs in jswrap_process.c JsVar *jspeiFindInScopes(const char *name); From 1e0486812002cf071c6a917e14dfa10d41802a9c Mon Sep 17 00:00:00 2001 From: Marius Gundersen Date: Fri, 3 Jun 2022 08:23:39 +0200 Subject: [PATCH 0109/1183] Don't allow expressions on the left side of assignments --- src/jsparse.c | 15 ++++++++------- tests/test_lvalue.js | 20 ++++++++++++++++++++ tests/test_lvalue_throws.js | 30 ++++++++++++++++++++++++++++++ tests/test_nullish.js | 3 +++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 tests/test_lvalue.js create mode 100644 tests/test_lvalue_throws.js diff --git a/src/jsparse.c b/src/jsparse.c index ed33910ccf..c8759274c3 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1942,28 +1942,29 @@ NO_INLINE JsVar *__jspeBinaryExpression(JsVar *a, unsigned int lastPrecedence) { // we don't bother to execute the other op. Even if not // we need to tell mathsOp it's an & or | if (op==LEX_ANDAND || op==LEX_OROR) { - bool aValue = jsvGetBoolAndUnLock(jsvSkipName(a)); + JsVar *av = jsvSkipNameAndUnLock(a); + bool aValue = jsvGetBool(av); if ((!aValue && op==LEX_ANDAND) || (aValue && op==LEX_OROR)) { // use first argument (A) + a = av; JSP_SAVE_EXECUTE(); jspSetNoExecute(); jsvUnLock(__jspeBinaryExpression(jspeUnaryExpression(),precedence)); JSP_RESTORE_EXECUTE(); } else { // use second argument (B) - jsvUnLock(a); + jsvUnLock(av); a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } } else if (op==LEX_NULLISH){ - JsVar* value = jsvSkipName(a); + JsVar* value = jsvSkipNameAndUnLock(a); if (jsvIsNull(value) || jsvIsUndefined(value)) { // use second argument (B) if(!jsvIsUndefined(value)) jsvUnLock(value); - jsvUnLock(a); a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } else { - jsvUnLock(value); + a = value; // use first argument (A) JSP_SAVE_EXECUTE(); jspSetNoExecute(); @@ -2063,7 +2064,7 @@ NO_INLINE JsVar *__jspeConditionalExpression(JsVar *lhs) { bool first = jsvGetBoolAndUnLock(jsvSkipName(lhs)); jsvUnLock(lhs); if (first) { - lhs = jspeAssignmentExpression(); + lhs = jsvSkipNameAndUnLock(jspeAssignmentExpression()); JSP_MATCH(':'); JSP_SAVE_EXECUTE(); jspSetNoExecute(); @@ -2075,7 +2076,7 @@ NO_INLINE JsVar *__jspeConditionalExpression(JsVar *lhs) { jsvUnLock(jspeAssignmentExpression()); JSP_RESTORE_EXECUTE(); JSP_MATCH(':'); - lhs = jspeAssignmentExpression(); + lhs = jsvSkipNameAndUnLock(jspeAssignmentExpression()); } } } diff --git a/tests/test_lvalue.js b/tests/test_lvalue.js new file mode 100644 index 0000000000..c29f976120 --- /dev/null +++ b/tests/test_lvalue.js @@ -0,0 +1,20 @@ +// Testing proper lvalue support + +// test left hand fall through + +var a = 5; +var b = 7; +var c = 0; + +result = a || b; +result |= !(c && b); +result |= a ?? b; +result |= a ? b : c; + + +// test right hand side + +result |= c || b; +result |= a && b; +result |= null ?? b; +result |= c ? b : a; \ No newline at end of file diff --git a/tests/test_lvalue_throws.js b/tests/test_lvalue_throws.js new file mode 100644 index 0000000000..c2a0b462fa --- /dev/null +++ b/tests/test_lvalue_throws.js @@ -0,0 +1,30 @@ +// Test that lvalue cannot be assigned to + +var a = 0, b = 0; +try { + (true ? a : b) = 5; + result = false; +}catch(e){ + result = true; +} + +try { + (a && b) = 5; + result = false; +}catch(e){ + result |= true; +} + +try { + (a || b) = 5; + result = false; +}catch(e){ + result |= true; +} + +try { + (a ?? b) = 5; + result = false; +}catch(e){ + result |= true; +} \ No newline at end of file diff --git a/tests/test_nullish.js b/tests/test_nullish.js index dc67de8179..20861debc9 100644 --- a/tests/test_nullish.js +++ b/tests/test_nullish.js @@ -20,6 +20,9 @@ result &= (d ?? 1) === 0; var e = false; result &= (e ?? 1) === false; +var e = null; +result &= (e ?? c); + // Check token is handled correctly by the internal pretokeniser E.setFlags({pretokenise:1}) function a(a) { return a??5 } From 17039c5e51a6d0f7825156a07124b1fd7af67813 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Jun 2022 10:39:19 +0100 Subject: [PATCH 0110/1183] Update src/jsvar.c - readability Co-authored-by: fewieden --- src/jsvar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jsvar.c b/src/jsvar.c index 2e34907346..577638e723 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -115,7 +115,7 @@ bool jsvIsArrayBufferName(const JsVar *v) { return v && (v->flags&(JSV_VARTYPEMA bool jsvIsNativeFunction(const JsVar *v) { return v && (v->flags&(JSV_VARTYPEMASK))==JSV_NATIVE_FUNCTION; } bool jsvIsUndefined(const JsVar *v) { return v==0; } bool jsvIsNull(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)==JSV_NULL; } -bool jsvIsNullish(const JsVar *v) { return v==0 || (v->flags&JSV_VARTYPEMASK)==JSV_NULL; } +bool jsvIsNullish(const JsVar *v) { return jsvIsUndefined(v) || jsvIsNull(v); } bool jsvIsBasic(const JsVar *v) { return jsvIsNumeric(v) || jsvIsString(v);} ///< Is this *not* an array/object/etc bool jsvIsName(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>=_JSV_NAME_START && (v->flags&JSV_VARTYPEMASK)<=_JSV_NAME_END; } ///< NAMEs are what's used to name a variable (it is not the data itself) bool jsvIsBasicName(const JsVar *v) { return v && (v->flags&JSV_VARTYPEMASK)>=JSV_NAME_STRING_0 && (v->flags&JSV_VARTYPEMASK)<=JSV_NAME_STRING_MAX; } ///< Simple NAME that links to a variable via firstChild From 6fab513545c1c8667b459738b1416b8a19895576 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 11:37:00 +0000 Subject: [PATCH 0111/1183] Bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6999e09372..fdcd7e003c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: # try and build for all devices even if one fails fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: make ${{ matrix.board }} @@ -45,7 +45,7 @@ jobs: # try and build for all devices even if one fails fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: make ${{ matrix.board }} @@ -70,7 +70,7 @@ jobs: # try and build for all devices even if one fails fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: make ${{ matrix.board }} From 7819de937aec59b8133d72d247aff797de126ec4 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Jun 2022 15:26:54 +0100 Subject: [PATCH 0112/1183] Fix issue with const in a module when called from a scope with const already in (fix #2215, fix #2207) --- ChangeLog | 1 + src/jsparse.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index b7730ec54b..1baf247d67 100644 --- a/ChangeLog +++ b/ChangeLog @@ -29,6 +29,7 @@ Add Nullish coalescing operator Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice (regression in 2v13) + Fix issue with const in a module when called from a scope with const already in (fix #2215, fix #2207) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsparse.c b/src/jsparse.c index 08ebcb645c..1df3d7dd9c 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -3241,12 +3241,19 @@ JsVar *jspEvaluateModule(JsVar *moduleContents) { JsVar *exportsName = jsvAddNamedChild(scope, scopeExports, "exports"); jsvUnLock2(scopeExports, jsvAddNamedChild(scope, scope, "module")); - JsExecFlags oldExecute = execInfo.execute; - JsVar *oldThisVar = execInfo.thisVar; + JsExecInfo oldExecInfo = execInfo; +#ifndef ESPR_NO_LET_SCOPING + execInfo.baseScope = scopeExports; + execInfo.blockScope = 0; + execInfo.blockCount = 0; +#endif execInfo.thisVar = scopeExports; // set 'this' variable to exports jsvUnLock(jspEvaluateVar(moduleContents, scope, 0)); - execInfo.thisVar = oldThisVar; - execInfo.execute = oldExecute; // make sure we fully restore state after parsing a module +#ifndef ESPR_NO_LET_SCOPING + assert(execInfo.blockCount==0); + assert(execInfo.blockScope==0); +#endif + execInfo = oldExecInfo; // make sure we fully restore state after parsing a module jsvUnLock2(moduleContents, scope); return jsvSkipNameAndUnLock(exportsName); From 42cd8f61e947369aa24a41d9c3b5cb2084076a9f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Jun 2022 15:39:38 +0100 Subject: [PATCH 0113/1183] Add `seaLevelPressure` to Bangle.setOptions (fix #2213) --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1baf247d67..75bfefc357 100644 --- a/ChangeLog +++ b/ChangeLog @@ -30,6 +30,7 @@ Enable releases and cutting edge builds for Puck.js minimal releases (with 98kB of free Storage) nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice (regression in 2v13) Fix issue with const in a module when called from a scope with const already in (fix #2215, fix #2207) + Add `seaLevelPressure` to Bangle.setOptions (fix #2213) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index ed0f1fa9ad..cbc78a6537 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -576,6 +576,7 @@ JsVar *promisePressure; double barometerPressure; double barometerTemperature; double barometerAltitude; +double barometerSeaLevelPressure = 1013.25; // Standard atmospheric pressure (millibars) bool jswrap_banglejs_barometerPoll(); JsVar *jswrap_banglejs_getBarometerObject(); #endif // PRESSURE_DEVICE @@ -2011,8 +2012,8 @@ void jswrap_banglejs_setPollInterval(JsVarFloat interval) { Set internal options used for gestures, etc... * `wakeOnBTN1` should the LCD turn on when BTN1 is pressed? default = `true` -* `wakeOnBTN2` should the LCD turn on when BTN2 is pressed? default = `true` -* `wakeOnBTN3` should the LCD turn on when BTN3 is pressed? default = `true` +* `wakeOnBTN2` (Bangle.js 1) should the LCD turn on when BTN2 is pressed? default = `true` +* `wakeOnBTN3` (Bangle.js 1) should the LCD turn on when BTN3 is pressed? default = `true` * `wakeOnFaceUp` should the LCD turn on when the watch is turned face up? default = `false` * `wakeOnTouch` should the LCD turn on when the touchscreen is pressed? default = `false` * `wakeOnTwist` should the LCD turn on when the watch is twisted? default = `true` @@ -2030,6 +2031,7 @@ Set internal options used for gestures, etc... * `lcdPowerTimeout` how many milliseconds before the screen turns off * `backlightTimeout` how many milliseconds before the screen's backlight turns off * `hrmPollInterval` set the requested poll interval (in milliseconds) for the heart rate monitor. On Bangle.js 2 only 10,20,40,80,160,200 ms are supported, and polling rate may not be exact. The algorithm's filtering is tuned for 20-40ms poll intervals, so higher/lower intervals may effect the reliability of the BPM reading. +* `seaLevelPressure` (Bangle.js 2) Normally 1013.25 millibars - this is used for calculating altitude with the pressure sensor Where accelerations are used they are in internal units, where `8192 = 1g` @@ -2051,6 +2053,9 @@ JsVar * _jswrap_banglejs_setOptions(JsVar *options, bool createObject) { jsvConfigObject configs[] = { #ifdef HEARTRATE {"hrmPollInterval", JSV_INTEGER, &_hrmPollInterval}, +#endif +#ifdef PRESSURE_DEVICE + {"seaLevelPressure", JSV_FLOAT, &barometerSeaLevelPressure}, #endif {"gestureStartThresh", JSV_INTEGER, &_accelGestureStartThresh}, {"gestureEndThresh", JSV_INTEGER, &_accelGestureEndThresh}, @@ -4206,8 +4211,7 @@ bool jswrap_banglejs_barometerPoll() { traw_scaled * barometer_c01 + traw_scaled * praw_scaled * ( barometer_c11 + praw_scaled * barometer_c21)); barometerPressure = pressurePa / 100; // convert Pa to hPa/millibar - double seaLevelPressure = 1013.25; // Standard atmospheric pressure - barometerAltitude = 44330 * (1.0 - jswrap_math_pow(barometerPressure / seaLevelPressure, 0.1903)); + barometerAltitude = 44330 * (1.0 - jswrap_math_pow(barometerPressure / barometerSeaLevelPressure, 0.1903)); // TODO: temperature corrected altitude? return true; } @@ -4249,8 +4253,7 @@ bool jswrap_banglejs_barometerPoll() { barometerPressure = 0; } - double seaLevelPressure = 1013.25; // Standard atmospheric pressure - barometerAltitude = 44330 * (1.0 - jswrap_math_pow(barometerPressure / seaLevelPressure, 0.1903)); + barometerAltitude = 44330 * (1.0 - jswrap_math_pow(barometerPressure / barometerSeaLevelPressure, 0.1903)); // TODO: temperature corrected altitude? return true; } From 853c74129c4414aaaac8ffc66208b20e3742bafb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Jun 2022 14:34:26 +0100 Subject: [PATCH 0114/1183] Bangle.js: speed up HRM average adjustment (specifically when sample rate is 25Hz, eg. for Bangle.js 2) --- ChangeLog | 1 + libs/misc/heartrate.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 75bfefc357..1fe7eafc64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,7 @@ nRF5x: Fix memory leak (of address) when using NRF.setScan/requestDevice/findDevice (regression in 2v13) Fix issue with const in a module when called from a scope with const already in (fix #2215, fix #2207) Add `seaLevelPressure` to Bangle.setOptions (fix #2213) + Bangle.js: speed up HRM average adjustment (specifically when sample rate is 25Hz, eg. for Bangle.js 2) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/misc/heartrate.c b/libs/misc/heartrate.c index 75624a5813..c02971dde7 100644 --- a/libs/misc/heartrate.c +++ b/libs/misc/heartrate.c @@ -370,7 +370,11 @@ bool hrm_new(int hrmValue) { hadBeat = hrm_had_beat(); } - hrmInfo.avg = ((hrmInfo.avg*31) + h) >> 5; + if (hrmPollInterval > 30) // 40 = 25Hz, Bangle.js 2 default sample rate + hrmInfo.avg = ((hrmInfo.avg*7) + h) >> 3; + else // 20 = 50Hz, Bangle.js 1 default sample rate + hrmInfo.avg = ((hrmInfo.avg*15) + h) >> 4; + return hadBeat; } From ef6dc1d87def336a2b22559ef93155f9b3ef7dbe Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Jun 2022 14:53:01 +0100 Subject: [PATCH 0115/1183] oops --- libs/misc/heartrate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/misc/heartrate.c b/libs/misc/heartrate.c index c02971dde7..485726f57d 100644 --- a/libs/misc/heartrate.c +++ b/libs/misc/heartrate.c @@ -17,6 +17,7 @@ #include #include #include "heartrate.h" +#include "hrm.h" #include "jshardware.h" /* From 175311e3b40f038b962b60252c252cdbcba85852 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Jun 2022 16:11:39 +0100 Subject: [PATCH 0116/1183] Bangle.js: Change default distance units to m,km (from m,miles) (fix #2209, fix #2210) --- ChangeLog | 1 + libs/js/banglejs/locale.js | 2 +- libs/js/banglejs/locale.min.js | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1fe7eafc64..60c9258749 100644 --- a/ChangeLog +++ b/ChangeLog @@ -32,6 +32,7 @@ Fix issue with const in a module when called from a scope with const already in (fix #2215, fix #2207) Add `seaLevelPressure` to Bangle.setOptions (fix #2213) Bangle.js: speed up HRM average adjustment (specifically when sample rate is 25Hz, eg. for Bangle.js 2) + Bangle.js: Change default distance units to m,km (from m,miles) (fix #2209, fix #2210) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/locale.js b/libs/js/banglejs/locale.js index 2d9d5457c5..4f5cffde89 100644 --- a/libs/js/banglejs/locale.js +++ b/libs/js/banglejs/locale.js @@ -26,7 +26,7 @@ exports = { name : "en_GB", currencySym:"£", month : (d,short) => "January,February,March,April,May,June,July,August,September,October,November,December".split(",")[d.getMonth()].substr(0, short ? 3 : 10), // Date to "February" or "Feb"(short) number : n => n.toString(), // more fancy? currency : n => "£"+n.toFixed(2), // number to "£1.00" - distance : (m,dp) => (m<1000)?round(m,dp)+"m":round(m/1609.34,dp)+"mi", // meters to "123m" or "1.2mi" depending on size + distance : (m,dp) => (m<1000)?round(m,dp)+"m":round(m/1000,dp)+"km", // meters to "123m" or "1.2km" depending on size speed : (s,dp) => round(s/1.60934,dp)+"mph",// kph to "123mph" temp : (t,dp) => round(t,dp)+"'C", // degrees C to degrees C meridian: d => (d.getHours() <= 12) ? "am":"pm" // Date to am/pm diff --git a/libs/js/banglejs/locale.min.js b/libs/js/banglejs/locale.min.js index 47dcf0c3c7..9fdcc859d3 100644 --- a/libs/js/banglejs/locale.min.js +++ b/libs/js/banglejs/locale.min.js @@ -1,3 +1,3 @@ function d(a,b){void 0===b&&(b=1);return a.toFixed(Math.min(b,b-Math.floor(Math.log(a)/Math.log(10))))}exports={name:"en_GB",currencySym:"\u00a3",translate:a=>a,date:(a,b)=>b?("0"+a.getDate()).substr(-2)+"/"+("0"+(a.getMonth()+1)).substr(-2)+"/"+a.getFullYear():a.toString().substr(4,11),time:(a,b)=>{var c=a.getHours(),e=a.getMinutes();(require("Storage").readJSON("setting.json",1)||{})["12hour"]&&(c=0==c%12?12:c%12);if(b)return(" "+c).substr(-2)+":"+("0"+e).substr(-2);b="am"; -0==c?c=12:12<=c&&(12b?a.toString().substr(0,3):"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")[a.getDay()],month:(a,b)=>b?a.toString().substr(4,3):"January February March April May June July August September October November December".split(" ")[a.getMonth()],number:a=>a.toString(),currency:a=>"\u00a3"+a.toFixed(2),distance:(a,b)=>1E3>a?d(a,b)+"m":d(a/1609.34, -b)+"mi",speed:(a,b)=>d(a/1.60934,b)+"mph",temp:(a,b)=>d(a,b)+"'C",meridian:a=>12>=a.getHours()?"am":"pm"} \ No newline at end of file +0==c?c=12:12<=c&&(12"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")[a.getDay()].substr(0,b?3:10),month:(a,b)=>"January February March April May June July August September October November December".split(" ")[a.getMonth()].substr(0,b?3:10),number:a=>a.toString(),currency:a=>"\u00a3"+a.toFixed(2),distance:(a,b)=>1E3>a?d(a,b)+"m":d(a/1E3,b)+"km",speed:(a,b)=> +d(a/1.60934,b)+"mph",temp:(a,b)=>d(a,b)+"'C",meridian:a=>12>=a.getHours()?"am":"pm"} \ No newline at end of file From 4767f2bb20e7f323a8475f02332d6bafd6fb1a31 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Jun 2022 16:31:26 +0100 Subject: [PATCH 0117/1183] Bangle.js: Rename default locale to 'system' (from 'en_GB') --- ChangeLog | 1 + libs/js/banglejs/locale.js | 2 +- libs/js/banglejs/locale.min.js | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 60c9258749..fac0b51414 100644 --- a/ChangeLog +++ b/ChangeLog @@ -33,6 +33,7 @@ Add `seaLevelPressure` to Bangle.setOptions (fix #2213) Bangle.js: speed up HRM average adjustment (specifically when sample rate is 25Hz, eg. for Bangle.js 2) Bangle.js: Change default distance units to m,km (from m,miles) (fix #2209, fix #2210) + Bangle.js: Rename default locale to 'system' (from 'en_GB') 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/locale.js b/libs/js/banglejs/locale.js index 4f5cffde89..edddec44a4 100644 --- a/libs/js/banglejs/locale.js +++ b/libs/js/banglejs/locale.js @@ -3,7 +3,7 @@ function round(n, dp) { var p = Math.min(dp,dp - Math.floor(Math.log(n)/Math.log(10))); return n.toFixed(p); } -exports = { name : "en_GB", currencySym:"£", +exports = { name : "system", currencySym:"£", translate : str=>str, // as-is date : (d,short) => short?("0"+d.getDate()).substr(-2)+"/"+("0"+(d.getMonth()+1)).substr(-2)+"/"+d.getFullYear():d.toString().substr(4,11), // Date to "Feb 28 2020" or "28/02/2020"(short) time : (d,short) => { // Date to "4:15.28 pm" or "15:42"(short) diff --git a/libs/js/banglejs/locale.min.js b/libs/js/banglejs/locale.min.js index 9fdcc859d3..675422496b 100644 --- a/libs/js/banglejs/locale.min.js +++ b/libs/js/banglejs/locale.min.js @@ -1,3 +1,3 @@ -function d(a,b){void 0===b&&(b=1);return a.toFixed(Math.min(b,b-Math.floor(Math.log(a)/Math.log(10))))}exports={name:"en_GB",currencySym:"\u00a3",translate:a=>a,date:(a,b)=>b?("0"+a.getDate()).substr(-2)+"/"+("0"+(a.getMonth()+1)).substr(-2)+"/"+a.getFullYear():a.toString().substr(4,11),time:(a,b)=>{var c=a.getHours(),e=a.getMinutes();(require("Storage").readJSON("setting.json",1)||{})["12hour"]&&(c=0==c%12?12:c%12);if(b)return(" "+c).substr(-2)+":"+("0"+e).substr(-2);b="am"; -0==c?c=12:12<=c&&(12"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")[a.getDay()].substr(0,b?3:10),month:(a,b)=>"January February March April May June July August September October November December".split(" ")[a.getMonth()].substr(0,b?3:10),number:a=>a.toString(),currency:a=>"\u00a3"+a.toFixed(2),distance:(a,b)=>1E3>a?d(a,b)+"m":d(a/1E3,b)+"km",speed:(a,b)=> -d(a/1.60934,b)+"mph",temp:(a,b)=>d(a,b)+"'C",meridian:a=>12>=a.getHours()?"am":"pm"} \ No newline at end of file +function d(a,b){void 0===b&&(b=1);return a.toFixed(Math.min(b,b-Math.floor(Math.log(a)/Math.log(10))))}exports={name:"system",currencySym:"\u00a3",translate:a=>a,date:(a,b)=>b?("0"+a.getDate()).substr(-2)+"/"+("0"+(a.getMonth()+1)).substr(-2)+"/"+a.getFullYear():a.toString().substr(4,11),time:(a,b)=>{var c=a.getHours(),e=a.getMinutes();(require("Storage").readJSON("setting.json",1)||{})["12hour"]&&(c=0==c%12?12:c%12);if(b)return(" "+c).substr(-2)+":"+("0"+e).substr(-2);b= +"am";0==c?c=12:12<=c&&(12"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")[a.getDay()].substr(0,b?3:10),month:(a,b)=>"January February March April May June July August September October November December".split(" ")[a.getMonth()].substr(0,b?3:10),number:a=>a.toString(),currency:a=>"\u00a3"+a.toFixed(2),distance:(a,b)=>1E3>a?d(a,b)+"m":d(a/1E3,b)+"km",speed:(a, +b)=>d(a/1.60934,b)+"mph",temp:(a,b)=>d(a,b)+"'C",meridian:a=>12>=a.getHours()?"am":"pm"} \ No newline at end of file From 18e54954b905a6a8ae2d0f139c63a103e67dbaa5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 09:55:00 +0100 Subject: [PATCH 0118/1183] Ctrl-C will now *not* break out of short-running intervals/watches, only long-running ones --- ChangeLog | 1 + src/jsinteractive.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index fac0b51414..74abbba4ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,7 @@ Bangle.js: speed up HRM average adjustment (specifically when sample rate is 25Hz, eg. for Bangle.js 2) Bangle.js: Change default distance units to m,km (from m,miles) (fix #2209, fix #2210) Bangle.js: Rename default locale to 'system' (from 'en_GB') + Ctrl-C will now *not* break out of short-running intervals/watches, only long-running ones 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsinteractive.c b/src/jsinteractive.c index c3815161a6..710975e3c9 100644 --- a/src/jsinteractive.c +++ b/src/jsinteractive.c @@ -37,8 +37,6 @@ #define CHAR_DELETE_SEND '\b' #endif -#define CTRL_C_TIME_FOR_BREAK jshGetTimeFromMilliseconds(100) - #ifdef ESP8266 extern void jshPrintBanner(void); // prints a debugging banner while we're in beta extern void jshSoftInit(void); // re-inits wifi after a soft-reset @@ -69,7 +67,9 @@ Pin pinSleepIndicator = DEFAULT_SLEEP_PIN_INDICATOR; #endif JsiStatus jsiStatus = 0; JsSysTime jsiLastIdleTime; ///< The last time we went around the idle loop - use this for timers -uint32_t jsiTimeSinceCtrlC; +#ifndef EMBEDDED +uint32_t jsiTimeSinceCtrlC; ///< When was Ctrl-C last pressed. We use this so we quit on desktop when we do Ctrl-C + Ctrl-C +#endif // ---------------------------------------------------------------------------- JsVar *inputLine = 0; ///< The current input line JsvStringIterator inputLineIterator; ///< Iterator that points to the end of the input line @@ -459,7 +459,9 @@ void jsiSoftInit(bool hasBeenReset) { // Make sure we set up lastIdleTime, as this could be used // when adding an interval from onInit (called below) jsiLastIdleTime = jshGetSystemTime(); +#ifndef EMBEDDED jsiTimeSinceCtrlC = 0xFFFFFFFF; +#endif // Set up interpreter flags and remove JsVar *flags = jsvObjectGetChild(execInfo.hiddenRoot, JSI_JSFLAGS_NAME, 0); @@ -1701,7 +1703,7 @@ void jsiExecuteEvents() { } if (hasEvents) { jsiSetBusy(BUSY_INTERACTIVE, false); - if (jspIsInterrupted() || jsiTimeSinceCtrlC jsiTimeSinceCtrlC) jsiTimeSinceCtrlC = 0xFFFFFFFF; +#endif JsVar *timerArrayPtr = jsvLock(timerArray); JsvObjectIterator it; @@ -2327,8 +2331,8 @@ bool jsiLoop() { jsiConsoleRemoveInputLine(); jsiConsolePrintf("Press Ctrl-C again to exit\n"); } -#endif jsiTimeSinceCtrlC = 0; +#endif } jsiClearInputLine(true); } From 728fe64c5096ca58fb5740494c2d31b272cd4013 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 14:18:23 +0100 Subject: [PATCH 0119/1183] Bangle.js: Allow E.showMenu to be given an array and title option (fix #2175) --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 14 +++++++++++ libs/js/banglejs/E_showMenu_F18.js | 34 ++++++++++---------------- libs/js/banglejs/E_showMenu_F18.min.js | 12 ++++----- libs/js/banglejs/E_showMenu_F5.js | 1 + libs/js/banglejs/E_showMenu_Q3.js | 15 ++++++------ libs/js/banglejs/E_showMenu_Q3.min.js | 14 +++++------ 7 files changed, 49 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 74abbba4ed..8e73e7ab80 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,6 +35,7 @@ Bangle.js: Change default distance units to m,km (from m,miles) (fix #2209, fix #2210) Bangle.js: Rename default locale to 'system' (from 'en_GB') Ctrl-C will now *not* break out of short-running intervals/watches, only long-running ones + Bangle.js: Allow E.showMenu to be given an array and title option (fix #2175) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index cbc78a6537..7ea3972719 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -4873,6 +4873,20 @@ On Bangle.js there are a few additions over the standard `graphical_menu`: * (Bangle.js 2) `scroller` - the object returned by `E.showScroller` - `scroller.scroll` returns the amount the menu is currently scrolled by * In the object specified for editable numbers: * (Bangle.js 2) the `format` function is called with `format(value)` in the main menu, `format(value,1)` when in a scrollable list, or `format(value,2)` when in a popup window. + +You can also specify menu items as an array (rather than an Object). This can be useful +if you have menu items with the same title, or you want to `push` menu items onto an +array: + +``` +var menu = [ + { title:"Something", onchange:function() { print("selected"); } }, + { title:"On or Off", value:false, onchange: v => print(v) }, + { title:"A Value", value:3, min:0, max:10, onchange: v => print(v) }, +]; +menu[""] = { title:"Hello" }; +E.showMenu(menu); +``` */ /*JSON{ diff --git a/libs/js/banglejs/E_showMenu_F18.js b/libs/js/banglejs/E_showMenu_F18.js index 768a6ab3d7..1a811df418 100644 --- a/libs/js/banglejs/E_showMenu_F18.js +++ b/libs/js/banglejs/E_showMenu_F18.js @@ -46,8 +46,7 @@ g.reset().setFont('6x8',2).setFontAlign(0,-1,0); if (options.predraw) options.predraw(g); if (rowmin===undefined && options.title) { - g.drawString(options.title,(x+x2)/2,y-options.fontHeight-2); - g.drawLine(x,y-2,x2,y-2); + g.drawString(options.title,(x+x2)/2,y-options.fontHeight-2).drawLine(x,y-2,x2,y-2); } if (rowmin!==undefined) { if (idx{a=e[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>atob(b?"AAwMggC///7//////////8///w///D/y8P/4A//8D/////////+///4=":"AAwMgQD/+AGAGAGAGAGAGAGAGAGAH/8="))});c instanceof Object||(c={});c.fontHeight=c.fontHeight||16;void 0===c.selected&&(c.selected=0); -c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,l=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(a,b){var p=0|Math.min((t-n)/c.fontHeight,f.length),h=E.clip(c.selected-(p>>1),0,f.length-p);h!=d.lastIdx&&(a=void 0);d.lastIdx=h;var u=h+pb&&(p=1+b-a));for(;p--;){b=f[h];a=e[b];var m=h==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg);g.fillRect(r,k,l,k+c.fontHeight-1);g.setColor(m?g.theme.fgH:g.theme.fg);g.setFontAlign(-1,-1);g.drawString(b,r,k);"object"==typeof a?(b=l,m=a.value,a.format&&(m=a.format(m)),d.selectEdit&&h==c.selected&&(b-=25,g.setColor(g.theme.bgH).fillRect(b-(g.stringWidth(m)+4),k,l,k+c.fontHeight-1),g.setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@",b,k+ -(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),g.drawString(m,b-2,k)):d.main&&(g.setFontAlign(1,-1),g.drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),l,k));g.setColor(g.theme.fg);k+=c.fontHeight;h++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",l+2,40);g.drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",l+2,194);g.drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",l+2,116);g.setColor(u?g.theme.fg:g.theme.bg).fillPoly([104, -220,136,220,120,228]);g.flip()},select:function(){var a=e[f[c.selected]];if(d.main){var b=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=b;d.back();a.onchange&&(a.onchange(a.value),d.draw(c.selected,c.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(!a.noList&&a.format&&1===(a.step||1)&&0===a.min&&20>a.max){d.main={items:e,menuItems:f,selected:c.selected,title:c.title,value:a.value};c.title=f[c.selected];c.selected=0;e={};for(b=a.min;b<= -a.max;b++)e[a.format(b)]=b,b==a.value&&(c.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var b=d.selectEdit;if(b){b=d.selectEdit;b.value-=(a||1)*(b.step||1);void 0!==b.min&&b.valueb.max&&(b.value=b.wrap?b.min:b.max);if(b.onchange)b.onchange(b.value); -d.draw(c.selected,c.selected)}else b=c.selected,c.selected=(a+c.selected+f.length)%f.length,d.draw(Math.min(b,c.selected),Math.max(b,c.selected))},back:function(){if(d.main)c.selected=d.main.selected,c.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file +c.fontHeight||(c.fontHeight=6);var q=Bangle.appRect,r=q.x,l=q.x2-11,n=q.y,t=q.y2-20;c.title&&(n+=c.fontHeight+2);var d={lastIdx:0,draw:function(a,b){var p=0|Math.min((t-n)/c.fontHeight,f.length),h=E.clip(c.selected-(p>>1),0,f.length-p);h!=d.lastIdx&&(a=void 0);d.lastIdx=h;var u=h+pb&&(p=1+b-a));for(;p--;){b=f[h];a=e[b];a.title&&(b=a.title);var m=h==c.selected&&!d.selectEdit;g.setColor(m?g.theme.bgH:g.theme.bg).fillRect(r,k,l,k+c.fontHeight-1).setColor(m?g.theme.fgH:g.theme.fg).setFontAlign(-1,-1).drawString(b,r,k);"object"==typeof a?(b=l,m=a.value,a.format&&(m=a.format(m)),d.selectEdit&&h==c.selected&&(b-=25,g.setColor(g.theme.bgH).fillRect(b-(g.stringWidth(m)+4),k,l,k+c.fontHeight-1).setColor(g.theme.fgH).drawImage("\f\u0005\u0081\x00 \u0007\x00\u00f9\u00f0\u000e\x00@", +b,k+(c.fontHeight-10)/2,{scale:2})),g.setFontAlign(1,-1),void 0!==m&&g.drawString(m,b-2,k)):d.main&&g.setFontAlign(1,-1).drawString(atob(d.main.value==a?"AAoKgQAeH+f7//////3+f4eA":"AAoKgQAeH+YbA8DwPA2Gf4eA"),l,k);g.setColor(g.theme.fg);k+=c.fontHeight;h++}g.setFontAlign(-1,-1);g.drawImage("\b\b\u0001\u00108|\u00fe\u0010\u0010\u0010\u0010",l+2,40).drawImage("\b\b\u0001\u0010\u0010\u0010\u0010\u00fe|8\u0010",l+2,194).drawImage("\b\b\u0001\x00\b\f\u000e\u00ff\u000e\f\b",l+2,116);g.setColor(u?g.theme.fg: +g.theme.bg).fillPoly([104,220,136,220,120,228]);g.flip()},select:function(){var a=e[f[c.selected]];if(d.main){var b=a;a=d.main.items[d.main.menuItems[d.main.selected]];a.value=b;d.back();a.onchange&&(a.onchange(a.value),d.draw(c.selected,c.selected))}else if("function"==typeof a)a(d);else if("object"==typeof a){if("number"==typeof a.value)if(!a.noList&&a.format&&1===(a.step||1)&&0===a.min&&20>a.max){d.main={items:e,menuItems:f,selected:c.selected,title:c.title,value:a.value};c.title=f[c.selected]; +c.selected=0;e={};for(b=a.min;b<=a.max;b++)e[a.format(b)]=b,b==a.value&&(c.selected=Object.keys(e).length-1);f=Object.keys(e);g.reset().clearRect(Bangle.appRect);d.draw()}else d.selectEdit=d.selectEdit?void 0:a;else if("boolean"==typeof a.value&&(a.value=!a.value),a.onchange)a.onchange(a.value);d.draw()}},move:function(a){var b=d.selectEdit;if(b){b=d.selectEdit;b.value-=(a||1)*(b.step||1);void 0!==b.min&&b.valueb.max&&(b.value=b.wrap?b.min: +b.max);if(b.onchange)b.onchange(b.value);d.draw(c.selected,c.selected)}else b=c.selected,c.selected=(a+c.selected+f.length)%f.length,d.draw(Math.min(b,c.selected),Math.max(b,c.selected))},back:function(){if(d.main)c.selected=d.main.selected,c.title=d.main.title,e=d.main.items,f=d.main.menuItems,delete d.main,g.reset().clearRect(Bangle.appRect),d.draw();else if(e["< Back"])e["< Back"]()}};d.draw();Bangle.setUI({mode:"updown",back:e["< Back"]?d.back:void 0},a=>{a?d.move(a):d.select()});return d}Bangle.setUI()}) \ No newline at end of file diff --git a/libs/js/banglejs/E_showMenu_F5.js b/libs/js/banglejs/E_showMenu_F5.js index dc71765eb8..47a2eaf706 100644 --- a/libs/js/banglejs/E_showMenu_F5.js +++ b/libs/js/banglejs/E_showMenu_F5.js @@ -54,6 +54,7 @@ while (rows--) { var name = menuItems[idx]; var item = items[name]; + if (item.title) name = item.title; var hl = (idx==options.selected && !l.selectEdit); g.setColor(hl ? cHighlightBg : cBg); g.fillRect(x,iy,x2,iy+options.fontHeight-1); diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index c93a20a26d..f4a1b49c7a 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -8,7 +8,7 @@ var options = menu[""]||{}; if (!options.title) options.title="Menu"; var back = options.back||menu["< Back"]; - var keys = Object.keys(menu).filter(k=>k!="" && k!="< Back"); + var keys = Object.keys(menu).filter(k=>k!=="" && k!="< Back"); keys.forEach(k => { var item = menu[k]; if ("object" != typeof item) return; @@ -85,7 +85,7 @@ }; var scr = { h : H, c : keys.length/*title*/, - scrollMin : -24, scroll : options.scroll===undefined?-24:options.scroll, // title is 24px, rendered at -1 + scrollMin : -24, scroll : options.scroll??-24, // title is 24px, rendered at -1 back : back, draw : (idx, r) => { if (idx<0) // TITLE @@ -106,11 +106,10 @@ g.drawImage(/* 9x18 */atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="), r.x+r.w-21, r.y+H/2-9); pad += 16; } - var l = g.wrapString(keys[idx],r.w-pad); - if (l.length>1) { - g.setFont("6x15"); - l = g.wrapString(keys[idx],r.w-pad); - } + var title = item.title??keys[idx]; + var l = g.wrapString(title,r.w-pad); + if (l.length>1) + l = g.setFont("6x15").wrapString(title,r.w-pad); g.setFontAlign(-1,0).drawString(l.join("\n"), r.x+12, r.y+H/2); }, select : function(idx) { @@ -136,4 +135,4 @@ } show(); return l; -}) +}) \ No newline at end of file diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index 8fde331f27..152d056bdb 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,7 +1,7 @@ -(function(k){function v(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:q,scrollMin:-24,scroll:-24,draw:(f,c)=>{if(0>f)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});f=f*h+a.min; -g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(f,1):f,c.x+12,c.y+20);g.drawImage(atob(f==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(f){if(!(0>f)){Bangle.buzz(20);a.value=a.min+f*h;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;q()}}});else{var d=Bangle.appRect,e=a.value;g.reset().clearRect(Bangle.appRect); -g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,d.x+d.w/2,d.y+12);function f(){var c=d.x+d.w/2,m=12+d.y+d.h/2,u=a.format?a.format(e,2):e;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(d.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,m);g.fillPoly([c,m-45,c+15,m-30, -c-15,m-30]).fillPoly([c,m+45,c+15,m+30,c-15,m+30])}f();Bangle.setUI({mode:"updown",back:q},c=>{if(c)e-=(c||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),f();else{a.value=e;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;q()}})}}function q(){l.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var p=k[""]||{};p.title||(p.title="Menu");var t=p.back||k["< Back"],n=Object.keys(k).filter(a=> -""!=a&&"< Back"!=a);n.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var l={draw:()=>l.scroller.draw(),scroller:void 0},r={h:40,c:n.length,scrollMin:-24,scroll:void 0===p.scroll?-24:p.scroll,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ -p.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=k[n[a]];if("object"==typeof d){var e=d.value;d.format&&(e=d.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);h+=g.stringWidth(e)}else"function"==typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);d=g.wrapString(n[a],b.w-h);1< -d.length&&(g.setFont("6x15"),d=g.wrapString(n[a],b.w-h));g.setFontAlign(-1,0).drawString(d.join("\n"),b.x+12,b.y+20)},select:function(a){if(0>a)return t&&t();var b=k[n[a]];Bangle.buzz(20);if("function"==typeof b)b(l);else if("object"==typeof b)if("number"==typeof b.value)v(b,n[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);l.scroller.drawItem(a)}}};q();return l}) \ No newline at end of file +(function(k){function w(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:p,scrollMin:-24,scroll:-24,draw:(d,c)=>{if(0>d)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5});d=d*h+a.min; +g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(d,1):d,c.x+12,c.y+20);g.drawImage(atob(d==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(d){if(!(0>d)){Bangle.buzz(20);a.value=a.min+d*h;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;p()}}});else{var e=Bangle.appRect,f=a.value;g.reset().clearRect(Bangle.appRect); +g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+b,e.x+e.w/2,e.y+12);function d(){var c=e.x+e.w/2,m=12+e.y+e.h/2,u=a.format?a.format(f,2):f;g.reset().setColor(g.theme.bg2).fillRect({x:e.x+24,y:e.y+36,w:e.w-48,h:e.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(e.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,m);g.fillPoly([c,m-45,c+15,m-30, +c-15,m-30]).fillPoly([c,m+45,c+15,m+30,c-15,m+30])}d();Bangle.setUI({mode:"updown",back:p},c=>{if(c)f-=(c||1)*(a.step||1),void 0!==a.min&&fa.max&&(f=a.wrap?a.min:a.max),d();else{a.value=f;if(a.onchange)a.onchange(a.value);r.scroll=l.scroller.scroll;p()}})}}function p(){l.scroller=E.showScroller(r)}if(void 0===k)return g.clearRect(Bangle.appRect),Bangle.setUI();var q=k[""]||{};q.title||(q.title="Menu");var t=q.back||k["< Back"],n=Object.keys(k).filter(a=> +""!==a&&"< Back"!=a);n.forEach(a=>{a=k[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var l={draw:()=>l.scroller.draw(),scroller:void 0};let v;var r={h:40,c:n.length,scrollMin:-24,scroll:null!=(v=q.scroll)?v:-24,back:t,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\u0081\x00\u00ff\u00ff\u00ff\x00\x00\x00\x00\u000f\u00ff\u00ff\u00f0\x00\x00\x00\x00\u00ff\u00ff\u00ff "+ +q.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,e=k[n[a]];if("object"==typeof e){var f=e.value;e.format&&(f=e.format(f));g.stringMetrics(f).width>b.w/2&&(f=g.wrapString(f,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(f,b.x+b.w-8,b.y+20);h+=g.stringWidth(f)}else"function"==typeof e&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);var d;a=null!=(d=e.title)?d: +n[a];d=g.wrapString(a,b.w-h);1a)return t&&t();var b=k[n[a]];Bangle.buzz(20);if("function"==typeof b)b(l);else if("object"==typeof b)if("number"==typeof b.value)w(b,n[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);l.scroller.drawItem(a)}}};p();return l}) \ No newline at end of file From ece46d97cc66cd2ccbbca96af367a7040ec40ab1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 14:28:38 +0100 Subject: [PATCH 0120/1183] nRF5x: We now clear the console's input line when connecting or disconnecting Bluetooth (fix #2219) --- ChangeLog | 1 + src/jsinteractive.h | 4 ++++ targets/nrf5x/bluetooth.c | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 8e73e7ab80..2057a5796b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,6 +36,7 @@ Bangle.js: Rename default locale to 'system' (from 'en_GB') Ctrl-C will now *not* break out of short-running intervals/watches, only long-running ones Bangle.js: Allow E.showMenu to be given an array and title option (fix #2175) + nRF5x: We now clear the console's input line when connecting or disconnecting Bluetooth (fix #2219) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsinteractive.h b/src/jsinteractive.h index 9c60bc4230..527379b071 100644 --- a/src/jsinteractive.h +++ b/src/jsinteractive.h @@ -109,6 +109,10 @@ void jsiConsolePrintStringVar(JsVar *v); void jsiConsoleRemoveInputLine(); /// Change what is in the inputline into something else (and update the console) void jsiReplaceInputLine(JsVar *newLine); +/** Clear the input line of data. If updateConsole is set, it + * sends VT100 characters to physically remove the line from + * the user's terminal. */ +void jsiClearInputLine(bool updateConsole); /// Flags for jsiSetBusy - THESE SHOULD BE 2^N typedef enum { diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 15410ea9a8..c33b2948f9 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -1203,8 +1203,10 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { bleStatus &= ~BLE_IS_SENDING_HID; #endif bleStatus &= ~BLE_IS_ADVERTISING; // we're not advertising now we're connected - if (!jsiIsConsoleDeviceForced() && (bleStatus & BLE_NUS_INITED)) + if (!jsiIsConsoleDeviceForced() && (bleStatus & BLE_NUS_INITED)) { + jsiClearInputLine(false); // clear the input line on connect jsiSetConsoleDevice(EV_BLUETOOTH, false); + } jsble_queue_pending_buf(BLEP_CONNECTED, 0, (char*)&p_ble_evt->evt.gap_evt.params.connected.peer_addr, sizeof(ble_gap_addr_t)); #ifndef SAVE_ON_FLASH m_peripheral_addr = p_ble_evt->evt.gap_evt.params.connected.peer_addr; @@ -1262,6 +1264,9 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { { bleStatus &= ~BLE_IS_RSSI_SCANNING; // scanning will have stopped now we're disconnected m_peripheral_conn_handle = BLE_CONN_HANDLE_INVALID; + // if we were on bluetooth and we disconnected, clear the input line so we're fresh next time (#2219) + if (jsiGetConsoleDevice()==EV_BLUETOOTH) jsiClearInputLine(false); + if (!jsiIsConsoleDeviceForced()) jsiSetConsoleDevice(jsiGetPreferredConsoleDevice(), 0); // by calling nus_transmit_string here, without a connection, we clear the Bluetooth output buffer nus_transmit_string(); From 9c0e226a3695b11dfb6d2e49ec873cb5e3e64137 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 14:43:04 +0100 Subject: [PATCH 0121/1183] Graphics: Add g.blendColor to expose the ability to figure out what color is between two others (fix #2150) --- ChangeLog | 1 + libs/graphics/jswrap_graphics.c | 32 ++++++++++++++++++++++++++++++++ libs/graphics/jswrap_graphics.h | 1 + 3 files changed, 34 insertions(+) diff --git a/ChangeLog b/ChangeLog index 2057a5796b..c653fc0ce7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -37,6 +37,7 @@ Ctrl-C will now *not* break out of short-running intervals/watches, only long-running ones Bangle.js: Allow E.showMenu to be given an array and title option (fix #2175) nRF5x: We now clear the console's input line when connecting or disconnecting Bluetooth (fix #2219) + Graphics: Add g.blendColor to expose the ability to figure out what color is between two others (fix #2150) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 955ae43201..477b1c0be7 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -1365,6 +1365,38 @@ unsigned int jswrap_graphics_toColor(JsVar *parent, JsVar *r, JsVar *g, JsVar *b return color; } +/*JSON{ + "type" : "method", + "class" : "Graphics", + "name" : "blendColor", + "ifdef" : "GRAPHICS_ANTIALIAS", + "generate" : "jswrap_graphics_blendColor", + "params" : [ + ["col_a","JsVar","Color to blend from (either a single integer color value, or a string)"], + ["col_b","JsVar","Color to blend to (either a single integer color value, or a string)"], + ["amt","JsVar","The amount to blend. 0=col_a, 1=col_b, 0.5=halfway between (and so on)"] + ], + "return" : ["int","The color index represented by the blended colors"] +} +Blend between two colors, and return the result. + +``` +// dark yellow - halfway between red and green +var col = g.blendColor("#f00","#0f0", 0.5); +// Get a color 25% brighter than the theme's background colour +var col = g.blendColor(g.theme.fg,g.theme.bg, 0.75); +// then... +g.setColor(col).fillRect(10,10,100,100); +``` +*/ + +unsigned int jswrap_graphics_blendColor(JsVar *parent, JsVar *ca, JsVar *cb, JsVar* amt) { + JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; + unsigned int a = jswrap_graphics_toColor(parent, ca, NULL, NULL); + unsigned int b = jswrap_graphics_toColor(parent, cb, NULL, NULL); + return graphicsBlendColor(&gfx, b, a, jsvGetFloat(amt)*256); +} + /*JSON{ "type" : "method", "class" : "Graphics", diff --git a/libs/graphics/jswrap_graphics.h b/libs/graphics/jswrap_graphics.h index aa9ce4e675..b4ee70cce5 100644 --- a/libs/graphics/jswrap_graphics.h +++ b/libs/graphics/jswrap_graphics.h @@ -50,6 +50,7 @@ JsVar *jswrap_graphics_fillEllipse(JsVar *parent, int x, int y, int x2, int y2); int jswrap_graphics_getPixel(JsVar *parent, int x, int y); JsVar *jswrap_graphics_setPixel(JsVar *parent, int x, int y, JsVar *color); unsigned int jswrap_graphics_toColor(JsVar *parent, JsVar *r, JsVar *g, JsVar *b); +unsigned int jswrap_graphics_blendColor(JsVar *parent, JsVar *ca, JsVar *cb, JsVar* amt); JsVar *jswrap_graphics_setColorX(JsVar *parent, JsVar *r, JsVar *g, JsVar *b, bool isForeground); JsVarInt jswrap_graphics_getColorX(JsVar *parent, bool isForeground); JsVar *jswrap_graphics_setClipRect(JsVar *parent, int x1, int y1, int x2, int y2); From 77442413f732dd962ff2c4429e5cc2772879d6fa Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 15:50:32 +0100 Subject: [PATCH 0122/1183] Fix stack overflow if deallocating a massive linked list (fix #2136) --- ChangeLog | 1 + src/jsvar.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c653fc0ce7..04f7096cb2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -38,6 +38,7 @@ Bangle.js: Allow E.showMenu to be given an array and title option (fix #2175) nRF5x: We now clear the console's input line when connecting or disconnecting Bluetooth (fix #2219) Graphics: Add g.blendColor to expose the ability to figure out what color is between two others (fix #2150) + Fix stack overflow if deallocating a massive linked list (fix #2136) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsvar.c b/src/jsvar.c index 577638e723..fef2b3fe3b 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -587,12 +587,17 @@ ALWAYS_INLINE void jsvFreePtr(JsVar *var) { #endif // CLEAR_MEMORY_ON_FREE } else if (jsvHasSingleChild(var)) { if (jsvGetFirstChild(var)) { - JsVar *child = jsvLock(jsvGetFirstChild(var)); - jsvUnRef(child); + if (jsuGetFreeStack() > 256) { + // we have to check stack here in case someone allocates some huge linked list. + // if we just unreference the rest hopefully it'll be cleaned on the next GC pass + // https://github.com/espruino/Espruino/issues/2136 + JsVar *child = jsvLock(jsvGetFirstChild(var)); + jsvUnRef(child); + jsvUnLock(child); // unlock should trigger a free + } #ifdef CLEAR_MEMORY_ON_FREE jsvSetFirstChild(var, 0); // unlink the child #endif // CLEAR_MEMORY_ON_FREE - jsvUnLock(child); // unlock should trigger a free } } /* No else, because a String Name may have a single child, but From d77cc6c61f26a6a13c4abea6b119f7ad52af068a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 15:54:39 +0100 Subject: [PATCH 0123/1183] fix 2065 --- libs/tensorflow/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tensorflow/README.md b/libs/tensorflow/README.md index fa22d0d77a..8b4c326ea2 100644 --- a/libs/tensorflow/README.md +++ b/libs/tensorflow/README.md @@ -21,7 +21,7 @@ cat libs/tensorflow/patches/* | patch -p1 ## Actually using it -Follow the steps here: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/hello_world/create_sine_model.ipynb +Follow the steps here: https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/examples/hello_world/train/train_hello_world_model.ipynb Then right at the end when you have your model, do: From 606ab03c17bdd81d160d67d0fc9d734bcd27e747 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 16:17:11 +0100 Subject: [PATCH 0124/1183] String substr/substring/slice now work on native/flash strings by changing pointers rather than doing an actual copy (fix #2066) --- ChangeLog | 1 + src/jsvar.c | 12 +++++++++++- src/jsvar.h | 2 +- src/jswrap_string.c | 26 ++++++-------------------- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 04f7096cb2..501b2d8287 100644 --- a/ChangeLog +++ b/ChangeLog @@ -39,6 +39,7 @@ nRF5x: We now clear the console's input line when connecting or disconnecting Bluetooth (fix #2219) Graphics: Add g.blendColor to expose the ability to figure out what color is between two others (fix #2150) Fix stack overflow if deallocating a massive linked list (fix #2136) + String substr/substring/slice now work on native/flash strings by changing pointers rather than doing an actual copy (fix #2066) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsvar.c b/src/jsvar.c index fef2b3fe3b..971e8be1db 100644 --- a/src/jsvar.c +++ b/src/jsvar.c @@ -362,7 +362,7 @@ void jsvSetMemoryTotal(unsigned int jsNewVarCount) { #endif } -/// Scan memory to find any JsVar that references a specific memory range, and if so update what it points to to p[oint to the new address +/// Scan memory to find any JsVar that references a specific memory range, and if so update what it points to to point to the new address void jsvUpdateMemoryAddress(size_t oldAddr, size_t length, size_t newAddr) { for (unsigned int i=1;i<=jsVarsSize;i++) { JsVar *v = jsvGetAddressOf((JsVarRef)i); @@ -1752,6 +1752,16 @@ void jsvAppendStringVar(JsVar *var, const JsVar *str, size_t stridx, size_t maxL /** Create a new variable from a substring. argument must be a string. stridx = start char or str, maxLength = max number of characters (can be JSVAPPENDSTRINGVAR_MAXLENGTH) */ JsVar *jsvNewFromStringVar(const JsVar *str, size_t stridx, size_t maxLength) { + if (jsvIsNativeString(str) || jsvIsFlashString(str)) { + // if it's a flash string, just change the pointer (but we must check length) + size_t l = jsvGetStringLength(str); + if (stridx>l) stridx=l; + if (stridx+maxLength>l) maxLength=l-stridx; + JsVar *res = jsvNewWithFlags(str->flags&JSV_VARTYPEMASK); + res->varData.nativeStr.ptr = str->varData.nativeStr.ptr + stridx; + res->varData.nativeStr.len = maxLength; + return res; + } JsVar *var = jsvNewFromEmptyString(); if (var) jsvAppendStringVar(var, str, stridx, maxLength); return var; diff --git a/src/jsvar.h b/src/jsvar.h index ad3a9ca39b..489a4b2270 100644 --- a/src/jsvar.h +++ b/src/jsvar.h @@ -199,7 +199,7 @@ typedef union { JsVarFloat floating; ///< The contents of this variable if it is a double JsVarDataArrayBufferView arraybuffer; ///< information for array buffer views. JsVarDataNative native; ///< A native function - JsVarDataNativeStr nativeStr; ///< A native string + JsVarDataNativeStr nativeStr; ///< A native string (or flash string) JsVarDataRef ref; ///< References } PACKED_FLAGS JsVarData; diff --git a/src/jswrap_string.c b/src/jswrap_string.c index 7aa2bb4e31..9ab1db6770 100644 --- a/src/jswrap_string.c +++ b/src/jswrap_string.c @@ -389,7 +389,6 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) { newSubStr = jsvAsString(newSubStr); subStr = jsvAsString(subStr); - int idx = jswrap_string_indexOf(parent, subStr, 0, false); if (idx>=0) { JsVar *newStr = jsvNewFromStringVar(str, 0, (size_t)idx); @@ -403,20 +402,18 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) { return str; } - /*JSON{ "type" : "method", "class" : "String", "name" : "substring", "generate" : "jswrap_string_substring", "params" : [ - ["start","int","The start character index"], - ["end","JsVar","The end character index"] + ["start","int","The start character index (inclusive)"], + ["end","JsVar","The end character index (exclusive)"] ], "return" : ["JsVar","The part of this string between start and end"] }*/ JsVar *jswrap_string_substring(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { - JsVar *res; JsVarInt pEnd = jsvIsUndefined(vEnd) ? JSVAPPENDSTRINGVAR_MAXLENGTH : (int)jsvGetInteger(vEnd); if (pStart<0) pStart=0; if (pEnd<0) pEnd=0; @@ -425,10 +422,7 @@ JsVar *jswrap_string_substring(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { pStart = pEnd; pEnd = l; } - res = jsvNewFromEmptyString(); - if (!res) return 0; // out of memory - jsvAppendStringVar(res, parent, (size_t)pStart, (size_t)(pEnd-pStart)); - return res; + return jsvNewFromStringVar(parent, (size_t)pStart, (size_t)(pEnd-pStart)); } /*JSON{ @@ -443,15 +437,11 @@ JsVar *jswrap_string_substring(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { "return" : ["JsVar","Part of this string from start for len characters"] }*/ JsVar *jswrap_string_substr(JsVar *parent, JsVarInt pStart, JsVar *vLen) { - JsVar *res; JsVarInt pLen = jsvIsUndefined(vLen) ? JSVAPPENDSTRINGVAR_MAXLENGTH : (int)jsvGetInteger(vLen); if (pLen<0) pLen = 0; if (pStart<0) pStart += (JsVarInt)jsvGetStringLength(parent); if (pStart<0) pStart = 0; - res = jsvNewFromEmptyString(); - if (!res) return 0; // out of memory - jsvAppendStringVar(res, parent, (size_t)pStart, (size_t)pLen); - return res; + return jsvNewFromStringVar(parent, (size_t)pStart, (size_t)pLen); } /*JSON{ @@ -466,17 +456,13 @@ JsVar *jswrap_string_substr(JsVar *parent, JsVarInt pStart, JsVar *vLen) { "return" : ["JsVar","Part of this string from start for len characters"] }*/ JsVar *jswrap_string_slice(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { - JsVar *res; JsVarInt pEnd = jsvIsUndefined(vEnd) ? JSVAPPENDSTRINGVAR_MAXLENGTH : (int)jsvGetInteger(vEnd); if (pStart<0) pStart += (JsVarInt)jsvGetStringLength(parent); if (pEnd<0) pEnd += (JsVarInt)jsvGetStringLength(parent); if (pStart<0) pStart = 0; if (pEnd<0) pEnd = 0; - res = jsvNewFromEmptyString(); - if (!res) return 0; // out of memory - if (pEnd>pStart) - jsvAppendStringVar(res, parent, (size_t)pStart, (size_t)(pEnd-pStart)); - return res; + if (pEnd<=pStart) return jsvNewFromEmptyString(); + return jsvNewFromStringVar(parent, (size_t)pStart, (size_t)(pEnd-pStart)); } From 56fcfacece2ae33dc95d9af774f38702eeb8876b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 16:22:38 +0100 Subject: [PATCH 0125/1183] Fix memory leak in nullish operator --- src/jsparse.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/jsparse.c b/src/jsparse.c index 1df3d7dd9c..f6709f8068 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -1948,11 +1948,10 @@ NO_INLINE JsVar *__jspeBinaryExpression(JsVar *a, unsigned int lastPrecedence) { a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } } else if (op==LEX_NULLISH){ - JsVar* value = jsvSkipName(a); + JsVar* value = jsvSkipNameAndUnLock(a); if (jsvIsNullish(value)) { // use second argument (B) if (!jsvIsUndefined(value)) jsvUnLock(value); - jsvUnLock(a); a = __jspeBinaryExpression(jspeUnaryExpression(),precedence); } else { a = value; From 5f7e10b0b3eed718c22f0bf8af881bb9021a2a22 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 16:23:56 +0100 Subject: [PATCH 0126/1183] extra test --- tests/test_let_in_module.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/test_let_in_module.js diff --git a/tests/test_let_in_module.js b/tests/test_let_in_module.js new file mode 100644 index 0000000000..d693663b28 --- /dev/null +++ b/tests/test_let_in_module.js @@ -0,0 +1,36 @@ +// http://forum.espruino.com/conversations/376541/ +// https://github.com/espruino/Espruino/issues/2215 +// https://github.com/espruino/Espruino/issues/2207 + +()=>{ + const x = 5; + + Modules.addCached("issue2215", function() { + function test(p){ + console.log("Test", p); + } + + let variable_let = { test: test }; + const variable_const = { test: test }; + var variable_var = { test: test }; + + exports.func_let = function (){ + variable_let.test("let"); + }; + + exports.func_const = function (){ + variable_const.test("const"); + }; + + exports.func_var = function (){ + variable_var.test("var"); + }; + }); + + var test = require("issue2215"); + test.func_var(); // ok + test.func_let(); // fail + test.func_const(); // fail + result = true; +}(); + From b8f02822dffc2a013b53c70400407bcc598d8cb1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 16:46:39 +0100 Subject: [PATCH 0127/1183] Fix over-iteration if breaking out of the very first iteration of FOR loop (fix #2012) --- ChangeLog | 1 + src/jsparse.c | 3 ++- tests/test_for_loop_break4.js | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/test_for_loop_break4.js diff --git a/ChangeLog b/ChangeLog index 501b2d8287..63fc0a4157 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,6 +40,7 @@ Graphics: Add g.blendColor to expose the ability to figure out what color is between two others (fix #2150) Fix stack overflow if deallocating a massive linked list (fix #2136) String substr/substring/slice now work on native/flash strings by changing pointers rather than doing an actual copy (fix #2066) + Fix over-iteration if breaking out of the very first iteration of FOR loop (fix #2012) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jsparse.c b/src/jsparse.c index f6709f8068..9e2315063e 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2411,7 +2411,7 @@ NO_INLINE JsVar *jspeStatementSwitch() { return 0; } -// Check whether we received a break/continue while parsing previously. Return true if we had a 'break; +// Check whether we received a break/continue while parsing previously. Return true if we had a 'break' static NO_INLINE bool jspeCheckBreakContinue() { if (execInfo.execute & EXEC_CONTINUE) execInfo.execute = (execInfo.execute & ~EXEC_RUN_MASK) | EXEC_YES; @@ -2681,6 +2681,7 @@ NO_INLINE JsVar *jspeStatementFor() { if (!wasInLoop) execInfo.execute &= (JsExecFlags)~EXEC_IN_LOOP; if (loopCond || !JSP_SHOULD_EXECUTE) { hasHadBreak |= jspeCheckBreakContinue(); + if (hasHadBreak) loopCond = false; // was there break in the very first parse of the body? If so don't iterate! } if (!loopCond) JSP_RESTORE_EXECUTE(); if (loopCond) { diff --git a/tests/test_for_loop_break4.js b/tests/test_for_loop_break4.js new file mode 100644 index 0000000000..08307f94d2 --- /dev/null +++ b/tests/test_for_loop_break4.js @@ -0,0 +1,21 @@ +// http://forum.espruino.com/conversations/364276/#comment16017216 +var lvls = [65535,54038,47824,39322,32768,26526,18388,11818,5958], + halfDiff = 2979; //2958/2 +function anaGetKey(samples){ + var keys = samples.map(function(v) { + var i; + var val = v + halfDiff; + for (i=0; i return "+i); + return i; + }); + console.log(keys); + return keys; +} +result = anaGetKey([6000,12000,54000,65000]) == "8,7,1,0"; +//console.log(result); From 2bfcdfb8531079ebb19abac861bbfc581dac7b65 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 8 Jun 2022 19:20:32 +0100 Subject: [PATCH 0128/1183] JSON.stringify(pin) now returns valid JSON (Pin name as a string). E.toJS still leaves it as an ID (fix #271) --- ChangeLog | 1 + src/jswrap_json.c | 2 +- src/jswrap_json.h | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 63fc0a4157..1d10d08cab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -41,6 +41,7 @@ Fix stack overflow if deallocating a massive linked list (fix #2136) String substr/substring/slice now work on native/flash strings by changing pointers rather than doing an actual copy (fix #2066) Fix over-iteration if breaking out of the very first iteration of FOR loop (fix #2012) + JSON.stringify(pin) now returns valid JSON (Pin name as a string). E.toJS still leaves it as an ID (fix #271) 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/src/jswrap_json.c b/src/jswrap_json.c index 23fd8fd2bf..b8abd4a699 100644 --- a/src/jswrap_json.c +++ b/src/jswrap_json.c @@ -464,7 +464,7 @@ void jsfGetJSONWithCallback(JsVar *var, JsVar *varName, JSONFlags flags, const c cbprintf(user_callback, user_data, "function "); jsfGetJSONForFunctionWithCallback(var, nflags, user_callback, user_data); } - } else if (jsvIsString(var) && !jsvIsName(var)) { + } else if ((jsvIsString(var) && !jsvIsName(var)) || ((flags&JSON_JSON_COMPATIBILE)&&jsvIsPin(var))) { if ((flags&JSON_LIMIT) && jsvGetStringLength(var)>JSON_LIMIT_STRING_AMOUNT) { // if the string is too big, split it and put dots in the middle JsVar *var1 = jsvNewFromStringVar(var, 0, JSON_LIMITED_STRING_AMOUNT); diff --git a/src/jswrap_json.h b/src/jswrap_json.h index 79ea0245ed..92fbd90fd1 100644 --- a/src/jswrap_json.h +++ b/src/jswrap_json.h @@ -28,10 +28,11 @@ typedef enum { JSON_NO_UNDEFINED = 64, //< don't output undefined keys in objects, and use null for undefined in arrays JSON_ARRAYBUFFER_AS_ARRAY = 128, //< dump arraybuffers as arrays JSON_SHOW_OBJECT_NAMES = 256, //< Show 'Promise {}'/etc for objects if the type is global - JSON_DROP_QUOTES = 512, //< When outputting objects, drop quotes for alphanumeric field names - JSON_JSON_COMPATIBILE = 1024, /**< + JSON_DROP_QUOTES = 512, //< When outputting objects, drop quotes for alphanumeric field names + JSON_JSON_COMPATIBILE = 1024, /**< Only use unicode for escape characters - needed for JSON compatibility Don't output NaN for NaN numbers, only 'null' + Convert pins to Strings */ JSON_ALLOW_TOJSON = 2048, //< If there's a .toJSON function in an object, use it and parse that // ... From 984ac383909be40969e1c546840bf41135ceb474 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 9 Jun 2022 09:32:45 +0100 Subject: [PATCH 0129/1183] fix #2220 --- src/jswrap_interactive.c | 4 ++-- src/jswrap_io.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jswrap_interactive.c b/src/jswrap_interactive.c index c6d2f35063..93a632e08f 100644 --- a/src/jswrap_interactive.c +++ b/src/jswrap_interactive.c @@ -545,7 +545,7 @@ JsVar *jswrap_interface_setTimeout(JsVar *func, JsVarFloat timeout, JsVar *args) "name" : "clearInterval", "generate" : "jswrap_interface_clearInterval", "params" : [ - ["id","JsVarArray","The id returned by a previous call to setInterval"] + ["id","JsVarArray","The id returned by a previous call to setInterval. **Only one argument is allowed.**"] ] } Clear the Interval that was created with `setInterval`, for example: @@ -563,7 +563,7 @@ To avoid accidentally deleting all Intervals, if a parameter is supplied but is "name" : "clearTimeout", "generate" : "jswrap_interface_clearTimeout", "params" : [ - ["id","JsVarArray","The id returned by a previous call to setTimeout"] + ["id","JsVarArray","The id returned by a previous call to setTimeout. **Only one argument is allowed.**"] ] } Clear the Timeout that was created with `setTimeout`, for example: diff --git a/src/jswrap_io.c b/src/jswrap_io.c index c7aad37294..c748723c37 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -788,7 +788,7 @@ JsVar *jswrap_interface_setWatch( "name" : "clearWatch", "generate" : "jswrap_interface_clearWatch", "params" : [ - ["id","JsVarArray","The id returned by a previous call to setWatch"] + ["id","JsVarArray","The id returned by a previous call to setWatch. **Only one argument is allowed.**"] ] } Clear the Watch that was created with setWatch. If no parameter is supplied, all watches will be removed. From 4edb72a8f71a2517ea6c8f07f8187c4399e83976 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 9 Jun 2022 09:50:24 +0100 Subject: [PATCH 0130/1183] Bangle.js2: Fix exception when using 'back' and physical button with Bangle.setUI (fix https://github.com/espruino/BangleApps/issues/1904) --- ChangeLog | 1 + libs/js/banglejs/Bangle_setUI_Q3.js | 3 ++- libs/js/banglejs/Bangle_setUI_Q3.min.js | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1d10d08cab..7c8edbf4f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -42,6 +42,7 @@ String substr/substring/slice now work on native/flash strings by changing pointers rather than doing an actual copy (fix #2066) Fix over-iteration if breaking out of the very first iteration of FOR loop (fix #2012) JSON.stringify(pin) now returns valid JSON (Pin name as a string). E.toJS still leaves it as an ID (fix #271) + Bangle.js2: Fix exception when using 'back' and physical button with Bangle.setUI 2v13 : Memory usage improvement: Function scopes no longer stored as an array if they only contain one scope Memory usage improvement: The root scope is never stored in the scope list (it's searched by default) diff --git a/libs/js/banglejs/Bangle_setUI_Q3.js b/libs/js/banglejs/Bangle_setUI_Q3.js index 970e3c58ce..bc5ef506da 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.js @@ -121,13 +121,14 @@ Bangle.on("touch", Bangle.touchHandler); } var btnWatch = setWatch(function() { + btnWatch = undefined; options.back(); }, BTN1, {edge:"falling"}); WIDGETS = Object.assign({back:{ area:"tl", width:24, draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y), remove:(noclear)=>{ - clearWatch(btnWatch); + if (btnWatch) clearWatch(btnWatch); Bangle.removeListener("touch", touchHandler); if (!noclear) g.reset().clearRect({x:WIDGETS.back.x, y:WIDGETS.back.y, w:24,h:24}); delete WIDGETS.back; diff --git a/libs/js/banglejs/Bangle_setUI_Q3.min.js b/libs/js/banglejs/Bangle_setUI_Q3.min.js index 0f8118f12e..e5799897ec 100644 --- a/libs/js/banglejs/Bangle_setUI_Q3.min.js +++ b/libs/js/banglejs/Bangle_setUI_Q3.min.js @@ -1,6 +1,6 @@ -(function(c,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof c&&(b=c,c=b.mode);var l=!0;global.WIDGETS&&WIDGETS.back&&(l=!1,WIDGETS.back.remove(c&&b.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&& +(function(c,e){function f(){try{Bangle.buzz(30)}catch(a){}}var b={};"object"==typeof c&&(b=c,c=b.mode);var m=!0;global.WIDGETS&&WIDGETS.back&&(m=!1,WIDGETS.back.remove(c&&b.back));Bangle.btnWatches&&(Bangle.btnWatches.forEach(clearWatch),delete Bangle.btnWatches);Bangle.swipeHandler&&(Bangle.removeListener("swipe",Bangle.swipeHandler),delete Bangle.swipeHandler);Bangle.dragHandler&&(Bangle.removeListener("drag",Bangle.dragHandler),delete Bangle.dragHandler);Bangle.touchHandler&& (Bangle.removeListener("touch",Bangle.touchHandler),delete Bangle.touchHandler);Bangle.uiRemove&&(Bangle.uiRemove(),delete Bangle.uiRemove);if(c){if("updown"==c){var h=0;Bangle.dragHandler=a=>{h+=a.dy;for(a.b||(h=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("leftright"==c){var k=0;Bangle.dragHandler=a=>{k+=a.dx;for(a.b||(k=0);32{f();e()};Bangle.btnWatches=[setWatch(function(){f();e()},BTN1,{repeat:1})]}else if("clock"==c)Bangle.CLOCK=1,Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})];else if("clockupdown"==c)Bangle.CLOCK=1,Bangle.touchHandler=(a,d)=>{120>d.x||(f(),e(88{f();e(d)};else if("custom"==c)b.clock&&(Bangle.CLOCK=1),b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn?Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]:b.clock&&(Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var m=(a,d)=>{36>d.y&& -48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",m);if(Bangle.touchHandler){var n=Bangle.touchHandler;Bangle.touchHandler=(a,d)=>{d.handled||n(a,d)};Bangle.on("touch",Bangle.touchHandler)}var p=setWatch(function(){b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{clearWatch(p);Bangle.removeListener("touch", -m);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}},global.WIDGETS);l&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file +(a,d)=>{f();e(d)};else if("custom"==c)b.clock&&(Bangle.CLOCK=1),b.touch&&(Bangle.touchHandler=b.touch),b.drag&&(Bangle.dragHandler=b.drag,Bangle.on("drag",Bangle.dragHandler)),b.swipe&&(Bangle.swipeHandler=b.swipe,Bangle.on("swipe",Bangle.swipeHandler)),b.btn?Bangle.btnWatches=[setWatch(function(){b.btn(1)},BTN1,{repeat:1,edge:"falling"})]:b.clock&&(Bangle.btnWatches=[setWatch(Bangle.showLauncher,BTN1,{repeat:1,edge:"falling"})]);else throw Error("Unknown UI mode");if(b.back){var n=(a,d)=>{36>d.y&& +48>d.x&&(d.handled=!0,b.back())};Bangle.on("touch",n);if(Bangle.touchHandler){var p=Bangle.touchHandler;Bangle.touchHandler=(a,d)=>{d.handled||p(a,d)};Bangle.on("touch",Bangle.touchHandler)}var l=setWatch(function(){l=void 0;b.back()},BTN1,{edge:"falling"});WIDGETS=Object.assign({back:{area:"tl",width:24,draw:a=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),a.x,a.y),remove:a=>{l&&clearWatch(l); +Bangle.removeListener("touch",n);a||g.reset().clearRect({x:WIDGETS.back.x,y:WIDGETS.back.y,w:24,h:24});delete WIDGETS.back;a||Bangle.drawWidgets()}}},global.WIDGETS);m&&Bangle.drawWidgets()}else if(Bangle.touchHandler)Bangle.on("touch",Bangle.touchHandler)}}) \ No newline at end of file From af8e933289968020d40fc55b18be8879ac55f085 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 9 Jun 2022 15:42:59 +0100 Subject: [PATCH 0131/1183] 2v14 release --- libs/banglejs/banglejs1_storage_default.c | 3423 ++++++++------- libs/banglejs/banglejs2_storage_default.c | 4758 +++++++++++---------- scripts/build_docs.py | 2 +- src/jsutils.h | 4 +- 4 files changed, 4399 insertions(+), 3788 deletions(-) diff --git a/libs/banglejs/banglejs1_storage_default.c b/libs/banglejs/banglejs1_storage_default.c index d1f8263990..82a8d60986 100644 --- a/libs/banglejs/banglejs1_storage_default.c +++ b/libs/banglejs/banglejs1_storage_default.c @@ -1,7 +1,7 @@ // Initial storage contents for Bangle.js 2.0 // Generated by BangleApps/bin/build_bangles_c.js -const int jsfStorageInitialContentLength = 59304; +const int jsfStorageInitialContentLength = 68956; const char jsfStorageInitialContents[] = { 48,0,0,0,46,98,111,111,116,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 10,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98, @@ -23,7 +23,7 @@ const char jsfStorageInitialContents[] = { 116,87,97,116,99,104,40,40,41,61,62,123,66,97,110,103,108,101,46,115,104,111,119,76,97,117,110,99,104,101,114,40, 41,59,125,44,32,103,108,111,98,97,108,46,66,84,78,50,124,124,66,84,78,44,32,123,114,101,112,101,97,116,58,102, 97,108,115,101,44,101,100,103,101,58,34,102,97,108,108,105,110,103,34,125,41,59,96,59,10,101,118,97,108,40,99,108, -111,99,107,65,112,112,41,59,10,190,99,108,111,99,107,65,112,112,59,255,18,31,0,0,98,111,111,116,117,112,100,97, +111,99,107,65,112,112,41,59,10,190,99,108,111,99,107,65,112,112,59,255,141,31,0,0,98,111,111,116,117,112,100,97, 116,101,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,69,46,115,104,111,119,77,101,115,115,97, 103,101,40,34,85,112,100,97,116,105,110,103,32,98,111,111,116,48,46,46,46,34,41,59,10,172,115,61,114,101,113,117, 105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103, @@ -263,1598 +263,1899 @@ const char jsfStorageInitialContents[] = { 40,39,46,98,111,111,116,48,39,44,34,47,47,34,43,98,111,111,116,70,105,108,101,43,34,92,110,34,44,102,105,108, 101,79,102,102,115,101,116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,43,98,111,111,116,70,105,108,101,46,108, 101,110,103,116,104,43,49,59,172,98,102,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114, -101,97,100,40,98,111,111,116,70,105,108,101,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41, -46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,102,44,102,105,108,101,79,102,102,115,101,116,41,59,102, -105,108,101,79,102,102,115,101,116,150,98,102,46,108,101,110,103,116,104,59,114,101,113,117,105,114,101,40,39,83,116,111, -114,97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,34,59,92,110,34,44,102,105,108,101, -79,102,102,115,101,116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,59,125,41,59,114,101,113,117,105,114,101,40, -39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,111,111,116,80,111, -115,116,44,102,105,108,101,79,102,102,115,101,116,41,59,190,98,111,111,116,59,190,98,111,111,116,80,111,115,116,59,190, -98,111,111,116,70,105,108,101,115,59,190,102,105,108,101,83,105,122,101,59,190,102,105,108,101,79,102,102,115,101,116,59, -69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,82,101,108,111,97,100,105,110,103,46,46,46,34,41,59,101,118, -97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,46,98,111,111, -116,48,39,41,41,59,255,255,157,0,0,0,98,111,111,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,98,111,111,116,34,44,34,110,97,109,101,34,58,34,66,111,111, -116,108,111,97,100,101,114,34,44,34,116,121,112,101,34,58,34,98,111,111,116,108,111,97,100,101,114,34,44,34,115,111, -114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,55,34,44,34,116, -97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,98,111,111,116, -46,105,110,102,111,44,46,98,111,111,116,48,44,46,98,111,111,116,99,100,101,44,98,111,111,116,117,112,100,97,116,101, -46,106,115,34,125,255,255,255,164,6,0,0,108,97,117,110,99,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172, -115,99,97,108,101,118,97,108,61,49,59,10,172,118,101,99,116,111,114,118,97,108,61,50,48,59,10,172,102,111,110,116, -61,103,46,103,101,116,70,111,110,116,115,40,41,46,105,110,99,108,117,100,101,115,40,34,49,50,120,50,48,34,41,63, -34,49,50,120,50,48,34,58,34,54,120,56,58,50,34,59,10,173,115,101,116,116,105,110,103,115,61,79,98,106,101,99, -116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,125,44,115,46,114,101,97,100,74,83, -79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,10,163,40,34,118,101,99,116, -111,114,115,105,122,101,34,185,115,101,116,116,105,110,103,115,41,123,118,101,99,116,111,114,118,97,108,61,112,97,114,115, -101,73,110,116,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122,101,41,59,125,10,163,40,34,102, -111,110,116,34,185,115,101,116,116,105,110,103,115,41,123,163,40,115,101,116,116,105,110,103,115,46,102,111,110,116,138,34, -86,101,99,116,111,114,34,41,123,115,99,97,108,101,118,97,108,61,118,101,99,116,111,114,118,97,108,47,50,48,59,102, -111,110,116,61,34,86,101,99,116,111,114,34,43,40,118,101,99,116,111,114,118,97,108,41,46,116,111,83,116,114,105,110, -103,40,41,59,125,164,123,102,111,110,116,61,115,101,116,116,105,110,103,115,46,102,111,110,116,59,115,99,97,108,101,118, -97,108,61,40,102,111,110,116,46,115,112,108,105,116,40,34,120,34,41,91,49,93,41,47,50,48,59,125,125,10,172,97, -112,112,115,61,115,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,46,109,97,112,40,97,112,112,162,123,172, -97,61,115,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,97,158,123,110,97,109,101,58,97,46,110, -97,109,101,44,116,121,112,101,58,97,46,116,121,112,101,44,105,99,111,110,58,97,46,105,99,111,110,44,115,111,114,116, -111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,44,115,114,99,58,97,46,115,114,99,125,59,125,41,46, -102,105,108,116,101,114,40,97,112,112,162,97,112,112,158,40,97,112,112,46,116,121,112,101,138,34,97,112,112,34,160,40, -97,112,112,46,116,121,112,101,138,34,99,108,111,99,107,34,158,115,101,116,116,105,110,103,115,46,115,104,111,119,67,108, -111,99,107,115,41,160,33,97,112,112,46,116,121,112,101,41,41,59,10,97,112,112,115,46,115,111,114,116,40,40,97,44, -98,41,162,123,172,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111,114,116, -111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41,171,45, -49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,59,10,97,112,112,115, -46,102,111,114,69,97,99,104,40,97,112,112,162,123,163,40,97,112,112,46,105,99,111,110,41,97,112,112,46,105,99,111, -110,61,115,46,114,101,97,100,40,97,112,112,46,105,99,111,110,41,59,125,41,59,10,163,40,103,46,119,114,97,112,83, -116,114,105,110,103,41,123,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,59,97,112,112,115,46,102,111,114,69, -97,99,104,40,97,112,112,162,97,112,112,46,110,97,109,101,61,103,46,119,114,97,112,83,116,114,105,110,103,40,97,112, -112,46,110,97,109,101,44,103,46,103,101,116,87,105,100,116,104,40,41,45,54,52,41,46,106,111,105,110,40,34,92,110, -34,41,41,59,125,10,170,100,114,97,119,65,112,112,40,105,44,114,41,123,172,97,112,112,61,97,112,112,115,91,105,93, -59,163,40,33,97,112,112,41,171,59,103,46,99,108,101,97,114,82,101,99,116,40,40,114,46,120,41,44,40,114,46,121, -41,44,40,114,46,120,43,114,46,119,45,49,41,44,40,114,46,121,43,114,46,104,45,49,41,41,59,103,46,115,101,116, -70,111,110,116,40,102,111,110,116,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,48,41,46,100,114, -97,119,83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,54,52,42,115,99,97,108,101,118,97,108,44,114,46, -121,43,40,51,50,42,115,99,97,108,101,118,97,108,41,41,59,163,40,97,112,112,46,105,99,111,110,41,177,123,103,46, -100,114,97,119,73,109,97,103,101,40,97,112,112,46,105,99,111,110,44,56,42,115,99,97,108,101,118,97,108,44,114,46, -121,43,40,56,42,115,99,97,108,101,118,97,108,41,44,123,115,99,97,108,101,58,115,99,97,108,101,118,97,108,125,41, -59,125,99,97,116,99,104,40,101,41,123,125,125,10,103,46,99,108,101,97,114,40,41,59,10,66,97,110,103,108,101,46, -108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, -115,40,41,59,10,69,46,115,104,111,119,83,99,114,111,108,108,101,114,40,123,104,58,54,52,42,115,99,97,108,101,118, -97,108,44,99,58,97,112,112,115,46,108,101,110,103,116,104,44,100,114,97,119,58,100,114,97,119,65,112,112,44,115,101, -108,101,99,116,58,105,162,123,172,97,112,112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,163,40, -33,97,112,112,46,115,114,99,160,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100, -40,97,112,112,46,115,114,99,41,139,183,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,65,112,112,32, -83,111,117,114,99,101,92,110,78,111,116,32,102,111,117,110,100,34,41,59,115,101,116,84,105,109,101,111,117,116,40,100, -114,97,119,77,101,110,117,44,50,48,48,48,41,59,125,164,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34, -76,111,97,100,105,110,103,46,46,46,34,41,59,108,111,97,100,40,97,112,112,46,115,114,99,41,59,125,125,125,41,59, -10,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,41,123,115,101,116,87, -97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,44,123,101,100,103,101,58,34,102,97,108,108,105,110, -103,34,125,41,59,125,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,181,41,59,10,172,108,111,99, -107,84,105,109,101,111,117,116,59,10,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,108,111,99,107,101, -100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108,111, -99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107,101, -100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100,40, -41,44,49,48,48,48,48,41,59,125,41,59,180,2,0,0,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46, -106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,79, -98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,125,44,114,101,113,117, -105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46, -106,115,111,110,34,44,180,41,160,123,125,41,59,173,102,111,110,116,115,61,103,46,103,101,116,70,111,110,116,115,40,41, -59,170,115,97,118,101,40,107,101,121,44,118,97,108,117,101,41,123,115,101,116,116,105,110,103,115,91,107,101,121,93,61, -118,97,108,117,101,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34, -108,97,117,110,99,104,46,106,115,111,110,34,44,115,101,116,116,105,110,103,115,41,59,125,174,97,112,112,77,101,110,117, -61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,76,97,117,110,99,104,101,114,32,83,101,116,116,105,110,103,115, -34,125,44,34,60,32,66,97,99,107,34,58,98,97,99,107,44,34,70,111,110,116,34,58,123,118,97,108,117,101,58,102, -111,110,116,115,46,105,110,99,108,117,100,101,115,40,115,101,116,116,105,110,103,115,46,102,111,110,116,41,63,102,111,110, -116,115,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,102,111,110,116,41,58,102,111,110,116,115,46, -105,110,100,101,120,79,102,40,34,49,50,120,50,48,34,41,44,109,105,110,58,48,44,109,97,120,58,102,111,110,116,115, -46,108,101,110,103,116,104,45,49,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,40,109,41,162,123,115,97,118,101,40,34,102,111,110,116,34,44,102,111,110,116,115,91,109,93,41,125,44,102,111,114, -109,97,116,58,118,162,102,111,110,116,115,91,118,93,125,44,34,86,101,99,116,111,114,32,102,111,110,116,32,115,105,122, -101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122,101,160,49,48, -44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110,99, -104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115,105,122,101,34,44,109,41,125, -125,44,34,83,104,111,119,32,99,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46, -115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58,34,78, -111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115,104,111,119,67,108,111,99,107, -115,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117,40,97,112,112,77,101,110,117,41,59,125,41,59, -210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34,110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34, -44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34,44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97, -112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34, -58,34,48,46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110, -99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108,97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99, -104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97, -116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110,34,125,255,255,133,11,0,0,109,99,108,111,99,107,46,97, -112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,105,115,49,50,72,111,117,114,61,40,114, -101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116, -105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41,91,34,49,50,104,111,117,114,34,93,59,10,172,108,111,99, -97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,10,172,67,72,65,82,87,61,51,52, -59,10,172,67,72,65,82,80,61,50,59,10,172,89,61,53,48,59,10,172,98,117,102,61,71,114,97,112,104,105,99,115, -46,99,114,101,97,116,101,65,114,114,97,121,66,117,102,102,101,114,40,67,72,65,82,87,43,67,72,65,82,80,42,50, -44,67,72,65,82,87,42,50,43,67,72,65,82,80,42,50,44,49,44,123,109,115,98,58,180,125,41,59,10,172,98,117, -102,105,109,103,61,123,119,105,100,116,104,58,98,117,102,46,103,101,116,87,105,100,116,104,40,41,44,104,101,105,103,104, -116,58,98,117,102,46,103,101,116,72,101,105,103,104,116,40,41,44,98,117,102,102,101,114,58,98,117,102,46,98,117,102, -102,101,114,125,59,10,172,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45,34,59,10,172,97,110,105,109,73,110, -116,101,114,118,97,108,59,10,172,116,105,109,101,73,110,116,101,114,118,97,108,59,10,174,68,73,71,73,84,83,61,123, -34,32,34,58,110,162,91,93,44,34,48,34,58,110,162,91,91,110,44,48,44,49,44,48,93,44,91,49,44,48,44,49, -44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50,93,44,91,110,44,49,44,110,44,50, -93,44,91,110,44,48,44,110,44,49,93,93,44,34,49,34,58,110,162,91,91,49,45,110,44,48,44,49,44,48,93,44, -91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49,44,49,44,49,93,44,91,49,45,110,44,49,44,49,45,110, -44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93,44,34,50,34,58,110,162,91,91,48,44,48,44,49,44,48, -93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,48,44,49,43,110,44,48,44,50, -93,44,91,49,44,50,45,110,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,93,44,34,51,34,58,110,162,91, -91,48,44,48,44,49,45,110,44,48,93,44,91,48,44,48,44,48,44,110,93,44,91,49,44,48,44,49,44,49,93,44, -91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50,93,93,44,34, -52,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,49,44,48,44,49,45,110,44,48,93,44,91,49,44,48, -44,49,44,49,45,110,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,49,45,110, -44,50,44,49,44,50,93,93,44,34,53,116,111,48,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44, -48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44, -49,44,50,93,44,91,48,44,50,44,48,44,50,93,44,91,49,44,49,45,110,44,49,44,49,93,44,91,48,44,49,44, -48,44,49,43,110,93,93,44,34,53,116,111,54,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48, -44,49,44,48,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49, -44,50,93,44,91,48,44,50,45,110,44,48,44,50,93,93,44,34,54,34,58,110,162,91,91,48,44,48,44,48,44,49, -45,110,93,44,91,48,44,48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93,44,91,49,44,49,45,110,44,49, -44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50,93,44,91,48,44,49,45,110,44,48, -44,50,45,50,42,110,93,93,44,34,55,34,58,110,162,91,91,48,44,48,44,48,44,110,93,44,91,48,44,48,44,49, -44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49,44,49,44,49,93,44,91,49,44,49,44,49, -44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,44,91,49,45,110,44,49,44,49,45,110,44,50,93,93,44,34, -56,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49, -44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50, -93,44,91,48,44,49,44,48,44,50,45,110,93,93,44,34,57,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, -91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,45,110,44,49,93,44, -91,48,44,49,44,48,44,49,43,110,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,93, -44,34,58,34,58,110,162,91,91,48,46,52,44,48,46,52,44,48,46,54,44,48,46,52,93,44,91,48,46,54,44,48, -46,52,44,48,46,54,44,48,46,54,93,44,91,48,46,54,44,48,46,54,44,48,46,52,44,48,46,54,93,44,91,48, -46,52,44,48,46,52,44,48,46,52,44,48,46,54,93,44,91,48,46,52,44,49,46,52,44,48,46,54,44,49,46,52, -93,44,91,48,46,54,44,49,46,52,44,48,46,54,44,49,46,54,93,44,91,48,46,54,44,49,46,54,44,48,46,52, -44,49,46,54,93,44,91,48,46,52,44,49,46,52,44,48,46,52,44,49,46,54,93,93,125,59,10,170,100,114,97,119, -68,105,103,105,116,115,40,108,97,115,116,84,101,120,116,44,116,104,105,115,84,101,120,116,44,110,41,123,34,114,97,109, -34,174,112,61,67,72,65,82,80,59,174,115,61,67,72,65,82,87,59,172,120,61,48,59,103,46,114,101,115,101,116,40, -41,59,167,40,172,105,61,48,59,105,60,108,97,115,116,84,101,120,116,46,108,101,110,103,116,104,59,105,152,41,123,172, -108,97,115,116,67,104,61,108,97,115,116,84,101,120,116,91,105,93,59,172,116,104,105,115,67,104,61,116,104,105,115,84, -101,120,116,91,105,93,59,163,40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59,163,40,108,97,115,116,67,104, -140,116,104,105,115,67,104,41,123,172,99,104,44,99,104,110,61,110,59,163,40,40,116,104,105,115,67,104,45,49,138,108, -97,115,116,67,104,160,40,116,104,105,115,67,104,138,48,158,108,97,115,116,67,104,138,53,41,160,40,116,104,105,115,67, -104,138,48,158,108,97,115,116,67,104,138,57,41,41,41,99,104,61,108,97,115,116,67,104,59,164,123,99,104,61,116,104, -105,115,67,104,59,99,104,110,61,48,59,125,98,117,102,46,99,108,101,97,114,40,41,59,163,40,99,104,138,34,53,34, -41,99,104,61,40,108,97,115,116,67,104,138,53,158,116,104,105,115,67,104,138,48,41,63,34,53,116,111,48,34,58,34, -53,116,111,54,34,59,172,108,61,68,73,71,73,84,83,91,99,104,93,40,99,104,110,41,59,108,46,102,111,114,69,97, -99,104,40,99,162,123,163,40,99,91,48,93,140,99,91,50,93,41,98,117,102,46,102,105,108,108,82,101,99,116,40,112, -43,99,91,48,93,42,115,44,99,91,49,93,42,115,44,112,43,99,91,50,93,42,115,44,50,42,112,43,99,91,51,93, -42,115,41,59,164,163,40,99,91,49,93,140,99,91,51,93,41,98,117,102,46,102,105,108,108,82,101,99,116,40,99,91, -48,93,42,115,44,112,43,99,91,49,93,42,115,44,50,42,112,43,99,91,50,93,42,115,44,112,43,99,91,51,93,42, -115,41,59,125,41,59,103,46,100,114,97,119,73,109,97,103,101,40,98,117,102,105,109,103,44,120,44,89,41,59,125,163, -40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59,120,150,115,43,112,43,55,59,125,125,10,170,100,114,97,119, -69,118,101,114,121,116,104,105,110,103,69,108,115,101,40,41,123,172,120,61,40,67,72,65,82,87,43,67,72,65,82,80, -43,54,41,42,53,59,172,121,61,89,43,50,42,67,72,65,82,87,43,67,72,65,82,80,59,172,100,61,184,68,97,116, -101,40,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,41,59,103, -46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,100,114,97,119,83,116,114,105,110, -103,40,40,34,48,34,43,100,46,103,101,116,83,101,99,111,110,100,115,40,41,41,46,115,117,98,115,116,114,40,45,50, -41,44,120,44,121,45,56,44,180,41,59,163,40,105,115,49,50,72,111,117,114,41,103,46,100,114,97,119,83,116,114,105, -110,103,40,40,100,46,103,101,116,72,111,117,114,115,40,41,60,49,50,41,63,34,65,77,34,58,34,80,77,34,44,120, -44,89,43,52,44,180,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,172,100,97, -116,101,61,108,111,99,97,108,101,46,100,97,116,101,40,100,44,181,41,59,103,46,100,114,97,119,83,116,114,105,110,103, -40,100,97,116,101,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,121,43,56,44,180,41,59,125,10,170,115, -104,111,119,84,105,109,101,40,41,123,163,40,97,110,105,109,73,110,116,101,114,118,97,108,41,171,59,172,100,61,184,68, -97,116,101,40,41,59,172,104,111,117,114,115,61,100,46,103,101,116,72,111,117,114,115,40,41,59,163,40,105,115,49,50, -72,111,117,114,41,104,111,117,114,115,61,40,40,104,111,117,114,115,43,49,49,41,37,49,50,41,43,49,59,172,116,61, -40,34,32,34,43,104,111,117,114,115,41,46,115,117,98,115,116,114,40,45,50,41,43,34,58,34,43,40,34,48,34,43, -100,46,103,101,116,77,105,110,117,116,101,115,40,41,41,46,115,117,98,115,116,114,40,45,50,41,59,172,108,61,108,97, -115,116,84,105,109,101,59,163,40,116,138,108,160,108,138,34,45,45,45,45,45,34,41,123,100,114,97,119,68,105,103,105, -116,115,40,108,44,116,44,48,41,59,100,114,97,119,69,118,101,114,121,116,104,105,110,103,69,108,115,101,40,41,59,108, -97,115,116,84,105,109,101,61,116,59,171,59,125,172,110,61,48,59,97,110,105,109,73,110,116,101,114,118,97,108,61,115, -101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,49,47,49,48,59,163,40,110,145,49,41,123,110,61,49, -59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73,110,116,101,114,118,97,108,41,59,97,110,105, -109,73,110,116,101,114,118,97,108,61,183,59,125,100,114,97,119,68,105,103,105,116,115,40,108,44,116,44,110,41,59,125, -44,50,48,41,59,108,97,115,116,84,105,109,101,61,116,59,125,10,66,97,110,103,108,101,46,111,110,40,39,108,99,100, -80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,97,110,105,109,73,110,116,101,114,118,97,108,41,123,99,108,101, -97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73,110,116,101,114,118,97,108,41,59,97,110,105,109,73,110,116, -101,114,118,97,108,61,183,59,125,163,40,116,105,109,101,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110, -116,101,114,118,97,108,40,116,105,109,101,73,110,116,101,114,118,97,108,41,59,116,105,109,101,73,110,116,101,114,118,97, -108,61,183,59,125,163,40,111,110,41,123,115,104,111,119,84,105,109,101,40,41,59,116,105,109,101,73,110,116,101,114,118, -97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44,49,48,48,48,41,59,125,164, -123,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45,34,59,125,125,41,59,10,103,46,99,108,101,97,114,40,41, -59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100, -114,97,119,87,105,100,103,101,116,115,40,41,59,10,116,105,109,101,73,110,116,101,114,118,97,108,61,115,101,116,73,110, -116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44,49,48,48,48,41,59,10,115,104,111,119,84,105,109,101,40, -41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40,34,99,108,111,99,107,34,41,59,255,255,255,131,4,0,0, -109,99,108,111,99,107,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,4,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +101,97,100,40,98,111,111,116,70,105,108,101,41,59,172,98,102,108,101,110,61,98,102,46,108,101,110,103,116,104,59,172, +98,102,111,102,102,115,101,116,61,48,59,166,40,98,102,108,101,110,41,123,172,98,102,99,104,117,110,107,61,77,97,116, +104,46,109,105,110,40,98,102,108,101,110,44,50,48,52,56,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114,97, +103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,102,46,115,117,98,115,116,114,40,98,102, +111,102,102,115,101,116,44,98,102,99,104,117,110,107,41,44,102,105,108,101,79,102,102,115,101,116,41,59,102,105,108,101, +79,102,102,115,101,116,150,98,102,99,104,117,110,107,59,98,102,111,102,102,115,101,116,150,98,102,99,104,117,110,107,59, +98,102,108,101,110,151,98,102,99,104,117,110,107,59,125,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39, +41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,34,59,92,110,34,44,102,105,108,101,79,102,102,115,101, +116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,59,125,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,111,111,116,80,111,115,116,44,102,105, +108,101,79,102,102,115,101,116,41,59,190,98,111,111,116,59,190,98,111,111,116,80,111,115,116,59,190,98,111,111,116,70, +105,108,101,115,59,190,102,105,108,101,83,105,122,101,59,190,102,105,108,101,79,102,102,115,101,116,59,69,46,115,104,111, +119,77,101,115,115,97,103,101,40,34,82,101,108,111,97,100,105,110,103,46,46,46,34,41,59,101,118,97,108,40,114,101, +113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,46,98,111,111,116,48,39,41,41, +59,255,255,255,157,0,0,0,98,111,111,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,98,111,111,116,34,44,34,110,97,109,101,34,58,34,66,111,111,116,108,111,97, +100,101,114,34,44,34,116,121,112,101,34,58,34,98,111,111,116,108,111,97,100,101,114,34,44,34,115,111,114,116,111,114, +100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,56,34,44,34,116,97,103,115,34, +58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,98,111,111,116,46,105,110,102, +111,44,46,98,111,111,116,48,44,46,98,111,111,116,99,100,101,44,98,111,111,116,117,112,100,97,116,101,46,106,115,34, +125,255,255,255,201,6,0,0,108,97,117,110,99,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172,115,99,97,108, +101,118,97,108,61,49,59,10,172,118,101,99,116,111,114,118,97,108,61,50,48,59,10,172,102,111,110,116,61,103,46,103, +101,116,70,111,110,116,115,40,41,46,105,110,99,108,117,100,101,115,40,34,49,50,120,50,48,34,41,63,34,49,50,120, +50,48,34,58,34,54,120,56,58,50,34,59,10,173,115,101,116,116,105,110,103,115,61,79,98,106,101,99,116,46,97,115, +115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102,117,108,108,115,99,114,101,101,110,58,181,125, +44,115,46,114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41, +59,10,163,40,34,118,101,99,116,111,114,115,105,122,101,34,185,115,101,116,116,105,110,103,115,41,123,118,101,99,116,111, +114,118,97,108,61,112,97,114,115,101,73,110,116,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122, +101,41,59,125,10,163,40,34,102,111,110,116,34,185,115,101,116,116,105,110,103,115,41,123,163,40,115,101,116,116,105,110, +103,115,46,102,111,110,116,138,34,86,101,99,116,111,114,34,41,123,115,99,97,108,101,118,97,108,61,118,101,99,116,111, +114,118,97,108,47,50,48,59,102,111,110,116,61,34,86,101,99,116,111,114,34,43,40,118,101,99,116,111,114,118,97,108, +41,46,116,111,83,116,114,105,110,103,40,41,59,125,164,123,102,111,110,116,61,115,101,116,116,105,110,103,115,46,102,111, +110,116,59,115,99,97,108,101,118,97,108,61,40,102,111,110,116,46,115,112,108,105,116,40,34,120,34,41,91,49,93,41, +47,50,48,59,125,125,10,172,97,112,112,115,61,115,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,46,109, +97,112,40,97,112,112,162,123,172,97,61,115,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,97,158, +123,110,97,109,101,58,97,46,110,97,109,101,44,116,121,112,101,58,97,46,116,121,112,101,44,105,99,111,110,58,97,46, +105,99,111,110,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,44,115,114,99,58,97, +46,115,114,99,125,59,125,41,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,158,40,97,112,112,46,116,121,112, +101,138,34,97,112,112,34,160,40,97,112,112,46,116,121,112,101,138,34,99,108,111,99,107,34,158,115,101,116,116,105,110, +103,115,46,115,104,111,119,67,108,111,99,107,115,41,160,33,97,112,112,46,116,121,112,101,41,41,59,10,97,112,112,115, +46,115,111,114,116,40,40,97,44,98,41,162,123,172,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45, +40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60, +98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48, +59,125,41,59,10,97,112,112,115,46,102,111,114,69,97,99,104,40,97,112,112,162,123,163,40,97,112,112,46,105,99,111, +110,41,97,112,112,46,105,99,111,110,61,115,46,114,101,97,100,40,97,112,112,46,105,99,111,110,41,59,125,41,59,10, +163,40,103,46,119,114,97,112,83,116,114,105,110,103,41,123,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,59, +97,112,112,115,46,102,111,114,69,97,99,104,40,97,112,112,162,97,112,112,46,110,97,109,101,61,103,46,119,114,97,112, +83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,103,46,103,101,116,87,105,100,116,104,40,41,45,54,52,41, +46,106,111,105,110,40,34,92,110,34,41,41,59,125,10,170,100,114,97,119,65,112,112,40,105,44,114,41,123,172,97,112, +112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,103,46,99,108,101,97,114,82,101,99,116,40,40, +114,46,120,41,44,40,114,46,121,41,44,40,114,46,120,43,114,46,119,45,49,41,44,40,114,46,121,43,114,46,104,45, +49,41,41,59,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,46,115,101,116,70,111,110,116,65,108,105,103,110, +40,45,49,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,54,52,42,115,99, +97,108,101,118,97,108,44,114,46,121,43,40,51,50,42,115,99,97,108,101,118,97,108,41,41,59,163,40,97,112,112,46, +105,99,111,110,41,177,123,103,46,100,114,97,119,73,109,97,103,101,40,97,112,112,46,105,99,111,110,44,56,42,115,99, +97,108,101,118,97,108,44,114,46,121,43,40,56,42,115,99,97,108,101,118,97,108,41,44,123,115,99,97,108,101,58,115, +99,97,108,101,118,97,108,125,41,59,125,99,97,116,99,104,40,101,41,123,125,125,10,103,46,99,108,101,97,114,40,41, +59,10,163,40,33,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,41,123,66,97,110,103,108,101, +46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, +115,40,41,59,125,10,69,46,115,104,111,119,83,99,114,111,108,108,101,114,40,123,104,58,54,52,42,115,99,97,108,101, +118,97,108,44,99,58,97,112,112,115,46,108,101,110,103,116,104,44,100,114,97,119,58,100,114,97,119,65,112,112,44,115, +101,108,101,99,116,58,105,162,123,172,97,112,112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,163, +40,33,97,112,112,46,115,114,99,160,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97, +100,40,97,112,112,46,115,114,99,41,139,183,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,65,112,112, +32,83,111,117,114,99,101,92,110,78,111,116,32,102,111,117,110,100,34,41,59,115,101,116,84,105,109,101,111,117,116,40, +100,114,97,119,77,101,110,117,44,50,48,48,48,41,59,125,164,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40, +34,76,111,97,100,105,110,103,46,46,46,34,41,59,108,111,97,100,40,97,112,112,46,115,114,99,41,59,125,125,125,41, +59,10,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,41,123,115,101,116, +87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,44,123,101,100,103,101,58,34,102,97,108,108,105, +110,103,34,125,41,59,125,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,181,41,59,10,172,108,111, +99,107,84,105,109,101,111,117,116,59,10,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,108,111,99,107, +101,100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108, +111,99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107, +101,100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100, +40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,29,3,0,0,108,97,117,110,99,104,46,115,101,116,116,105, +110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, +103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102, +117,108,108,115,99,114,101,101,110,58,181,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, +114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,173,102, +111,110,116,115,61,103,46,103,101,116,70,111,110,116,115,40,41,59,170,115,97,118,101,40,107,101,121,44,118,97,108,117, +101,41,123,115,101,116,116,105,110,103,115,91,107,101,121,93,61,118,97,108,117,101,59,114,101,113,117,105,114,101,40,34, +83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,115,101, +116,116,105,110,103,115,41,59,125,174,97,112,112,77,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34, +76,97,117,110,99,104,101,114,34,125,44,34,60,32,66,97,99,107,34,58,98,97,99,107,44,34,70,111,110,116,34,58, +123,118,97,108,117,101,58,102,111,110,116,115,46,105,110,99,108,117,100,101,115,40,115,101,116,116,105,110,103,115,46,102, +111,110,116,41,63,102,111,110,116,115,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,102,111,110,116, +41,58,102,111,110,116,115,46,105,110,100,101,120,79,102,40,34,49,50,120,50,48,34,41,44,109,105,110,58,48,44,109, +97,120,58,102,111,110,116,115,46,108,101,110,103,116,104,45,49,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44, +111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,102,111,110,116,34,44,102,111,110,116,115,91, +109,93,41,125,44,102,111,114,109,97,116,58,118,162,102,111,110,116,115,91,118,93,125,44,34,86,101,99,116,111,114,32, +70,111,110,116,32,83,105,122,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,101,99,116,111, +114,115,105,122,101,160,49,48,44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114, +97,112,58,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115, +105,122,101,34,44,109,41,125,125,44,34,83,104,111,119,32,67,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115, +101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63, +34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115, +104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115,99,114,101,101,110,34,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,138,180,44,102,111,114,109,97,116, +58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97, +118,101,40,34,102,117,108,108,115,99,114,101,101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117, +40,97,112,112,77,101,110,117,41,59,125,41,59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34, +110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34, +44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101, +114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,51,34,44,34,116,97,103,115,34,58,34, +116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108, +97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46, +115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110, +34,125,255,255,133,11,0,0,109,99,108,111,99,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,172,105,115,49,50,72,111,117,114,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34, +41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41, +91,34,49,50,104,111,117,114,34,93,59,10,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,59,10,172,67,72,65,82,87,61,51,52,59,10,172,67,72,65,82,80,61,50,59,10,172,89,61,53, +48,59,10,172,98,117,102,61,71,114,97,112,104,105,99,115,46,99,114,101,97,116,101,65,114,114,97,121,66,117,102,102, +101,114,40,67,72,65,82,87,43,67,72,65,82,80,42,50,44,67,72,65,82,87,42,50,43,67,72,65,82,80,42,50, +44,49,44,123,109,115,98,58,180,125,41,59,10,172,98,117,102,105,109,103,61,123,119,105,100,116,104,58,98,117,102,46, +103,101,116,87,105,100,116,104,40,41,44,104,101,105,103,104,116,58,98,117,102,46,103,101,116,72,101,105,103,104,116,40, +41,44,98,117,102,102,101,114,58,98,117,102,46,98,117,102,102,101,114,125,59,10,172,108,97,115,116,84,105,109,101,61, +34,45,45,45,45,45,34,59,10,172,97,110,105,109,73,110,116,101,114,118,97,108,59,10,172,116,105,109,101,73,110,116, +101,114,118,97,108,59,10,174,68,73,71,73,84,83,61,123,34,32,34,58,110,162,91,93,44,34,48,34,58,110,162,91, +91,110,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110, +44,50,44,49,44,50,93,44,91,110,44,49,44,110,44,50,93,44,91,110,44,48,44,110,44,49,93,93,44,34,49,34, +58,110,162,91,91,49,45,110,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49, +44,49,44,49,93,44,91,49,45,110,44,49,44,49,45,110,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93, +44,34,50,34,58,110,162,91,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49, +44,49,44,49,93,44,91,48,44,49,43,110,44,48,44,50,93,44,91,49,44,50,45,110,44,49,44,50,93,44,91,48, +44,50,44,49,44,50,93,93,44,34,51,34,58,110,162,91,91,48,44,48,44,49,45,110,44,48,93,44,91,48,44,48, +44,48,44,110,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49, +44,50,93,44,91,110,44,50,44,49,44,50,93,93,44,34,52,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, +91,49,44,48,44,49,45,110,44,48,93,44,91,49,44,48,44,49,44,49,45,110,93,44,91,48,44,49,44,49,44,49, +93,44,91,49,44,49,44,49,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93,44,34,53,116,111,48,34,58, +110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93, +44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,50,44,48,44,50,93,44,91, +49,44,49,45,110,44,49,44,49,93,44,91,48,44,49,44,48,44,49,43,110,93,93,44,34,53,116,111,54,34,58,110, +162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,48,44,49,44,49,44,49,93,44, +91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,50,45,110,44,48,44,50,93,93, +44,34,54,34,58,110,162,91,91,48,44,48,44,48,44,49,45,110,93,44,91,48,44,48,44,49,44,48,93,44,91,110, +44,49,44,49,44,49,93,44,91,49,44,49,45,110,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110, +44,50,44,49,44,50,93,44,91,48,44,49,45,110,44,48,44,50,45,50,42,110,93,93,44,34,55,34,58,110,162,91, +91,48,44,48,44,48,44,110,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49, +45,110,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,44, +91,49,45,110,44,49,44,49,45,110,44,50,93,93,44,34,56,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, +91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49, +44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,49,44,48,44,50,45,110,93,93,44,34, +57,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49, +44,49,93,44,91,48,44,49,44,49,45,110,44,49,93,44,91,48,44,49,44,48,44,49,43,110,93,44,91,49,44,49, +44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,93,44,34,58,34,58,110,162,91,91,48,46,52,44,48,46,52, +44,48,46,54,44,48,46,52,93,44,91,48,46,54,44,48,46,52,44,48,46,54,44,48,46,54,93,44,91,48,46,54, +44,48,46,54,44,48,46,52,44,48,46,54,93,44,91,48,46,52,44,48,46,52,44,48,46,52,44,48,46,54,93,44, +91,48,46,52,44,49,46,52,44,48,46,54,44,49,46,52,93,44,91,48,46,54,44,49,46,52,44,48,46,54,44,49, +46,54,93,44,91,48,46,54,44,49,46,54,44,48,46,52,44,49,46,54,93,44,91,48,46,52,44,49,46,52,44,48, +46,52,44,49,46,54,93,93,125,59,10,170,100,114,97,119,68,105,103,105,116,115,40,108,97,115,116,84,101,120,116,44, +116,104,105,115,84,101,120,116,44,110,41,123,34,114,97,109,34,174,112,61,67,72,65,82,80,59,174,115,61,67,72,65, +82,87,59,172,120,61,48,59,103,46,114,101,115,101,116,40,41,59,167,40,172,105,61,48,59,105,60,108,97,115,116,84, +101,120,116,46,108,101,110,103,116,104,59,105,152,41,123,172,108,97,115,116,67,104,61,108,97,115,116,84,101,120,116,91, +105,93,59,172,116,104,105,115,67,104,61,116,104,105,115,84,101,120,116,91,105,93,59,163,40,116,104,105,115,67,104,138, +34,58,34,41,120,151,52,59,163,40,108,97,115,116,67,104,140,116,104,105,115,67,104,41,123,172,99,104,44,99,104,110, +61,110,59,163,40,40,116,104,105,115,67,104,45,49,138,108,97,115,116,67,104,160,40,116,104,105,115,67,104,138,48,158, +108,97,115,116,67,104,138,53,41,160,40,116,104,105,115,67,104,138,48,158,108,97,115,116,67,104,138,57,41,41,41,99, +104,61,108,97,115,116,67,104,59,164,123,99,104,61,116,104,105,115,67,104,59,99,104,110,61,48,59,125,98,117,102,46, +99,108,101,97,114,40,41,59,163,40,99,104,138,34,53,34,41,99,104,61,40,108,97,115,116,67,104,138,53,158,116,104, +105,115,67,104,138,48,41,63,34,53,116,111,48,34,58,34,53,116,111,54,34,59,172,108,61,68,73,71,73,84,83,91, +99,104,93,40,99,104,110,41,59,108,46,102,111,114,69,97,99,104,40,99,162,123,163,40,99,91,48,93,140,99,91,50, +93,41,98,117,102,46,102,105,108,108,82,101,99,116,40,112,43,99,91,48,93,42,115,44,99,91,49,93,42,115,44,112, +43,99,91,50,93,42,115,44,50,42,112,43,99,91,51,93,42,115,41,59,164,163,40,99,91,49,93,140,99,91,51,93, +41,98,117,102,46,102,105,108,108,82,101,99,116,40,99,91,48,93,42,115,44,112,43,99,91,49,93,42,115,44,50,42, +112,43,99,91,50,93,42,115,44,112,43,99,91,51,93,42,115,41,59,125,41,59,103,46,100,114,97,119,73,109,97,103, +101,40,98,117,102,105,109,103,44,120,44,89,41,59,125,163,40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59, +120,150,115,43,112,43,55,59,125,125,10,170,100,114,97,119,69,118,101,114,121,116,104,105,110,103,69,108,115,101,40,41, +123,172,120,61,40,67,72,65,82,87,43,67,72,65,82,80,43,54,41,42,53,59,172,121,61,89,43,50,42,67,72,65, +82,87,43,67,72,65,82,80,59,172,100,61,184,68,97,116,101,40,41,59,103,46,114,101,115,101,116,40,41,59,103,46, +115,101,116,70,111,110,116,40,34,54,120,56,34,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49, +44,45,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,40,34,48,34,43,100,46,103,101,116,83,101,99,111, +110,100,115,40,41,41,46,115,117,98,115,116,114,40,45,50,41,44,120,44,121,45,56,44,180,41,59,163,40,105,115,49, +50,72,111,117,114,41,103,46,100,114,97,119,83,116,114,105,110,103,40,40,100,46,103,101,116,72,111,117,114,115,40,41, +60,49,50,41,63,34,65,77,34,58,34,80,77,34,44,120,44,89,43,52,44,180,41,59,103,46,115,101,116,70,111,110, +116,65,108,105,103,110,40,48,44,45,49,41,59,172,100,97,116,101,61,108,111,99,97,108,101,46,100,97,116,101,40,100, +44,181,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,97,116,101,44,103,46,103,101,116,87,105,100,116,104, +40,41,47,50,44,121,43,56,44,180,41,59,125,10,170,115,104,111,119,84,105,109,101,40,41,123,163,40,97,110,105,109, +73,110,116,101,114,118,97,108,41,171,59,172,100,61,184,68,97,116,101,40,41,59,172,104,111,117,114,115,61,100,46,103, +101,116,72,111,117,114,115,40,41,59,163,40,105,115,49,50,72,111,117,114,41,104,111,117,114,115,61,40,40,104,111,117, +114,115,43,49,49,41,37,49,50,41,43,49,59,172,116,61,40,34,32,34,43,104,111,117,114,115,41,46,115,117,98,115, +116,114,40,45,50,41,43,34,58,34,43,40,34,48,34,43,100,46,103,101,116,77,105,110,117,116,101,115,40,41,41,46, +115,117,98,115,116,114,40,45,50,41,59,172,108,61,108,97,115,116,84,105,109,101,59,163,40,116,138,108,160,108,138,34, +45,45,45,45,45,34,41,123,100,114,97,119,68,105,103,105,116,115,40,108,44,116,44,48,41,59,100,114,97,119,69,118, +101,114,121,116,104,105,110,103,69,108,115,101,40,41,59,108,97,115,116,84,105,109,101,61,116,59,171,59,125,172,110,61, +48,59,97,110,105,109,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110, +150,49,47,49,48,59,163,40,110,145,49,41,123,110,61,49,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97, +110,105,109,73,110,116,101,114,118,97,108,41,59,97,110,105,109,73,110,116,101,114,118,97,108,61,183,59,125,100,114,97, +119,68,105,103,105,116,115,40,108,44,116,44,110,41,59,125,44,50,48,41,59,108,97,115,116,84,105,109,101,61,116,59, +125,10,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,97, +110,105,109,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73, +110,116,101,114,118,97,108,41,59,97,110,105,109,73,110,116,101,114,118,97,108,61,183,59,125,163,40,116,105,109,101,73, +110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,116,105,109,101,73,110,116,101,114, +118,97,108,41,59,116,105,109,101,73,110,116,101,114,118,97,108,61,183,59,125,163,40,111,110,41,123,115,104,111,119,84, +105,109,101,40,41,59,116,105,109,101,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115, +104,111,119,84,105,109,101,44,49,48,48,48,41,59,125,164,123,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45, +34,59,125,125,41,59,10,103,46,99,108,101,97,114,40,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100, +103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,116,105, +109,101,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44, +49,48,48,48,41,59,10,115,104,111,119,84,105,109,101,40,41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40, +34,99,108,111,99,107,34,41,59,255,255,255,131,4,0,0,109,99,108,111,99,107,46,105,109,103,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,48,48,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136, -136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,136,136, -128,0,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0, -0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136,136,136,0,0,0,0,0,0,0,0,0,8,136,136,136,131, -255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0,0,0,0,136,136,136,131,255,255,255,255,255,255,255,255,56, -136,136,136,0,0,0,0,0,0,0,0,136,136,136,63,255,255,255,240,15,255,255,255,243,136,136,136,0,0,0,0,0, -0,0,8,136,136,143,255,255,255,255,240,15,255,255,255,255,248,136,136,128,0,0,0,0,0,0,136,136,136,255,255,255, -255,255,240,15,255,255,255,255,255,136,136,136,0,0,0,0,0,0,136,136,131,255,255,255,255,255,240,15,255,255,255,255, -255,56,136,136,0,0,0,0,0,8,136,136,63,255,255,255,255,255,240,15,255,255,255,255,255,243,136,136,128,0,0,0, -0,8,136,136,255,255,255,255,255,255,240,15,255,255,255,255,255,255,136,136,128,0,0,0,0,136,136,131,255,255,255,255, -255,255,240,15,255,255,255,255,255,255,56,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,240,15,255,255,255,255, -255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,240,15,255,255,255,255,255,255,248,136,136,0,0,0, -0,136,136,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255, -255,255,32,2,255,255,255,255,255,255,243,136,136,0,0,0,0,136,136,255,255,255,255,255,255,242,0,0,47,255,255,255, -255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255,255,255,255,136,136,0,0,0, -0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255, -255,242,0,0,3,255,255,255,255,255,255,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,32,0,0,63,255,255, -255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,255,243,0,3,255,255,255,255,243,136,136,0,0,0, -0,136,136,143,255,255,255,255,255,255,255,255,48,0,63,255,255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255, -255,255,255,255,243,0,3,255,255,255,248,136,136,0,0,0,0,136,136,131,255,255,255,255,255,255,255,255,255,48,47,255, -255,255,56,136,136,0,0,0,0,8,136,136,255,255,255,255,255,255,255,255,255,243,255,255,255,255,136,136,128,0,0,0, -0,8,136,136,63,255,255,255,255,255,255,255,255,255,255,255,255,243,136,136,128,0,0,0,0,0,136,136,131,255,255,255, -255,255,255,255,255,255,255,255,255,56,136,136,0,0,0,0,0,0,136,136,136,255,255,255,255,255,255,255,255,255,255,255, -255,136,136,136,0,0,0,0,0,0,8,136,136,143,255,255,255,255,255,255,255,255,255,255,248,136,136,128,0,0,0,0, -0,0,0,136,136,136,63,255,255,255,255,255,255,255,255,243,136,136,136,0,0,0,0,0,0,0,0,136,136,136,131,255, -255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0,0,0,0,8,136,136,136,131,255,255,255,255,255,255,56,136, -136,136,128,0,0,0,0,0,0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136,136,136,0,0,0,0,0,0, -0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136, -136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,128, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,136,136,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,136,136,136, +136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136, +136,136,0,0,0,0,0,0,0,0,0,8,136,136,136,131,255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0, +0,0,0,136,136,136,131,255,255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0,0,0,0,136,136,136,63,255, +255,255,240,15,255,255,255,243,136,136,136,0,0,0,0,0,0,0,8,136,136,143,255,255,255,255,240,15,255,255,255,255, +248,136,136,128,0,0,0,0,0,0,136,136,136,255,255,255,255,255,240,15,255,255,255,255,255,136,136,136,0,0,0,0, +0,0,136,136,131,255,255,255,255,255,240,15,255,255,255,255,255,56,136,136,0,0,0,0,0,8,136,136,63,255,255,255, +255,255,240,15,255,255,255,255,255,243,136,136,128,0,0,0,0,8,136,136,255,255,255,255,255,255,240,15,255,255,255,255, +255,255,136,136,128,0,0,0,0,136,136,131,255,255,255,255,255,255,240,15,255,255,255,255,255,255,56,136,136,0,0,0, +0,136,136,143,255,255,255,255,255,255,240,15,255,255,255,255,255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255, +255,255,240,15,255,255,255,255,255,255,248,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,240,15,255,255,255,255, +255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,32,2,255,255,255,255,255,255,243,136,136,0,0,0, +0,136,136,255,255,255,255,255,255,242,0,0,47,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255, +255,240,8,128,15,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255, +255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,242,0,0,3,255,255,255,255,255,255,136,136,0,0,0, +0,136,136,63,255,255,255,255,255,255,32,0,0,63,255,255,255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255, +255,255,255,243,0,3,255,255,255,255,243,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,255,255,48,0,63,255, +255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,255,255,243,0,3,255,255,255,248,136,136,0,0,0, +0,136,136,131,255,255,255,255,255,255,255,255,255,48,47,255,255,255,56,136,136,0,0,0,0,8,136,136,255,255,255,255, +255,255,255,255,255,243,255,255,255,255,136,136,128,0,0,0,0,8,136,136,63,255,255,255,255,255,255,255,255,255,255,255, +255,243,136,136,128,0,0,0,0,0,136,136,131,255,255,255,255,255,255,255,255,255,255,255,255,56,136,136,0,0,0,0, +0,0,136,136,136,255,255,255,255,255,255,255,255,255,255,255,255,136,136,136,0,0,0,0,0,0,8,136,136,143,255,255, +255,255,255,255,255,255,255,255,248,136,136,128,0,0,0,0,0,0,0,136,136,136,63,255,255,255,255,255,255,255,255,243, +136,136,136,0,0,0,0,0,0,0,0,136,136,136,131,255,255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0, +0,0,0,8,136,136,136,131,255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0,0,0,0,0,136,136,136,136, +136,51,255,255,51,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136, +136,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0, +0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, +136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, -190,0,0,0,109,99,108,111,99,107,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,109,99,108,111,99,107,34,44,34,110,97,109,101,34,58,34,77,111,114,112,104,105,110,103,32, -67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34,44,34,115,114,99,34,58,34,109,99,108, -111,99,107,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,109,99,108,111,99,107,46,105,109,103,34,44, -34,115,111,114,116,111,114,100,101,114,34,58,45,57,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,55,34,44, -34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,109,99,108,111,99,107,46,105, -110,102,111,44,109,99,108,111,99,107,46,97,112,112,46,106,115,44,109,99,108,111,99,107,46,105,109,103,34,125,255,255, -180,47,0,0,115,101,116,116,105,110,103,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97, -119,87,105,100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101, -110,118,46,72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101, -40,39,83,116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83, -101,116,116,105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103, -46,106,115,111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110, -115,40,41,123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69, -74,83,50,41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97, -99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116, -41,41,123,111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101, -79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51, -160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46, -119,97,107,101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40, -111,41,125,10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105, -110,116,101,114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116, -116,105,110,103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58, -180,44,108,111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97, -116,101,58,180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101, -122,111,110,101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44, -98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111,110,115,58,123,119,97,107,101,79,110,66,84,78,49, -58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97,107,101,79,110,66,84,78,51,58,180,44,119,97,107, -101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110,84,111,117,99,104,58,181,44,119,97,107,101,79,110, -84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115,104,111,108,100,58,56,49,57,46,50,44,116,119,105, -115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84,105,109,101,111,117,116,58,49,48,48,48,125,44,125, -59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,10,115,101,116,116,105,110,103,115,61,115,116,111, -114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,59, -10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,10,174,98, -111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34,58,34,79,102,102,34,59,10,170,115,104,111,119,77, -97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39, -58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,108,111,97,100,40,41,44, -39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,44, -39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,66,108, -117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,39,65,108,101,114,116, -115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,44,39,85,116,105,108,115,39,58,40, -41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97, -105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,123,174,109,97,105, -110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,121,115,116,101,109,39,125,44,39,60,32, -66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,84,104,101,109,101,39,58, -40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,44,39,76,67,68,39,58,40,41,162,115,104,111,119, -76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39,58,40,41,162,115,104,111,119,76,111,99,97,108,101, -77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111,99,107,39,58,40,41,162,115,104,111,119,67,108,111, -99,107,77,101,110,117,40,41,44,39,83,101,116,32,84,105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84,105, -109,101,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59, -125,10,170,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116,101, -109,59,163,40,66,65,78,71,76,69,74,83,50,41,123,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108, -117,101,58,115,101,116,116,105,110,103,115,46,98,101,101,112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70,111, -114,109,97,116,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,118, -59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101,101, -112,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113, -58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101, -115,101,116,40,41,44,50,48,48,41,59,125,125,125,59,125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34,118, -105,98,34,93,59,172,98,101,101,112,78,61,91,34,79,102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98,114, -97,116,101,34,93,59,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46,109, -97,120,40,48,124,98,101,101,112,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101,112, -41,44,48,41,44,109,105,110,58,48,44,109,97,120,58,98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102,111, -114,109,97,116,58,118,162,98,101,101,112,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116, -105,110,103,115,46,98,101,101,112,61,98,101,101,112,86,91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111,103, -87,114,105,116,101,40,68,49,56,44,48,46,53,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105, -109,101,111,117,116,40,40,41,162,68,49,56,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118,138, -50,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113, -58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101, -115,101,116,40,41,44,50,48,48,41,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59, -125,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115,39, -125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66,101, -101,112,39,58,98,101,101,112,77,101,110,117,73,116,101,109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111,108, -70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105,98, -114,97,116,101,61,33,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101,116, -116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66,82, -65,84,69,46,119,114,105,116,101,40,49,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65, -84,69,46,119,114,105,116,101,40,48,41,44,49,48,41,59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101,34, -58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116,58, -118,162,91,34,79,102,102,34,44,34,65,108,97,114,109,115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51,93, -44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51,59, -117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41, -59,163,40,34,113,109,115,99,104,101,100,34,185,87,73,68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113,109, -115,99,104,101,100,34,93,46,100,114,97,119,40,41,59,125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117,40, -109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100,86, -61,91,181,44,34,107,98,109,101,100,105,97,34,44,34,107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93,59, -172,104,105,100,78,61,91,34,79,102,102,34,44,34,75,98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98,114, -100,34,44,34,75,98,114,100,32,38,32,77,111,117,115,101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69,46, -115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116,104, -39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,77, -97,107,101,32,67,111,110,110,101,99,116,97,98,108,101,39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116,97, -98,108,101,40,41,44,39,66,76,69,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,44, -102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115, -101,116,116,105,110,103,115,46,98,108,101,61,33,115,101,116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116,101, -83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111,108, -70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101, -114,101,112,108,61,33,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101,116, -116,105,110,103,115,40,41,59,125,125,44,39,72,73,68,39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120, -40,48,44,48,124,104,105,100,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41,41, -44,109,105,110,58,48,44,109,97,120,58,104,105,100,78,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58, -118,162,104,105,100,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,72, -73,68,61,104,105,100,86,91,118,93,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, -80,97,115,115,107,101,121,32,66,69,84,65,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112,97, -115,115,107,101,121,63,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111,110, -99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101,121, -77,101,110,117,41,125,44,39,87,104,105,116,101,108,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110, -103,115,46,119,104,105,116,101,108,105,115,116,63,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, -46,108,101,110,103,116,104,43,34,32,100,101,118,115,34,41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101,58, -40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,41, -125,125,41,59,125,10,170,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171,103, -46,115,101,116,67,111,108,111,114,40,120,41,46,103,101,116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116,104, -41,123,103,46,116,104,101,109,101,61,116,104,59,115,101,116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59,117, -112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115,101, -116,61,103,46,114,101,115,101,116,59,103,46,114,101,115,101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101,116, -40,41,46,115,101,116,67,111,108,111,114,40,116,104,46,102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116,104, -46,98,103,41,59,125,59,103,46,99,108,101,97,114,61,170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116,40, -41,59,171,103,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41,44, -103,46,103,101,116,72,101,105,103,104,116,40,41,41,59,125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103, -108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,109,46,100,114,97,119,40,41,59,125,172,109,61,69,46, -115,104,111,119,77,101,110,117,40,123,39,39,58,123,116,105,116,108,101,58,39,84,104,101,109,101,39,125,44,39,60,32, -66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,68,97,114,107,32, -66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,102,102,102,34,41,44,98,103,58,99,108, -40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34,35,102,102,102,34,41,44,98,103,50,58,99,108,40,34, -35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102,102,102,34,41,44,98,103,72,58,99,108,40,34,35,48, -48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39,76,105,103,104,116,32,66,87,39,58,40,41,162,123,117, -112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41,44,98,103,58,99,108,40,34,35,102,102,102,34,41,44, -102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103,50,58,99,108,40,34,35,99,102,102,34,41,44,102,103, -72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58,99,108,40,34,35,48,102,102,34,41,44,100,97,114,107, -58,181,125,41,59,125,44,39,67,117,115,116,111,109,105,122,101,39,58,40,41,162,115,104,111,119,67,117,115,116,111,109, -84,104,101,109,101,77,101,110,117,40,41,44,125,41,59,170,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77, -101,110,117,40,41,123,170,115,101,116,84,40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109,101,59,116,104,91, -116,93,61,118,59,163,40,116,139,34,98,103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40,118,139,99,108,40, -34,35,48,48,48,34,41,41,59,125,117,112,100,40,116,104,41,59,125,174,114,103,98,61,123,98,108,97,99,107,58,34, -35,48,48,48,34,44,119,104,105,116,101,58,34,35,102,102,102,34,44,114,101,100,58,34,35,102,48,48,34,44,103,114, -101,101,110,58,34,35,48,102,48,34,44,98,108,117,101,58,34,35,48,48,102,34,44,99,121,97,110,58,34,35,48,102, -102,34,44,109,97,103,101,110,116,97,58,34,35,102,48,102,34,44,121,101,108,108,111,119,58,34,35,102,102,48,34,44, -125,59,173,99,111,108,111,114,115,61,91,93,44,110,97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98,41,123, -110,97,109,101,115,46,112,117,115,104,40,99,41,59,99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114,103,98, -91,99,93,41,41,59,125,173,109,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111,109,32, -84,104,101,109,101,39,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110, -117,40,41,125,59,174,108,97,98,101,108,115,61,123,102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44,98,103, -58,39,66,97,99,107,103,114,111,117,110,100,39,44,102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32,50,39, -44,98,103,50,58,39,66,97,99,107,103,114,111,117,110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108,105,103, -104,116,32,70,71,39,44,98,103,72,58,39,72,105,103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34,102,103, -34,44,34,98,103,34,44,34,102,103,50,34,44,34,98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34,93,46, -102,111,114,69,97,99,104,40,116,162,123,109,101,110,117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105,110,58, -48,44,109,97,120,58,99,111,108,111,114,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118,97,108, -117,101,58,77,97,116,104,46,109,97,120,40,99,111,108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116,104,101, -109,101,91,116,93,41,44,48,41,44,102,111,114,109,97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110,99,104, -97,110,103,101,58,170,40,118,41,123,172,99,61,99,111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103,39,158, -103,46,116,104,101,109,101,46,98,103,139,99,41,115,101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101,46,102, -103,41,59,163,40,116,139,39,98,103,39,158,103,46,116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40,39,102, -103,39,44,103,46,116,104,101,109,101,46,98,103,41,59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125,41,59, -109,101,110,117,91,34,60,32,66,97,99,107,34,93,61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40, -41,59,109,61,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80,97,115, -115,107,101,121,77,101,110,117,40,41,123,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104, -111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110, -103,115,46,112,97,115,115,107,101,121,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104, -111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115,115,107, -101,121,160,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123,115,101, -116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101,83,101, -116,116,105,110,103,115,40,41,59,125,167,40,172,105,61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123,109,101, -110,117,91,96,68,105,103,105,116,32,36,123,105,43,49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101,116,116, -105,110,103,115,46,112,97,115,115,107,101,121,91,105,93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110,99,104, -97,110,103,101,58,118,162,123,172,112,61,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112,108,105, -116,40,34,34,41,59,112,91,105,93,61,118,59,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,112,46, -106,111,105,110,40,34,34,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,41,40, -105,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104,105,116, -101,108,105,115,116,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162, -115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116, -105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, -41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115,46,119, -104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111,114,69, -97,99,104,40,170,40,100,41,123,109,101,110,117,91,100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61,170,40, -41,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116,104,101, -110,40,40,118,41,162,123,163,40,118,41,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,115, -112,108,105,99,101,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120,79,102, -40,100,41,44,49,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105,109,101, -111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125,125,41, -59,10,109,101,110,117,91,39,65,100,100,32,68,101,118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111,119,65, -108,101,114,116,40,34,67,111,110,110,101,99,116,32,100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116,111,92, -110,119,104,105,116,101,108,105,115,116,34,44,34,87,104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40,170,40, -41,123,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99, -116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70,46,114, -101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78,82,70, -46,111,110,40,39,99,111,110,110,101,99,116,39,44,170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105,110,103, -115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,91, -93,59,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114,41,59, -117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105, -115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116, -77,101,110,117,40,41,59,125,41,59,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125, -170,115,104,111,119,76,67,68,77,101,110,117,40,41,123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123,39,116, -105,116,108,101,39,58,39,76,67,68,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115, -116,101,109,77,101,110,117,40,41,44,39,76,67,68,32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97,108,117, -101,58,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44,109,97, -120,58,49,44,115,116,101,112,58,48,46,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103, -115,46,98,114,105,103,104,116,110,101,115,115,61,118,160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, -41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116,105,110, -103,115,46,98,114,105,103,104,116,110,101,115,115,41,59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116,39,58, -123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97, -120,58,54,48,44,115,116,101,112,58,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115, -46,116,105,109,101,111,117,116,61,48,124,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97, -110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105,109,101, -111,117,116,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58,115,101, -116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109,97,116, -58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103, -115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115,46,111, -112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40, -41,59,125,125,125,59,10,163,40,33,66,65,78,71,76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115,115,105, -103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97,108,117, -101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44,102,111, -114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116, -116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116,105,110, -103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112,116,105, -111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101,58,115, -101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114,109,97, -116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110, -103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103,115,46, -111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111,110,115, -40,41,59,125,125,125,41,59,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123, -39,87,97,107,101,32,111,110,32,70,97,99,101,85,112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115, -46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98,111,111, -108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112, -116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111,112,116, -105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40, -41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101,116,116, -105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97,116,58, -98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115, -46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115,46,111, -112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111,110,115, -40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116, -116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109,97,116, -58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103, -115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103,115,46, -111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105,111,110, -115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117,101,58, -105,110,116,101,114,110,97,108,84,111,71,40,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105, -115,116,84,104,114,101,115,104,111,108,100,41,44,109,105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44,115,116, -101,112,58,48,46,48,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116, -105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97,108,40, -118,160,48,46,49,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116, -32,77,97,120,32,89,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, -116,119,105,115,116,77,97,120,89,44,109,105,110,58,45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115,116,101, -112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111, -110,115,46,116,119,105,115,116,77,97,120,89,61,118,160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110, -115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101, -116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105,110,58, -48,44,109,97,120,58,50,48,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123, -115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61,118,160, -49,48,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46,115,104, -111,119,77,101,110,117,40,108,99,100,77,101,110,117,41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101,110,117, -40,41,123,10,174,108,111,99,97,108,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,111, -99,97,108,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110, -117,40,41,44,39,84,105,109,101,32,90,111,110,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46, -116,105,109,101,122,111,110,101,44,109,105,110,58,45,49,49,44,109,97,120,58,49,51,44,115,116,101,112,58,48,46,53, -44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,61,118, -160,48,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,67,108,111,99,107,32,83,116, -121,108,101,39,58,123,118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93, -44,102,111,114,109,97,116,58,118,162,118,63,34,49,50,104,114,34,58,34,50,52,104,114,34,44,111,110,99,104,97,110, -103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,61,118,59,117,112,100,97,116, -101,83,101,116,116,105,110,103,115,40,41,59,125,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99, -97,108,101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110, -117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66, -97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110, -102,111,39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103, -44,48,44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100, -101,34,44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41, -93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103, -101,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103, -46,46,46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105, -116,108,101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, -34,41,46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82, -101,119,114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116, -111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113, -117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101, -46,106,115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41, -59,125,44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77, -101,115,115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105, -115,32,99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117, -116,116,111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84, -105,109,101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59, -163,40,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71, -80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82, -77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97, -116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110, -103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40, -66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46, -115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97, -110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111, -119,101,114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105, -61,49,48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125,44,39,82,101,115,101,116,32,83,101,116,116,105,110, -103,115,39,58,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,115,101,116,32,116,111,32,68, -101,102,97,117,108,116,115,63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105,110,103,115,34,125,41,46,116,104, -101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,82,101,115,101, -116,116,105,110,103,39,41,59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,115,101,116,84,105,109,101,111, -117,116,40,115,104,111,119,77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115,104,111,119,85,116,105,108,77,101, -110,117,40,41,59,125,41,59,125,44,39,84,117,114,110,32,79,102,102,39,58,40,41,162,123,163,40,66,97,110,103,108, -101,46,115,111,102,116,79,102,102,41,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103, -108,101,46,111,102,102,40,41,125,125,59,10,163,40,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101, -116,41,123,109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115, -104,111,119,80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114, -121,116,104,105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125, -41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41, -59,84,101,114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97, -99,116,111,114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41, -59,125,125,10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110, -110,101,99,116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40, -101,41,123,125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110, -97,109,101,61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40, -41,46,115,117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46, -115,104,111,119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97, -98,108,101,63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101, -110,40,114,162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46, -98,108,101,61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78, -82,70,46,115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101, -110,117,40,41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111, -99,107,65,112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47, -92,46,105,110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114, -101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107, -34,41,63,97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40, -40,97,44,98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10, -174,99,108,111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32, -67,108,111,99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77, -101,110,117,40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44, -105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116, -105,110,103,115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108, -111,99,107,139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125, -99,108,111,99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46, -99,108,111,99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112, -112,46,115,114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77, -101,110,117,40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139, -48,41,123,99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61, -40,41,162,123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10, -125,170,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10, -174,116,105,109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,116,32,84,105,109,101, -39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123,115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109, -101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,59,125,44,39,72,111, -117,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44,111,110,99,104,97,110,103,101, -58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59,100,46,115,101,116,72,111,117, -114,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58,123,118,97,108,117,101,58,100, -46,103,101,116,77,105,110,117,116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97, -108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116,101,115,40,175,46,118,97,108, -117,101,41,59,125,125,44,39,83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100,46,103,101,116,83,101,99,111, -110,100,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54, -48,41,37,54,48,59,100,46,115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39, -68,97,116,101,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103, -101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115, -101,116,68,97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117, -101,58,100,46,103,101,116,77,111,110,116,104,40,41,43,49,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175, -46,118,97,108,117,101,61,40,40,118,43,49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77,111,110,116,104,40, -175,46,118,97,108,117,101,45,49,41,59,125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101,58,100,46,103,101, -116,70,117,108,108,89,101,97,114,40,41,44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49,48,48,44,111,110, -99,104,97,110,103,101,58,170,40,118,41,123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118,41,59,125,125,125, -59,10,171,69,46,115,104,111,119,77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10,125,170,115,104,111,119,65, -112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110,117,61,123,39,39,58,123, -39,116,105,116,108,101,39,58,39,65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39, -58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112,115,61,115,116,111,114,97, -103,101,46,108,105,115,116,40,47,92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47,41,10,46,109,97,112,40, -115,162,115,46,115,117,98,115,116,114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41,41,10,46,109,97,112,40, -105,100,162,123,174,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105,100,43,39,46,105,110,102, -111,39,44,49,41,160,123,110,97,109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110,97,109,101,58,97,46,110, -97,109,101,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,125,59,125,41,10,46,115, -111,114,116,40,40,97,44,98,41,162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48, -124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46, -110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125, -41,10,163,40,97,112,112,115,46,108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110,117,91,39,78,111,32,97, -112,112,32,104,97,115,32,115,101,116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125,10,97,112,112,115,46,102, -111,114,69,97,99,104,40,170,40,97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112,46,110,97,109,101,93,61, -40,41,162,123,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125,59,125,41,10,69,46,115, -104,111,119,77,101,110,117,40,97,112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110, -103,115,40,97,112,112,41,123,10,174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123,69,46,115,104,111,119,77, -101,115,115,97,103,101,40,96,36,123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109,115,103,125,33,92,110,92, -110,66,84,78,49,32,116,111,32,103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116,99,104,40,115,104,111,119, -65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112,101,97,116,58,181,125,41, -59,125,173,97,112,112,83,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,40,97,112,112,46, -105,100,43,39,46,115,101,116,116,105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83,101,116,116,105,110,103,115, -61,101,118,97,108,40,97,112,112,83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110, -115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101, -114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101, -116,116,105,110,103,115,39,41,59,125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141,34,102,117,110,99,116,105, -111,110,34,41,123,171,115,104,111,119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,115,101,116,116,105,110,103, -115,39,41,59,125,177,123,97,112,112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111,119,65,112,112,83,101,116, -116,105,110,103,115,77,101,110,117,40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108, -111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96, -44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115, -39,41,59,125,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,76,2,0,0,115,101,116,116,105,110,103,46, -105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,241,99,204,66,111,83, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0, -1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0, -0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,16,0,5,85,85,80, -0,5,0,0,0,0,85,0,85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85,69,85,64,0,0,1,85,85, -85,250,175,85,85,85,80,0,0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85,234,170,170,171,85,85,84,0, -0,21,85,87,170,170,170,170,213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0,0,85,85,90,170,170,170,170, -165,85,85,0,0,85,85,122,170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170,169,85,84,0,0,1,85,234, -170,0,0,170,171,85,64,0,0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0, -0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42, -170,85,0,0,0,0,85,234,170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170,171,85,64,0,0,21,85,106, -170,160,10,170,169,85,84,0,0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0, -0,85,85,94,170,170,170,170,181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0,0,21,85,85,234,170,170,171, -85,85,84,0,0,5,85,85,94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85,85,85,64,0,0,1,85,81, -85,85,85,85,69,85,64,0,0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0,5,85,85,80,0,4,0,0, -0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,64, -0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0, -1,85,85,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -78,1,0,0,115,101,116,116,105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,98,108,101,34,58,116,114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114,117,101,44,34,108,111,103,34, -58,102,97,108,115,101,44,34,116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98,114,97,116,101,34,58,116,114, -117,101,44,34,98,101,101,112,34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110,101,34,58,48,44,34,72,73, -68,34,58,102,97,108,115,101,44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49,50,104,111,117,114,34,58,102, -97,108,115,101,44,34,98,114,105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116,105,111,110,115,34,58,123,34, -119,97,107,101,79,110,66,84,78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,50,34,58,116,114, -117,101,44,34,119,97,107,101,79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97,107,101,79,110,70,97,99,101, -85,112,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58,102,97,108,115,101,44,34,119, -97,107,101,79,110,84,119,105,115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84,104,114,101,115,104,111,108,100, -34,58,56,49,57,46,50,44,34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48,44,34,116,119,105,115,116,84, -105,109,101,111,117,116,34,58,49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116,105,110,103,46,105,110,102,111, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115,101,116,116,105,110,103,34,44, -34,110,97,109,101,34,58,34,83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58,34,115,101,116,116,105,110,103, -46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103,46,105,109,103,34,44,34,115, -111,114,116,111,114,100,101,114,34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,50,34,44,34,116, -97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,115,101,116,116, -105,110,103,46,105,110,102,111,44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44,115,101,116,116,105,110,103,46, -105,109,103,34,44,34,100,97,116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111,110,34,125,255,95,38,0,0, -97,98,111,117,116,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,69,78,86, -61,112,114,111,99,101,115,115,46,101,110,118,59,10,172,77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114, -121,40,41,59,10,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,103,46,99,108, -101,97,114,40,49,41,59,10,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,41,59,10,172,121,61,50,52,44, -104,61,56,59,10,163,40,103,46,103,101,116,87,105,100,116,104,40,41,145,50,52,48,41,123,103,46,100,114,97,119,73, -109,97,103,101,40,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109, -112,114,101,115,115,40,97,116,111,98,40,34,118,69,52,103,81,90,87,103,47,47,65,65,73,51,90,104,52,100,67,111, -65,100,54,119,65,100,54,52,65,100,50,106,52,100,54,108,52,100,99,110,52,100,67,54,65,100,99,43,65,100,89,118, -52,100,85,103,103,72,71,47,47,107,103,78,47,47,65,71,66,49,87,107,68,112,107,79,65,119,115,72,47,103,68,66, -103,74,52,67,84,82,119,100,71,108,54,82,68,108,47,48,103,72,81,103,74,101,77,68,111,50,47,65,103,99,68,73, -65,73,107,66,110,65,100,82,103,74,121,67,65,65,81,100,68,108,103,100,82,103,90,80,68,103,98,87,66,68,111,85, -99,68,113,77,80,82,89,99,74,103,69,102,111,65,55,85,104,57,65,65,103,81,49,66,69,103,73,100,66,110,103,100, -82,75,81,73,65,67,109,66,98,66,54,65,100,66,50,103,100,82,110,111,69,68,121,66,43,67,56,116,98,98,81,86, -112,103,78,65,113,79,107,65,119,77,71,121,69,81,68,111,77,66,49,65,73,66,118,103,100,68,80,89,77,67,43,72, -47,47,55,122,66,103,47,47,43,102,65,65,52,79,65,103,72,47,47,116,119,68,111,77,118,47,52,87,66,51,105,121, -69,65,65,80,119,72,73,78,118,84,89,77,65,118,47,65,47,115,67,54,66,109,66,104,47,119,68,111,80,52,103,73, -117,66,100,119,97,121,66,65,65,80,47,68,111,77,72,52,70,52,84,111,81,83,66,43,69,80,74,81,85,79,103,75, -109,68,66,103,73,65,66,104,65,100,70,66,52,76,55,66,103,102,65,65,89,78,119,106,112,75,67,104,119,74,66,84, -73,81,100,68,105,65,100,70,103,72,103,65,89,73,100,68,109,68,97,67,79,52,77,68,57,87,113,49,52,100,77,43, -67,100,67,68,111,85,48,110,68,106,67,104,121,104,66,65,65,73,100,70,115,103,100,84,90,103,97,86,68,109,80,89, -76,74,107,48,76,73,111,100,68,97,73,99,120,99,73,76,82,68,83,111,56,48,106,105,86,69,67,103,85,65,118,103, -68,67,109,71,48,89,81,84,82,72,68,111,84,82,66,103,76,82,67,77,119,74,68,66,110,111,100,68,101,65,77,68, -75,111,85,118,65,73,85,47,68,111,99,68,54,69,76,68,111,75,82,67,65,73,77,47,76,73,99,71,71,52,80,81, -85,73,75,67,66,85,52,80,122,68,111,97,69,66,47,112,51,66,70,81,75,75,67,104,57,65,68,111,88,115,75,73, -86,86,113,111,110,67,116,86,66,111,70,81,99,65,85,75,121,70,119,103,104,100,66,51,73,80,66,67,119,74,90,67, -65,81,77,102,69,103,81,65,76,50,65,71,70,103,90,74,66,68,111,90,103,68,65,66,69,77,87,89,81,74,70,103, -76,119,67,107,65,67,66,47,103,100,76,87,89,77,67,102,111,81,65,69,51,53,66,69,68,112,107,72,56,69,102,100, -103,89,65,68,108,52,109,68,108,54,56,66,65,66,97,122,66,70,66,65,50,67,103,75,56,67,65,66,99,66,85,90, -80,47,56,107,66,118,53,56,67,65,67,49,47,47,52,65,66,85,81,119,65,83,110,52,100,103,79,120,111,65,76,108, -52,100,67,52,65,100,89,106,52,100,54,104,52,100,43,119,65,100,54,111,65,100,50,103,52,100,67,65,119,81,65,61, -34,41,41,44,49,50,48,44,121,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74, -83,46,67,79,77,34,44,49,50,48,44,121,45,52,41,59,125,164,123,121,61,45,40,52,43,104,41,59,125,10,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,80,111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105,110,111,34, -44,48,44,121,150,52,43,104,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105,111,110, -32,34,43,69,78,86,46,86,69,82,83,73,79,78,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114, -105,110,103,40,34,67,111,109,109,105,116,32,34,43,69,78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44,121, -150,104,41,59,10,170,103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44,102,105,108,101,41,123,172,106,61,115, -46,114,101,97,100,74,83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40,34,111,98,106,101,99,116,34,138,191, -106,41,63,106,46,118,101,114,115,105,111,110,58,181,59,103,46,100,114,97,119,83,116,114,105,110,103,40,118,63,40,110, -97,109,101,43,34,32,34,43,40,118,63,34,118,34,43,118,58,34,85,110,107,110,111,119,110,34,41,41,58,34,78,79, -32,34,43,110,97,109,101,44,48,44,121,150,104,41,59,125,10,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111, -116,108,111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,59,10,103,101,116,86,101,114,115,105,111, -110,40,34,76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,10,103,101,116, -86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111, -34,41,59,10,121,150,104,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,77,69,77,46,116,111,116,97,108,43, -34,32,74,83,32,86,97,114,105,97,98,108,101,115,32,97,118,97,105,108,97,98,108,101,34,44,48,44,121,150,104,41, -59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114,97,103,101,58,32,34,43,40,114,101,113,117, -105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114,101,101,40,41,146,49,48,41,43,34,107,32, -102,114,101,101,34,44,48,44,121,150,104,41,59,10,163,40,69,78,86,46,83,84,79,82,65,71,69,41,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43,40,69,78,86,46,83,84,79,82,65,71, -69,146,49,48,41,43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104,41,59,10,163,40,69,78,86,46,83,80, -73,70,76,65,83,72,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,80,73,32,70,108,97,115,104,58,32, -34,43,40,69,78,86,46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107,34,44,48,44,121,150,104,41,59,10, -103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,10,103,46,102,108,105,112,40,41,59,10, -103,46,100,114,97,119,73,109,97,103,101,40,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34, -41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,43,70,81,103,108,43,120,110,117,56,65,73,66, -119,71,81,103,72,117,65,111,78,51,103,70,47,104,99,76,103,69,72,117,57,52,51,71,51,104,119,85,67,68,119,73, -66,67,65,65,86,51,117,69,65,104,111,66,66,104,115,79,57,48,79,103,72,103,111,65,67,66,104,48,73,104,80,53, -65,65,81,88,66,103,56,72,56,72,119,43,71,119,69,65,88,110,52,65,69,67,120,71,65,104,48,77,69,65,79,101, -74,65,77,80,51,43,47,104,117,73,71,52,99,77,103,49,109,77,111,103,56,66,104,110,115,65,81,73,66,67,47,47, -47,74,52,77,78,54,72,99,66,73,79,73,65,65,80,115,56,72,108,57,110,77,53,103,99,66,48,72,103,56,53,50, -66,65,73,77,65,73,52,89,65,67,73,73,73,65,67,104,56,65,75,65,99,65,118,65,54,68,55,118,100,55,119,84, -66,84,89,74,51,66,57,101,43,104,69,65,104,65,52,67,121,72,117,121,56,72,88,119,50,57,78,103,73,65,66,120, -43,65,83,81,75,115,66,89,103,82,51,68,103,72,81,67,73,88,77,115,69,65,65,73,79,90,121,71,90,122,120,51, -68,104,47,65,53,55,73,68,80,111,88,78,52,72,78,72,119,81,111,66,57,119,65,66,121,68,118,66,79,52,76,104, -68,79,119,82,52,70,100,52,99,80,47,52,111,66,48,68,87,67,100,52,53,86,67,103,70,70,65,89,80,117,79,52, -81,65,67,103,69,101,100,52,80,119,101,65,73,76,66,78,52,78,112,119,69,77,88,73,76,118,66,79,52,98,118,68, -47,102,47,100,52,99,80,67,89,74,49,66,65,65,75,83,67,122,112,51,69,47,104,78,66,74,119,80,122,105,69,80, -43,72,56,104,114,118,68,57,68,116,67,53,77,74,100,52,82,84,66,71,111,76,118,66,104,101,55,66,81,74,83,66, -65,65,101,65,73,52,73,111,67,79,52,84,50,67,104,56,78,54,68,118,68,101,65,80,103,113,70,81,100,52,56,77, -105,66,51,66,69,52,99,73,47,65,118,67,53,110,115,52,65,75,67,100,103,81,65,68,47,47,119,85,119,77,77,104, -104,103,66,79,52,78,109,100,52,120,69,68,53,55,118,68,43,69,119,70,103,75,84,67,89,111,79,78,47,43,118,47, -47,47,47,79,90,119,71,88,103,70,53,53,118,81,73,52,84,97,66,69,81,82,120,66,54,72,119,55,68,82,67,65, -65,80,103,79,52,52,65,67,75,89,108,70,111,66,51,67,72,73,99,65,105,69,65,105,57,51,73,52,74,112,67,100, -65,82,109,66,100,52,73,65,70,100,52,81,65,69,52,72,65,53,47,47,104,104,49,66,65,73,73,80,66,121,65,53, -66,69,81,85,77,47,110,56,79,52,84,122,67,65,65,81,116,66,104,118,100,47,88,56,100,52,89,89,66,118,119,79, -66,79,52,76,118,66,89,73,111,75,66,104,47,89,101,119,102,65,54,66,51,68,76,111,80,47,100,52,74,88,71,65, -66,77,66,105,75,107,69,65,65,119,75,72,57,76,121,70,79,52,102,119,79,111,82,51,68,100,52,84,68,68,53,47, -65,74,81,99,119,68,103,99,79,57,122,118,67,49,118,100,55,111,99,66,120,117,65,118,104,51,67,117,69,72,104,53, -106,67,69,111,79,80,103,72,102,47,53,51,67,71,103,77,65,111,71,103,98,103,88,47,67,103,74,90,69,65,73,89, -65,66,53,72,73,98,120,82,67,66,65,89,85,76,104,90,102,66,65,65,77,65,47,71,65,47,52,55,66,100,52,52, -65,66,104,52,67,66,103,49,109,103,56,65,51,89,65,66,51,118,116,79,52,99,77,87,120,118,71,53,118,100,90,89, -87,73,119,56,65,118,80,81,100,52,78,119,82,119,85,119,65,89,73,108,66,104,115,78,71,111,82,51,67,113,66,51, -66,73,65,82,52,66,70,65,88,72,65,73,103,47,67,82,65,73,68,66,73,103,116,72,72,73,82,51,68,51,90,104, -67,90,89,88,119,119,66,114,67,79,65,88,80,53,110,56,53,53,107,78,79,52,79,65,66,73,121,120,67,72,89,99, -68,109,100,117,116,79,90,65,52,86,65,65,89,85,78,113,66,48,68,65,65,81,102,68,75,73,86,109,115,51,65,65, -103,74,51,66,104,66,77,66,74,119,103,65,72,104,105,55,68,68,73,81,65,66,103,108,57,67,73,114,118,67,101,65, -74,51,74,65,66,80,77,52,65,111,66,104,113,98,68,73,103,73,48,67,77,81,102,100,79,103,82,51,69,53,110,71, -53,77,122,73,65,73,66,66,65,81,73,65,66,119,65,53,66,103,85,103,107,69,105,69,65,101,55,104,119,69,67,116, -103,67,66,50,66,51,66,98,119,77,74,57,79,101,121,66,76,73,104,51,103,70,65,84,118,67,80,73,84,117,68,104, -111,67,69,103,70,86,113,113,48,66,47,47,119,47,47,47,77,81,87,73,98,89,74,107,70,65,65,73,106,66,69,111, -82,51,68,67,111,79,65,56,65,51,67,89,65,79,118,104,47,119,69,52,76,118,69,75,111,76,118,67,111,69,69,47, -55,120,68,65,65,121,47,67,50,71,43,103,119,50,68,78,81,50,101,57,73,48,68,66,103,120,73,66,120,71,65,87, -103,83,49,68,65,65,102,100,55,112,89,69,54,66,114,66,87,119,85,73,104,50,79,65,119,76,99,71,78,81,79,65, -53,106,98,67,100,52,103,65,67,79,52,79,103,65,103,77,72,117,52,97,66,68,111,107,75,103,71,73,90,52,76,116, -66,111,103,65,66,66,103,88,119,52,72,119,104,110,76,53,108,119,69,81,88,103,100,52,86,51,66,65,73,100,66,98, -52,106,118,66,79,52,47,117,73,65,102,81,75,65,74,51,71,104,55,115,67,54,47,88,55,111,103,66,85,73,76,48, -66,67,119,74,51,67,104,72,111,79,52,81,101,67,79,52,89,72,66,88,65,81,67,66,79,52,120,81,66,74,111,89, -86,66,78,119,73,66,66,104,87,113,48,72,68,119,69,79,67,73,80,117,111,68,116,73,72,52,76,117,67,65,65,79, -119,77,73,82,51,66,85,65,84,110,73,102,103,90,57,66,70,89,75,72,66,100,53,110,81,75,119,73,67,66,66,89, -87,65,80,111,74,51,66,47,47,47,100,53,72,77,53,106,118,68,52,68,120,66,100,52,80,81,71,119,73,66,67,72, -73,77,65,101,65,81,65,69,104,81,73,67,52,71,73,98,111,81,65,66,66,52,105,102,66,87,52,90,101,67,65,65, -79,43,69,119,74,121,66,78,81,86,50,115,68,118,67,65,65,119,54,68,65,65,97,76,70,68,103,80,119,66,52,107, -78,71,73,85,74,53,73,51,67,99,111,111,65,72,79,52,79,90,122,73,76,72,43,65,65,66,70,103,99,75,101,65, -97,43,68,100,52,112,51,74,100,52,43,76,100,52,106,117,67,104,110,77,117,122,48,68,78,81,81,65,66,66,65,77, -79,77,52,82,113,68,117,70,119,89,52,73,85,69,71,112,76,119,66,56,68,106,66,43,65,67,66,67,52,107,74,121, -65,69,67,57,51,117,121,65,65,66,68,111,120,76,66,56,72,119,70,89,84,108,66,65,73,77,77,70,73,74,108,69, -81,81,74,51,66,67,111,73,89,66,68,103,85,76,67,73,112,90,67,81,52,89,71,66,117,53,112,66,104,110,47,117, -52,85,69,120,66,50,66,78,111,77,79,57,119,66,66,57,120,113,68,79,52,74,101,69,69,81,75,84,70,120,65,66, -66,119,72,74,104,51,101,120,50,80,57,43,74,120,110,99,90,65,74,99,66,104,77,74,79,52,109,90,79,52,100,103, -88,89,82,80,67,87,81,81,122,70,52,65,65,66,82,73,104,72,66,53,103,65,67,66,89,80,101,83,65,99,65,120, -79,65,65,89,73,67,67,100,119,75,48,67,81,89,102,99,47,73,54,66,78,89,101,65,79,119,73,65,75,66,103,77, -77,81,73,73,72,67,56,69,80,47,47,47,65,111,76,107,66,103,72,52,43,65,77,67,100,52,117,111,120,87,73,49, -66,51,69,65,65,79,81,122,73,68,66,115,119,67,66,99,73,119,65,71,66,111,115,79,104,55,100,67,104,117,78,65, -89,88,118,76,52,73,80,67,104,71,89,103,69,80,43,65,110,70,70,111,120,51,66,57,118,116,79,52,76,118,66,71, -52,55,47,67,99,111,102,79,80,111,89,65,66,87,73,73,122,67,100,52,98,89,67,66,52,78,119,103,119,70,66,100, -52,73,66,66,104,73,48,66,104,54,52,67,100,119,73,72,66,100,119,74,73,66,100,65,113,55,66,69,103,84,119,68, -65,103,97,120,66,65,81,77,74,104,118,100,66,65,76,117,66,66,65,73,81,68,101,65,77,80,104,47,65,68,81,79, -72,50,43,73,104,112,101,68,102,103,98,118,68,90,65,77,80,53,52,65,67,77,111,74,99,67,115,65,89,67,53,110, -79,86,52,79,88,99,103,81,65,68,100,52,81,65,68,115,56,72,115,70,50,103,49,81,83,119,81,65,69,43,65,99, -71,82,73,76,104,68,47,53,99,68,69,52,121,83,68,65,103,99,71,119,71,100,120,113,118,68,100,52,106,51,66,67, -73,77,80,53,105,83,67,118,102,81,99,65,54,83,66,57,119,76,66,120,66,109,66,65,65,88,47,72,52,76,107,68, -83,65,99,79,70,111,79,88,103,71,55,50,65,103,69,100,52,73,65,68,113,69,70,65,81,107,76,57,51,114,104,122, -72,67,76,103,82,73,66,67,119,98,119,67,66,103,83,70,66,79,111,76,118,66,119,69,77,103,54,88,66,66,103,73, -88,68,79,52,87,74,104,117,78,72,81,121,79,70,43,68,118,67,117,43,119,50,47,81,72,111,81,65,67,66,89,80, -116,55,113,115,67,65,65,80,103,79,81,76,118,74,65,65,101,88,104,89,100,67,90,89,73,66,66,75,89,79,65,65, -73,73,47,73,51,121,77,66,54,67,111,66,100,52,85,68,103,98,118,68,79,52,52,103,66,80,73,81,43,66,87,52, -89,65,68,68,52,84,118,66,79,111,73,50,70,75,65,48,65,48,65,65,66,65,119,102,117,57,111,79,70,79,119,80, -103,65,81,76,103,66,68,111,113,119,66,65,81,73,74,70,79,53,81,65,67,74,73,80,47,74,81,73,68,67,43,65, -86,67,79,52,76,114,66,100,103,106,117,69,50,52,117,66,47,55,117,70,100,52,110,119,81,111,98,48,68,120,69,78, -55,117,73,86,120,74,51,69,49,82,51,66,104,48,79,78,111,90,43,69,57,51,103,65,73,73,80,67,86,81,55,102, -68,103,69,78,65,119,82,104,67,56,65,87,66,69,52,76,118,78,65,65,88,100,97,81,115,65,109,65,72,69,79,52, -81,65,66,104,79,90,121,66,54,66,120,66,51,66,73,103,51,81,72,52,80,81,47,71,73,69,73,73,65,71,81,73, -77,80,84,81,77,65,104,84,117,66,49,68,97,69,57,120,78,67,65,81,84,118,67,76,103,81,65,67,121,68,99,68, -65,65,87,73,70,65,82,98,68,51,101,119,57,121,99,69,75,73,76,118,67,65,66,107,77,65,65,77,65,103,90,75, -67,65,65,89,108,66,72,111,103,56,66,65,65,114,113,68,79,52,109,80,120,53,98,66,117,67,84,68,67,89,87,102, -104,47,80,54,65,101,70,78,103,86,119,103,55,70,69,97,73,84,118,67,52,66,73,66,52,66,51,72,77,103,88,100, -69,119,80,47,86,119,121,67,66,79,52,81,112,66,56,65,52,71,65,66,105,85,67,65,67,66,50,67,79,111,73,66, -67,120,72,52,119,69,77,50,56,65,53,104,89,67,103,69,71,115,122,118,67,54,70,51,78,111,106,75,66,117,70,51, -79,52,103,43,68,80,81,80,65,65,65,87,81,47,55,71,66,53,110,77,72,52,56,68,43,65,115,67,71,52,82,68, -67,70,52,89,70,67,80,52,79,65,119,68,52,71,74,103,81,67,66,104,107,74,66,89,103,56,66,66,81,73,109,67, -67,103,103,65,66,66,65,81,67,66,78,103,73,65,66,100,52,85,76,53,100,119,66,65,83,90,81,120,71,65,75,81, -99,78,65,103,80,117,81,103,74,117,66,104,110,65,122,56,65,47,107,77,53,53,51,71,70,119,77,119,79,52,80,80, -104,99,65,47,51,119,68,52,83,98,69,100,52,77,73,71,65,76,52,67,65,65,78,119,72,52,121,111,66,82,81,83, -99,68,79,89,52,65,77,47,71,73,43,69,77,51,103,88,67,83,73,90,101,66,103,56,65,117,55,118,69,79,52,118, -81,74,103,73,65,66,43,66,84,66,56,68,118,73,47,47,56,70,81,76,122,66,70,89,80,76,53,89,68,66,75,81, -118,81,100,53,90,51,70,89,111,85,80,79,52,90,85,66,67,81,79,102,47,53,89,68,86,111,73,70,68,73,119,78, -119,43,67,85,72,66,103,81,65,68,69,65,79,73,85,81,110,72,103,57,119,103,43,56,55,49,52,122,85,81,67,89, -98,118,66,79,52,112,68,70,88,119,82,80,66,100,52,85,79,102,119,73,122,66,53,101,55,85,52,103,65,77,79,52, -82,52,66,65,52,83,52,72,104,103,105,66,79,52,53,50,68,82,81,99,80,53,52,69,67,121,69,74,122,74,51,68, -107,89,88,68,71,73,73,65,66,82,81,84,118,67,86,111,73,48,69,104,118,99,90,103,104,70,67,117,52,81,66,97, -81,104,75,69,100,89,73,73,70,79,52,109,55,104,101,119,71,73,73,82,70,69,74,65,65,70,77,89,82,81,67,82, -81,90,51,70,88,89,85,79,67,89,88,103,100,52,99,74,104,74,53,66,66,73,77,79,103,69,57,109,65,89,67,120, -71,65,100,52,107,65,100,119,74,51,68,122,73,89,66,104,117,57,79,119,98,118,68,80,119,113,84,67,99,73,56,76, -65,89,85,56,51,103,69,67,50,66,52,66,67,111,80,56,53,110,115,52,90,54,66,79,53,85,80,47,53,108,67,65, -65,122,43,68,70,52,107,80,79,111,73,66,66,67,52,101,103,103,71,112,100,111,74,101,66,104,51,103,103,69,68,107, -76,118,71,72,82,79,101,68,65,77,73,55,114,70,69,84,89,76,86,66,51,101,119,54,65,77,68,74,119,120,75,69, -103,99,65,81,103,90,51,68,53,47,47,53,51,79,110,107,56,79,52,97,43,66,65,73,79,54,50,68,118,73,75,81, -77,74,75,73,77,73,90,111,102,81,104,51,117,79,81,73,65,66,82,52,88,47,66,103,76,116,66,100,52,104,51,66, -52,43,81,105,70,50,103,122,106,67,101,103,103,65,66,53,118,109,119,71,114,100,52,89,65,68,83,89,77,71,121,50, -87,100,52,106,79,68,100,52,106,53,69,65,65,53,50,66,77,119,76,118,66,53,51,117,79,52,77,78,84,73,85,66, -103,73,82,66,49,84,79,66,65,65,74,108,66,65,66,107,72,74,65,88,103,72,89,73,57,67,88,65,75,54,67,98, -119,118,103,104,120,51,66,65,111,78,103,65,81,73,49,66,105,77,65,119,53,51,69,120,74,51,66,65,65,85,77,104, -87,81,104,112,116,67,100,52,84,51,68,78,119,122,71,66,104,104,53,66,104,110,77,80,111,81,69,68,66,65,110,77, -53,106,118,66,52,89,73,66,70,81,85,81,43,69,81,100,52,112,108,66,70,89,90,76,67,71,103,118,81,117,68,118, -67,79,52,47,103,100,111,87,90,122,73,87,68,79,52,84,118,68,71,89,73,66,66,120,71,76,119,43,72,79,52,79, -75,79,52,110,65,49,87,81,52,71,119,70,89,77,71,66,73,77,76,51,97,54,73,47,53,51,67,103,69,79,90,120, -111,65,70,79,52,77,80,103,80,120,83,119,73,65,69,57,51,103,83,73,81,65,67,113,115,70,113,69,77,70,52,77, -76,101,65,98,106,70,87,52,85,65,48,65,66,67,65,65,109,79,83,119,112,51,68,120,101,55,104,65,105,71,104,97, -51,66,104,79,81,104,65,78,67,100,52,87,47,108,55,69,68,121,71,81,122,73,76,66,71,52,76,52,71,80,52,90, -51,79,68,103,75,86,66,76,103,89,104,66,76,52,77,77,47,107,65,47,76,99,66,111,72,119,111,67,65,70,54,72, -117,101,65,76,100,66,104,51,43,101,65,81,65,66,117,69,72,99,103,75,100,70,98,103,81,66,66,52,74,116,68,51, -89,65,71,103,71,119,85,111,73,105,68,65,89,84,100,66,50,88,121,50,68,105,67,79,103,74,52,66,79,52,118,81, -80,89,102,77,71,81,74,100,66,53,110,77,53,53,114,69,76,89,103,57,67,65,52,102,118,79,52,99,73,120,69,65, -122,74,111,66,104,52,117,66,79,52,115,76,72,52,81,79,66,67,52,88,47,80,65,77,72,65,65,81,83,67,103,47, -117,100,52,85,77,65,65,89,77,67,122,79,73,119,66,50,71,79,52,111,65,66,74,81,98,118,70,65,65,103,51,66, -72,65,80,103,70,73,75,112,68,79,52,84,103,66,47,47,53,122,77,76,49,99,65,106,85,65,104,85,81,101,65,89, -65,66,120,65,101,67,55,113,87,68,65,65,76,118,67,65,65,102,65,75,52,98,98,66,57,50,81,65,65,74,67,70, -103,57,51,100,52,103,71,66,65,103,83,86,66,79,52,115,74,120,98,118,73,50,69,73,66,119,80,89,65,81,79,113, -86,111,89,79,66,88,65,73,67,68,98,73,53,89,68,79,52,99,74,122,79,90,122,110,77,104,81,105,67,75,89,88, -81,79,52,80,77,67,81,76,67,66,76,89,111,114,73,65,66,71,81,104,112,51,67,101,119,84,118,68,75,73,98,118, -66,53,52,84,66,100,52,53,51,72,100,52,115,78,80,81,87,90,71,73,84,110,68,98,81,77,80,88,52,106,76,70, -65,66,69,79,78,81,77,75,51,81,71,66,70,65,82,51,67,103,56,71,100,52,74,119,82,68,89,82,119,68,85,81, -74,72,67,56,72,103,67,103,50,119,100,52,88,65,43,66,51,68,101,89,79,47,66,103,77,74,120,68,118,72,104,89, -77,66,100,52,108,51,97,103,82,67,73,55,115,78,65,65,74,69,69,70,103,76,116,67,74,52,110,77,53,103,98,71, -104,113,82,66,103,57,103,77,103,85,80,100,111,89,66,68,102,119,73,97,69,120,65,65,66,119,68,118,69,65,73,85, -79,104,73,66,66,81,65,77,74,65,89,74,51,68,57,51,65,104,55,82,68,65,65,79,55,43,65,82,66,69,81,103, -65,68,66,65,98,118,66,65,111,80,117,79,52,56,79,87,52,82,50,70,65,65,90,50,71,67,111,80,79,69,65,77, -76,88,52,103,68,67,78,89,84,118,66,43,72,119,47,56,65,117,65,73,66,65,81,83,99,66,68,81,81,66,66,71, -52,83,111,66,70,52,79,81,65,65,76,118,68,79,52,90,81,67,100,52,101,90,79,119,98,68,67,100,52,87,90,119, -69,80,71,119,81,65,76,55,112,51,66,104,79,81,68,65,76,77,66,81,81,80,103,78,89,47,98,79,52,82,52,68, -67,65,88,120,47,68,79,71,65,65,90,110,66,65,65,77,80,100,52,74,67,66,103,52,65,66,84,103,111,52,66,65, -73,80,117,69,119,88,116,101,65,104,108,68,74,103,79,81,100,52,85,76,51,89,77,67,47,80,119,65,103,87,53,50, -69,74,47,103,114,68,104,47,47,79,52,73,112,68,101,81,48,65,53,105,76,66,71,73,79,119,99,52,90,66,66,53, -110,65,71,52,79,90,109,55,49,66,73,111,82,51,68,104,121,114,67,47,56,81,69,103,89,105,66,117,53,48,66,82, -73,100,119,85,119,76,118,66,65,65,112,51,68,100,119,89,108,66,69,119,83,51,67,65,67,76,118,71,79,52,102,77, -53,104,51,67,66,81,73,112,68,103,69,73,120,65,70,68,113,111,101,67,68,52,80,100,104,118,81,82,89,79,65,47, -47,119,56,67,115,66,77,73,77,76,55,122,97,67,77,111,89,65,67,105,77,102,70,52,80,119,88,52,79,81,117,70, -119,100,103,90,51,66,54,66,103,66,101,65,77,65,100,52,111,82,66,51,99,76,86,103,76,70,70,104,111,69,66,104, -97,55,67,104,56,80,104,65,65,66,65,103,74,52,71,43,121,99,67,100,52,118,72,118,106,66,66,86,73,90,53,69, -100,52,103,65,66,83,111,81,120,67,104,115,73,100,89,87,81,56,72,112,104,79,110,86,119,52,105,67,84,52,104,81, -66,79,52,84,118,68,77,89,82,51,68,100,81,86,119,66,73,82,51,67,104,99,76,80,65,76,118,68,72,119,88,65, -70,81,81,83,67,65,66,88,119,80,111,80,47,115,66,67,72,79,52,83,77,67,119,66,120,69,104,65,70,66,53,110, -99,68,89,73,115,77,69,111,75,70,67,97,52,89,68,67,56,68,67,66,65,81,79,90,53,110,77,66,73,76,118,73, -65,111,80,100,72,52,85,80,100,103,73,66,68,83,65,81,65,67,74,103,77,73,72,89,122,118,68,100,111,81,65,68, -66,119,101,90,122,77,65,115,120,51,67,75,103,90,73,66,73,111,102,65,77,65,111,77,66,119,66,75,66,54,65,77, -69,76,65,81,67,66,73,73,73,65,75,88,82,71,90,47,54,89,68,73,81,78,119,103,55,118,66,79,52,98,117,66, -65,66,101,119,65,65,75,43,68,71,104,52,65,69,122,51,112,101,103,90,116,66,71,119,76,121,67,52,67,49,68,79, -119,106,47,68,79,53,66,89,66,104,79,81,51,74,67,66,104,55,76,66,103,72,117,65,65,77,65,53,118,103,118,73, -57,72,86,65,75,112,67,65,66,68,107,66,79,52,122,116,68,103,69,69,100,119,89,65,74,100,52,84,113,68,103,119, -70,69,79,52,115,80,57,53,65,66,79,52,84,105,66,98,89,112,52,69,75,111,110,99,103,69,75,65,73,80,100,82, -111,77,74,67,111,74,67,68,98,89,81,106,66,68,81,80,65,56,70,119,48,66,81,76,65,89,121,89,66,65,65,117, -73,119,65,65,66,103,55,53,68,67,65,73,83,69,43,68,86,66,65,81,84,118,72,115,70,103,90,81,50,90,100,52, -53,84,67,71,119,103,73,67,56,72,117,65,81,73,78,68,100,52,87,103,48,72,81,53,106,52,66,121,65,97,69,72, -111,84,118,70,79,52,79,119,77,111,117,89,109,99,119,104,47,47,65,73,73,75,68,89,103,89,65,68,104,52,73,66, -80,73,77,72,103,55,100,66,103,120,111,70,67,65,77,65,119,65,67,66,69,73,103,65,67,100,119,77,71,65,119,89, -87,68,104,118,76,68,52,115,79,101,111,77,72,65,119,87,74,119,68,118,73,79,52,74,120,66,101,65,76,118,66,53, -106,100,75,65,66,102,52,82,65,79,73,109,67,78,66,75,111,86,81,65,81,79,79,71,52,89,65,67,47,53,85,66, -100,52,89,55,66,66,89,81,52,83,100,52,115,80,106,54,79,67,76,81,73,65,72,79,52,99,73,72,52,82,50,66, -80,65,119,65,67,104,99,79,88,89,77,77,103,89,78,72,104,112,79,68,65,65,55,88,66,79,52,114,118,66,77,119, -77,73,57,72,111,101,89,90,66,67,53,107,77,52,65,71,66,100,52,84,80,67,52,68,53,67,117,43,90,104,53,105, -66,51,101,119,50,72,80,53,110,65,100,65,98,119,66,65,111,99,80,43,74,51,67,104,73,116,67,79,73,89,116,67, -65,111,89,79,66,103,72,103,79,119,85,77,100,89,73,65,68,66,73,79,119,56,70,119,54,71,81,76,119,73,65,71, -54,71,90,122,76,118,75,70,89,74,54,66,100,52,97,114,67,55,113,82,67,79,52,99,77,53,103,65,66,65,119,73, -121,66,56,68,118,68,67,65,82,75,67,43,67,56,66,65,103,80,47,47,52,71,66,65,66,69,66,105,74,51,66,113, -65,99,67,117,70,51,79,52,108,51,65,119,103,65,70,52,65,65,66,73,81,74,51,67,104,55,119,68,121,89,73,66, -49,77,75,55,103,79,67,89,119,79,81,68,103,99,77,78,89,80,47,78,119,81,77,67,121,68,116,66,66,65,81,72, -66,104,118,57,47,112,51,70,79,119,84,90,66,88,81,99,74,120,51,117,103,70,51,117,69,72,118,75,110,68,79,52, -76,118,68,100,81,89,65,68,76,52,107,80,56,49,119,100,65,49,52,75,81,109,119,99,111,113,51,67,65,81,80,56, -66,89,102,119,101,65,84,118,67,121,71,81,54,69,77,73,52,74,51,66,100,53,85,65,104,81,69,68,120,69,73,100, -111,79,103,79,52,77,80,68,81,74,51,71,77,73,80,73,76,81,104,69,66,56,66,88,67,74,81,82,51,69,71,112, -73,65,70,104,47,103,56,65,116,67,76,119,81,108,66,72,111,73,103,67,65,81,98,119,70,80,81,99,65,103,103,76, -69,100,52,83,85,66,54,65,82,66,117,70,57,54,69,65,104,77,76,51,89,65,66,68,89,77,74,67,119,81,119,67, -78,89,87,65,65,81,74,86,66,55,118,119,47,111,97,66,79,52,89,48,66,53,105,117,68,52,43,81,104,120,51,75, -104,52,68,67,87,111,73,71,66,104,55,116,67,65,103,73,85,69,43,72,117,65,89,74,51,68,47,56,65,55,105,84, -68,104,103,101,67,101,103,81,65,69,66,73,100,69,111,66,111,66,57,73,73,68,79,52,80,99,68,81,78,119,117,68, -118,68,50,67,97,67,52,72,65,67,65,76,117,69,100,52,105,82,66,55,118,122,79,52,74,84,66,103,53,74,67,101, -65,88,111,104,69,77,118,76,118,71,65,103,77,68,47,47,121,79,65,76,86,66,66,103,73,68,67,65,65,56,79,66, -89,76,118,68,65,65,86,81,43,65,66,66,99,111,111,66,66,101,81,53,52,67,103,103,65,66,69,103,75,90,67,81, -89,103,65,66,79,52,81,88,68,79,52,119,65,74,100,81,77,78,55,118,100,100,119,79,73,103,57,51,88,73,88,77, -104,51,103,119,68,117,66,76,103,81,51,67,78,111,74,100,66,43,72,119,47,55,105,67,104,110,115,70,73,107,78,104, -115,77,72,111,85,79,67,65,74,51,66,101,103,81,65,66,103,116,86,78,81,119,110,66,65,89,77,76,87,89,73,65, -68,78,103,86,65,79,119,78,65,100,52,85,78,53,112,102,70,75,119,82,51,71,103,69,74,103,66,107,66,76,73,88, -47,86,111,75,111,67,88,81,103,65,72,66,52,81,65,70,79,65,80,119,76,89,73,66,66,79,52,81,68,66,65,73, -73,106,66,83,73,80,77,68,89,120,121,68,104,97,67,66,98,52,122,118,74,57,119,65,69,50,67,52,66,101,65,75, -108,70,79,52,107,73,65,81,78,116,53,110,79,68,111,74,51,66,51,98,56,69,72,119,73,47,66,74,73,82,110,73, -79,81,107,77,99,89,103,65,72,66,81,73,77,72,67,52,85,80,47,54,108,67,78,103,74,116,67,55,112,53,67,50, -71,119,54,71,119,51,111,73,66,68,65,77,76,104,76,68,66,65,111,73,102,67,97,73,81,65,69,83,119,90,51,70, -103,71,81,66,89,85,79,104,89,68,66,79,52,89,65,72,118,70,52,104,51,101,103,71,90,121,66,88,66,77,119,47, -81,76,52,107,78,55,111,50,67,103,99,119,109,99,119,99,103,81,65,68,51,101,119,75,89,74,86,70,103,57,51,117, -54,114,66,65,65,104,117,66,82,119,76,118,67,80,81,83,114,67,52,71,119,121,69,71,82,89,84,56,75,100,52,53, -98,66,79,52,73,65,67,104,56,80,79,53,72,118,118,97,86,66,117,69,73,77,65,81,107,67,57,119,82,69,47,53, -109,66,70,111,73,67,67,79,52,77,78,67,119,82,48,66,65,73,73,65,71,49,87,103,76,81,74,83,74,100,52,81, -48,69,65,65,73,84,75,100,81,103,71,70,104,65,100,69,100,52,122,84,67,100,52,107,75,69,103,56,80,104,51,51, -117,69,76,103,57,52,66,89,106,75,69,67,73,80,47,98,111,77,78,65,119,80,101,54,72,77,100,52,81,56,66,120, -71,65,65,73,75,70,66,101,65,103,73,66,104,50,79,77,111,88,103,99,89,73,65,74,53,106,118,67,102,81,118,100, -101,73,81,65,78,98,103,76,118,75,82,90,73,121,66,100,52,108,53,121,67,51,66,66,52,79,65,119,72,77,90,89, -51,47,120,66,107,67,57,112,50,66,72,111,56,119,100,52,117,81,80,73,109,73,69,103,82,67,66,68,89,82,114,66, -117,69,72,117,56,73,120,69,65,52,72,65,82,65,77,72,69,65,105,98,68,111,65,72,67,81,52,73,103,66,67,52, -73,66,66,67,73,81,88,69,79,52,107,71,82,120,85,77,88,81,81,74,70,104,68,82,66,65,81,82,51,68,104,67, -68,66,47,55,118,67,88,103,80,117,79,52,56,122,80,65,74,66,68,104,110,53,66,103,98,118,70,104,111,90,70,103, -56,72,88,119,82,51,66,66,73,84,119,69,117,52,70,66,77,81,75,74,67,104,51,117,66,89,76,70,66,74,119,73, -65,66,50,66,52,70,65,65,102,103,87,119,103,65,68,72,103,75,112,66,73,103,88,100,66,52,43,65,73,73,106,101, -67,69,119,106,84,67,56,54,85,71,65,65,119,52,70,69,89,111,43,68,100,119,76,118,67,65,52,80,77,81,73,103, -50,71,98,81,82,118,66,104,103,83,67,100,52,117,47,70,81,115,79,81,89,82,51,66,104,80,56,103,71,79,50,65, -73,66,47,107,78,54,72,77,79,119,82,57,66,97,52,102,115,57,110,103,120,71,65,104,104,84,68,104,98,119,67,79, -119,104,78,70,65,65,54,52,67,79,52,81,97,66,104,103,65,67,100,52,115,79,117,72,110,100,52,82,100,68,100,119, -89,66,66,79,52,105,43,68,82,73,79,73,74,65,76,117,66,83,81,85,80,73,81,86,51,68,73,73,65,66,104,71, -90,119,66,51,69,80,52,85,71,79,73,74,52,66,79,119,74,102,67,54,69,78,65,119,76,71,74,72,52,118,117,80, -65,73,90,66,56,65,109,67,103,71,55,65,65,74,117,67,100,65,101,81,80,65,79,119,86,52,81,65,85,85,73,48, -72,103,120,87,66,100,52,87,77,100,52,121,115,67,117,67,98,66,68,65,89,77,66,68,65,76,118,68,79,52,84,118, -66,79,73,74,119,66,101,65,102,100,112,120,106,67,71,52,105,103,66,104,76,119,67,66,81,110,117,85,111,86,81,72, -65,82,113,66,65,65,82,67,68,104,110,53,68,81,73,65,66,68,73,85,69,89,65,90,73,66,115,65,66,67,65,66, -70,119,103,99,119,109,69,122,74,52,73,90,70,104,110,77,82,53,82,51,70,111,69,65,121,66,104,68,100,52,103,65, -66,104,119,65,67,100,119,81,73,67,100,52,85,72,117,57,119,79,52,74,111,67,65,65,107,79,100,52,99,119,98,111, -103,69,66,100,119,103,65,66,100,119,76,118,74,73,65,79,65,115,56,72,79,53,76,117,70,104,67,120,66,117,65,84, -70,120,66,103,67,65,65,83,65,67,117,52,65,66,73,73,81,57,68,79,52,103,75,67,100,52,80,100,54,68,110,67, -104,48,78,85,111,98,118,67,79,111,74,51,67,47,53,51,72,65,111,106,56,66,100,52,104,51,66,78,119,54,66,67, -70,65,76,118,68,79,52,100,51,77,89,77,80,104,55,117,71,65,89,85,119,89,73,80,103,74,81,103,101,68,68,52, -81,72,68,90,111,75,83,72,120,69,74,104,77,75,83,119,73,65,86,79,52,81,70,67,84,52,74,70,67,57,119,86, -74,100,52,47,77,47,76,119,67,83,65,75,82,70,120,68,82,66,104,57,53,65,119,77,80,43,65,110,74,79,52,76, -118,67,77,111,82,100,68,120,65,75,66,120,66,51,78,104,66,51,67,49,65,113,72,101,73,76,115,66,65,81,77,78, -98,111,116,119,69,73,88,47,65,65,73,72,66,65,65,73,100,70,115,51,77,53,107,65,75,52,77,76,51,99,65,51, -98,117,67,86,89,47,103,65,65,76,81,69,65,73,77,72,85,65,73,65,73,48,65,71,70,100,119,106,114,67,65,89, -81,70,67,47,103,56,66,79,52,81,65,69,43,68,118,70,82,89,101,116,70,89,119,65,68,89,89,111,65,67,104,47, -47,70,89,74,47,66,79,52,110,80,47,108,109,57,120,51,66,65,66,71,65,80,89,81,113,69,70,89,112,51,67,70, -65,73,50,72,84,81,79,113,70,66,76,90,66,85,81,74,117,67,79,52,88,65,52,69,77,73,65,74,76,69,104,47, -118,67,103,80,81,121,65,102,70,55,97,99,67,57,119,65,67,90,73,88,103,73,65,76,69,71,65,65,55,49,66,71, -111,77,77,79,52,97,71,66,65,65,78,65,74,111,99,76,101,66,66,111,68,79,52,103,48,70,75,103,77,80,104,99, -122,57,122,69,75,79,73,77,77,72,89,77,77,66,65,88,56,65,89,85,72,103,56,65,120,65,112,67,73,119,73,72, -66,65,65,122,118,69,79,73,85,65,117,57,119,79,52,48,73,79,53,69,74,122,73,111,66,100,52,88,77,79,52,100, -65,112,56,69,99,103,80,100,103,71,119,68,103,81,55,69,104,54,84,67,117,68,70,69,104,120,82,68,100,52,117,117, -51,81,70,66,111,107,69,85,65,80,113,73,52,83,103,66,79,111,76,111,67,78,103,84,50,67,117,71,65,118,67,119, -68,70,52,74,108,66,72,52,86,51,71,89,79,79,65,119,79,55,104,101,119,79,73,73,111,66,74,111,74,51,70,43, -47,51,43,67,111,66,121,66,76,66,74,111,85,74,47,76,110,70,103,99,65,109,69,65,119,109,65,79,52,80,117,54, -66,78,67,103,53,116,66,65,81,83,55,68,102,89,76,119,66,65,65,98,68,70,52,72,79,57,51,117,57,84,119,67, -111,65,65,66,75,119,79,117,67,73,98,118,71,65,65,108,103,104,65,53,66,103,49,109,115,49,51,65,65,73,54,67, -65,81,77,73,53,65,70,66,50,65,65,66,100,52,89,70,66,71,52,80,117,79,52,86,47,118,52,87,66,53,43,81, -120,118,81,65,73,76,118,69,79,52,57,78,74,119,77,79,100,52,82,108,67,79,119,73,67,66,87,73,74,51,67,100, -52,120,71,67,65,65,102,77,52,72,103,56,72,117,49,50,113,70,119,81,66,66,101,65,106,118,68,79,52,56,71,103, -48,65,120,69,65,79,119,74,51,68,117,49,109,72,119,76,118,69,50,65,66,66,79,52,111,105,70,83,73,84,118,72, -104,47,47,121,66,51,69,103,69,105,65,111,86,69,89,119,83,75,66,98,111,89,50,66,79,65,81,98,66,75,89,76, -117,76,77,111,77,65,79,119,73,65,61,34,41,41,44,48,44,121,43,56,41,59,10,103,46,100,114,97,119,83,116,114, -105,110,103,40,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40, -41,47,50,44,103,46,103,101,116,72,101,105,103,104,116,40,41,45,56,44,180,41,59,10,103,46,102,108,105,112,40,41, -59,10,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,41,59,10,163,40,103,108,111, -98,97,108,46,66,84,78,50,41,123,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,50, -41,59,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,51,41,59,125,255,4,9,0,0, -97,98,111,117,116,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,190,0,0,0,109,99,108,111,99,107,46,105,110,102,111,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,109,99,108,111,99,107,34,44,34, +110,97,109,101,34,58,34,77,111,114,112,104,105,110,103,32,67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99, +108,111,99,107,34,44,34,115,114,99,34,58,34,109,99,108,111,99,107,46,97,112,112,46,106,115,34,44,34,105,99,111, +110,34,58,34,109,99,108,111,99,107,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,57,44,34, +118,101,114,115,105,111,110,34,58,34,48,46,48,55,34,44,34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34, +102,105,108,101,115,34,58,34,109,99,108,111,99,107,46,105,110,102,111,44,109,99,108,111,99,107,46,97,112,112,46,106, +115,44,109,99,108,111,99,107,46,105,109,103,34,125,255,255,95,38,0,0,97,98,111,117,116,46,97,112,112,46,106,115, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,69,78,86,61,112,114,111,99,101,115,115,46,101,110,118, +59,10,172,77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114,121,40,41,59,10,172,115,61,114,101,113,117, +105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,103,46,99,108,101,97,114,40,49,41,59,10,103,46,115,101, +116,70,111,110,116,40,34,54,120,56,34,41,59,10,172,121,61,50,52,44,104,61,56,59,10,163,40,103,46,103,101,116, +87,105,100,116,104,40,41,145,50,52,48,41,123,103,46,100,114,97,119,73,109,97,103,101,40,114,101,113,117,105,114,101, +40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34, +118,69,52,103,81,90,87,103,47,47,65,65,73,51,90,104,52,100,67,111,65,100,54,119,65,100,54,52,65,100,50,106, +52,100,54,108,52,100,99,110,52,100,67,54,65,100,99,43,65,100,89,118,52,100,85,103,103,72,71,47,47,107,103,78, +47,47,65,71,66,49,87,107,68,112,107,79,65,119,115,72,47,103,68,66,103,74,52,67,84,82,119,100,71,108,54,82, +68,108,47,48,103,72,81,103,74,101,77,68,111,50,47,65,103,99,68,73,65,73,107,66,110,65,100,82,103,74,121,67, +65,65,81,100,68,108,103,100,82,103,90,80,68,103,98,87,66,68,111,85,99,68,113,77,80,82,89,99,74,103,69,102, +111,65,55,85,104,57,65,65,103,81,49,66,69,103,73,100,66,110,103,100,82,75,81,73,65,67,109,66,98,66,54,65, +100,66,50,103,100,82,110,111,69,68,121,66,43,67,56,116,98,98,81,86,112,103,78,65,113,79,107,65,119,77,71,121, +69,81,68,111,77,66,49,65,73,66,118,103,100,68,80,89,77,67,43,72,47,47,55,122,66,103,47,47,43,102,65,65, +52,79,65,103,72,47,47,116,119,68,111,77,118,47,52,87,66,51,105,121,69,65,65,80,119,72,73,78,118,84,89,77, +65,118,47,65,47,115,67,54,66,109,66,104,47,119,68,111,80,52,103,73,117,66,100,119,97,121,66,65,65,80,47,68, +111,77,72,52,70,52,84,111,81,83,66,43,69,80,74,81,85,79,103,75,109,68,66,103,73,65,66,104,65,100,70,66, +52,76,55,66,103,102,65,65,89,78,119,106,112,75,67,104,119,74,66,84,73,81,100,68,105,65,100,70,103,72,103,65, +89,73,100,68,109,68,97,67,79,52,77,68,57,87,113,49,52,100,77,43,67,100,67,68,111,85,48,110,68,106,67,104, +121,104,66,65,65,73,100,70,115,103,100,84,90,103,97,86,68,109,80,89,76,74,107,48,76,73,111,100,68,97,73,99, +120,99,73,76,82,68,83,111,56,48,106,105,86,69,67,103,85,65,118,103,68,67,109,71,48,89,81,84,82,72,68,111, +84,82,66,103,76,82,67,77,119,74,68,66,110,111,100,68,101,65,77,68,75,111,85,118,65,73,85,47,68,111,99,68, +54,69,76,68,111,75,82,67,65,73,77,47,76,73,99,71,71,52,80,81,85,73,75,67,66,85,52,80,122,68,111,97, +69,66,47,112,51,66,70,81,75,75,67,104,57,65,68,111,88,115,75,73,86,86,113,111,110,67,116,86,66,111,70,81, +99,65,85,75,121,70,119,103,104,100,66,51,73,80,66,67,119,74,90,67,65,81,77,102,69,103,81,65,76,50,65,71, +70,103,90,74,66,68,111,90,103,68,65,66,69,77,87,89,81,74,70,103,76,119,67,107,65,67,66,47,103,100,76,87, +89,77,67,102,111,81,65,69,51,53,66,69,68,112,107,72,56,69,102,100,103,89,65,68,108,52,109,68,108,54,56,66, +65,66,97,122,66,70,66,65,50,67,103,75,56,67,65,66,99,66,85,90,80,47,56,107,66,118,53,56,67,65,67,49, +47,47,52,65,66,85,81,119,65,83,110,52,100,103,79,120,111,65,76,108,52,100,67,52,65,100,89,106,52,100,54,104, +52,100,43,119,65,100,54,111,65,100,50,103,52,100,67,65,119,81,65,61,34,41,41,44,49,50,48,44,121,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74,83,46,67,79,77,34,44,49,50,48,44,121, +45,52,41,59,125,164,123,121,61,45,40,52,43,104,41,59,125,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34, +80,111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105,110,111,34,44,48,44,121,150,52,43,104,41,59,10,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105,111,110,32,34,43,69,78,86,46,86,69,82,83,73, +79,78,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,111,109,109,105,116,32, +34,43,69,78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44,121,150,104,41,59,10,170,103,101,116,86,101,114, +115,105,111,110,40,110,97,109,101,44,102,105,108,101,41,123,172,106,61,115,46,114,101,97,100,74,83,79,78,40,102,105, +108,101,44,49,41,59,172,118,61,40,34,111,98,106,101,99,116,34,138,191,106,41,63,106,46,118,101,114,115,105,111,110, +58,181,59,103,46,100,114,97,119,83,116,114,105,110,103,40,118,63,40,110,97,109,101,43,34,32,34,43,40,118,63,34, +118,34,43,118,58,34,85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34,43,110,97,109,101,44,48,44,121,150, +104,41,59,125,10,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111, +111,116,46,105,110,102,111,34,41,59,10,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34, +44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,10,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116, +116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,59,10,121,150,104,59,10,103,46,100, +114,97,119,83,116,114,105,110,103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114,105,97,98,108, +101,115,32,97,118,97,105,108,97,98,108,101,34,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,83,116,111,114,97,103,101,58,32,34,43,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, +34,41,46,103,101,116,70,114,101,101,40,41,146,49,48,41,43,34,107,32,102,114,101,101,34,44,48,44,121,150,104,41, +59,10,163,40,69,78,86,46,83,84,79,82,65,71,69,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,32,32, +32,32,32,32,32,32,32,34,43,40,69,78,86,46,83,84,79,82,65,71,69,146,49,48,41,43,34,107,32,116,111,116, +97,108,34,44,48,44,121,150,104,41,59,10,163,40,69,78,86,46,83,80,73,70,76,65,83,72,41,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,83,80,73,32,70,108,97,115,104,58,32,34,43,40,69,78,86,46,83,80,73,70,76, +65,83,72,146,49,48,41,43,34,107,34,44,48,44,121,150,104,41,59,10,103,46,115,101,116,70,111,110,116,65,108,105, +103,110,40,48,44,45,49,41,59,10,103,46,102,108,105,112,40,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40, +114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115, +40,97,116,111,98,40,34,43,70,81,103,108,43,120,110,117,56,65,73,66,119,71,81,103,72,117,65,111,78,51,103,70, +47,104,99,76,103,69,72,117,57,52,51,71,51,104,119,85,67,68,119,73,66,67,65,65,86,51,117,69,65,104,111,66, +66,104,115,79,57,48,79,103,72,103,111,65,67,66,104,48,73,104,80,53,65,65,81,88,66,103,56,72,56,72,119,43, +71,119,69,65,88,110,52,65,69,67,120,71,65,104,48,77,69,65,79,101,74,65,77,80,51,43,47,104,117,73,71,52, +99,77,103,49,109,77,111,103,56,66,104,110,115,65,81,73,66,67,47,47,47,74,52,77,78,54,72,99,66,73,79,73, +65,65,80,115,56,72,108,57,110,77,53,103,99,66,48,72,103,56,53,50,66,65,73,77,65,73,52,89,65,67,73,73, +73,65,67,104,56,65,75,65,99,65,118,65,54,68,55,118,100,55,119,84,66,84,89,74,51,66,57,101,43,104,69,65, +104,65,52,67,121,72,117,121,56,72,88,119,50,57,78,103,73,65,66,120,43,65,83,81,75,115,66,89,103,82,51,68, +103,72,81,67,73,88,77,115,69,65,65,73,79,90,121,71,90,122,120,51,68,104,47,65,53,55,73,68,80,111,88,78, +52,72,78,72,119,81,111,66,57,119,65,66,121,68,118,66,79,52,76,104,68,79,119,82,52,70,100,52,99,80,47,52, +111,66,48,68,87,67,100,52,53,86,67,103,70,70,65,89,80,117,79,52,81,65,67,103,69,101,100,52,80,119,101,65, +73,76,66,78,52,78,112,119,69,77,88,73,76,118,66,79,52,98,118,68,47,102,47,100,52,99,80,67,89,74,49,66, +65,65,75,83,67,122,112,51,69,47,104,78,66,74,119,80,122,105,69,80,43,72,56,104,114,118,68,57,68,116,67,53, +77,74,100,52,82,84,66,71,111,76,118,66,104,101,55,66,81,74,83,66,65,65,101,65,73,52,73,111,67,79,52,84, +50,67,104,56,78,54,68,118,68,101,65,80,103,113,70,81,100,52,56,77,105,66,51,66,69,52,99,73,47,65,118,67, +53,110,115,52,65,75,67,100,103,81,65,68,47,47,119,85,119,77,77,104,104,103,66,79,52,78,109,100,52,120,69,68, +53,55,118,68,43,69,119,70,103,75,84,67,89,111,79,78,47,43,118,47,47,47,47,79,90,119,71,88,103,70,53,53, +118,81,73,52,84,97,66,69,81,82,120,66,54,72,119,55,68,82,67,65,65,80,103,79,52,52,65,67,75,89,108,70, +111,66,51,67,72,73,99,65,105,69,65,105,57,51,73,52,74,112,67,100,65,82,109,66,100,52,73,65,70,100,52,81, +65,69,52,72,65,53,47,47,104,104,49,66,65,73,73,80,66,121,65,53,66,69,81,85,77,47,110,56,79,52,84,122, +67,65,65,81,116,66,104,118,100,47,88,56,100,52,89,89,66,118,119,79,66,79,52,76,118,66,89,73,111,75,66,104, +47,89,101,119,102,65,54,66,51,68,76,111,80,47,100,52,74,88,71,65,66,77,66,105,75,107,69,65,65,119,75,72, +57,76,121,70,79,52,102,119,79,111,82,51,68,100,52,84,68,68,53,47,65,74,81,99,119,68,103,99,79,57,122,118, +67,49,118,100,55,111,99,66,120,117,65,118,104,51,67,117,69,72,104,53,106,67,69,111,79,80,103,72,102,47,53,51, +67,71,103,77,65,111,71,103,98,103,88,47,67,103,74,90,69,65,73,89,65,66,53,72,73,98,120,82,67,66,65,89, +85,76,104,90,102,66,65,65,77,65,47,71,65,47,52,55,66,100,52,52,65,66,104,52,67,66,103,49,109,103,56,65, +51,89,65,66,51,118,116,79,52,99,77,87,120,118,71,53,118,100,90,89,87,73,119,56,65,118,80,81,100,52,78,119, +82,119,85,119,65,89,73,108,66,104,115,78,71,111,82,51,67,113,66,51,66,73,65,82,52,66,70,65,88,72,65,73, +103,47,67,82,65,73,68,66,73,103,116,72,72,73,82,51,68,51,90,104,67,90,89,88,119,119,66,114,67,79,65,88, +80,53,110,56,53,53,107,78,79,52,79,65,66,73,121,120,67,72,89,99,68,109,100,117,116,79,90,65,52,86,65,65, +89,85,78,113,66,48,68,65,65,81,102,68,75,73,86,109,115,51,65,65,103,74,51,66,104,66,77,66,74,119,103,65, +72,104,105,55,68,68,73,81,65,66,103,108,57,67,73,114,118,67,101,65,74,51,74,65,66,80,77,52,65,111,66,104, +113,98,68,73,103,73,48,67,77,81,102,100,79,103,82,51,69,53,110,71,53,77,122,73,65,73,66,66,65,81,73,65, +66,119,65,53,66,103,85,103,107,69,105,69,65,101,55,104,119,69,67,116,103,67,66,50,66,51,66,98,119,77,74,57, +79,101,121,66,76,73,104,51,103,70,65,84,118,67,80,73,84,117,68,104,111,67,69,103,70,86,113,113,48,66,47,47, +119,47,47,47,77,81,87,73,98,89,74,107,70,65,65,73,106,66,69,111,82,51,68,67,111,79,65,56,65,51,67,89, +65,79,118,104,47,119,69,52,76,118,69,75,111,76,118,67,111,69,69,47,55,120,68,65,65,121,47,67,50,71,43,103, +119,50,68,78,81,50,101,57,73,48,68,66,103,120,73,66,120,71,65,87,103,83,49,68,65,65,102,100,55,112,89,69, +54,66,114,66,87,119,85,73,104,50,79,65,119,76,99,71,78,81,79,65,53,106,98,67,100,52,103,65,67,79,52,79, +103,65,103,77,72,117,52,97,66,68,111,107,75,103,71,73,90,52,76,116,66,111,103,65,66,66,103,88,119,52,72,119, +104,110,76,53,108,119,69,81,88,103,100,52,86,51,66,65,73,100,66,98,52,106,118,66,79,52,47,117,73,65,102,81, +75,65,74,51,71,104,55,115,67,54,47,88,55,111,103,66,85,73,76,48,66,67,119,74,51,67,104,72,111,79,52,81, +101,67,79,52,89,72,66,88,65,81,67,66,79,52,120,81,66,74,111,89,86,66,78,119,73,66,66,104,87,113,48,72, +68,119,69,79,67,73,80,117,111,68,116,73,72,52,76,117,67,65,65,79,119,77,73,82,51,66,85,65,84,110,73,102, +103,90,57,66,70,89,75,72,66,100,53,110,81,75,119,73,67,66,66,89,87,65,80,111,74,51,66,47,47,47,100,53, +72,77,53,106,118,68,52,68,120,66,100,52,80,81,71,119,73,66,67,72,73,77,65,101,65,81,65,69,104,81,73,67, +52,71,73,98,111,81,65,66,66,52,105,102,66,87,52,90,101,67,65,65,79,43,69,119,74,121,66,78,81,86,50,115, +68,118,67,65,65,119,54,68,65,65,97,76,70,68,103,80,119,66,52,107,78,71,73,85,74,53,73,51,67,99,111,111, +65,72,79,52,79,90,122,73,76,72,43,65,65,66,70,103,99,75,101,65,97,43,68,100,52,112,51,74,100,52,43,76, +100,52,106,117,67,104,110,77,117,122,48,68,78,81,81,65,66,66,65,77,79,77,52,82,113,68,117,70,119,89,52,73, +85,69,71,112,76,119,66,56,68,106,66,43,65,67,66,67,52,107,74,121,65,69,67,57,51,117,121,65,65,66,68,111, +120,76,66,56,72,119,70,89,84,108,66,65,73,77,77,70,73,74,108,69,81,81,74,51,66,67,111,73,89,66,68,103, +85,76,67,73,112,90,67,81,52,89,71,66,117,53,112,66,104,110,47,117,52,85,69,120,66,50,66,78,111,77,79,57, +119,66,66,57,120,113,68,79,52,74,101,69,69,81,75,84,70,120,65,66,66,119,72,74,104,51,101,120,50,80,57,43, +74,120,110,99,90,65,74,99,66,104,77,74,79,52,109,90,79,52,100,103,88,89,82,80,67,87,81,81,122,70,52,65, +65,66,82,73,104,72,66,53,103,65,67,66,89,80,101,83,65,99,65,120,79,65,65,89,73,67,67,100,119,75,48,67, +81,89,102,99,47,73,54,66,78,89,101,65,79,119,73,65,75,66,103,77,77,81,73,73,72,67,56,69,80,47,47,47, +65,111,76,107,66,103,72,52,43,65,77,67,100,52,117,111,120,87,73,49,66,51,69,65,65,79,81,122,73,68,66,115, +119,67,66,99,73,119,65,71,66,111,115,79,104,55,100,67,104,117,78,65,89,88,118,76,52,73,80,67,104,71,89,103, +69,80,43,65,110,70,70,111,120,51,66,57,118,116,79,52,76,118,66,71,52,55,47,67,99,111,102,79,80,111,89,65, +66,87,73,73,122,67,100,52,98,89,67,66,52,78,119,103,119,70,66,100,52,73,66,66,104,73,48,66,104,54,52,67, +100,119,73,72,66,100,119,74,73,66,100,65,113,55,66,69,103,84,119,68,65,103,97,120,66,65,81,77,74,104,118,100, +66,65,76,117,66,66,65,73,81,68,101,65,77,80,104,47,65,68,81,79,72,50,43,73,104,112,101,68,102,103,98,118, +68,90,65,77,80,53,52,65,67,77,111,74,99,67,115,65,89,67,53,110,79,86,52,79,88,99,103,81,65,68,100,52, +81,65,68,115,56,72,115,70,50,103,49,81,83,119,81,65,69,43,65,99,71,82,73,76,104,68,47,53,99,68,69,52, +121,83,68,65,103,99,71,119,71,100,120,113,118,68,100,52,106,51,66,67,73,77,80,53,105,83,67,118,102,81,99,65, +54,83,66,57,119,76,66,120,66,109,66,65,65,88,47,72,52,76,107,68,83,65,99,79,70,111,79,88,103,71,55,50, +65,103,69,100,52,73,65,68,113,69,70,65,81,107,76,57,51,114,104,122,72,67,76,103,82,73,66,67,119,98,119,67, +66,103,83,70,66,79,111,76,118,66,119,69,77,103,54,88,66,66,103,73,88,68,79,52,87,74,104,117,78,72,81,121, +79,70,43,68,118,67,117,43,119,50,47,81,72,111,81,65,67,66,89,80,116,55,113,115,67,65,65,80,103,79,81,76, +118,74,65,65,101,88,104,89,100,67,90,89,73,66,66,75,89,79,65,65,73,73,47,73,51,121,77,66,54,67,111,66, +100,52,85,68,103,98,118,68,79,52,52,103,66,80,73,81,43,66,87,52,89,65,68,68,52,84,118,66,79,111,73,50, +70,75,65,48,65,48,65,65,66,65,119,102,117,57,111,79,70,79,119,80,103,65,81,76,103,66,68,111,113,119,66,65, +81,73,74,70,79,53,81,65,67,74,73,80,47,74,81,73,68,67,43,65,86,67,79,52,76,114,66,100,103,106,117,69, +50,52,117,66,47,55,117,70,100,52,110,119,81,111,98,48,68,120,69,78,55,117,73,86,120,74,51,69,49,82,51,66, +104,48,79,78,111,90,43,69,57,51,103,65,73,73,80,67,86,81,55,102,68,103,69,78,65,119,82,104,67,56,65,87, +66,69,52,76,118,78,65,65,88,100,97,81,115,65,109,65,72,69,79,52,81,65,66,104,79,90,121,66,54,66,120,66, +51,66,73,103,51,81,72,52,80,81,47,71,73,69,73,73,65,71,81,73,77,80,84,81,77,65,104,84,117,66,49,68, +97,69,57,120,78,67,65,81,84,118,67,76,103,81,65,67,121,68,99,68,65,65,87,73,70,65,82,98,68,51,101,119, +57,121,99,69,75,73,76,118,67,65,66,107,77,65,65,77,65,103,90,75,67,65,65,89,108,66,72,111,103,56,66,65, +65,114,113,68,79,52,109,80,120,53,98,66,117,67,84,68,67,89,87,102,104,47,80,54,65,101,70,78,103,86,119,103, +55,70,69,97,73,84,118,67,52,66,73,66,52,66,51,72,77,103,88,100,69,119,80,47,86,119,121,67,66,79,52,81, +112,66,56,65,52,71,65,66,105,85,67,65,67,66,50,67,79,111,73,66,67,120,72,52,119,69,77,50,56,65,53,104, +89,67,103,69,71,115,122,118,67,54,70,51,78,111,106,75,66,117,70,51,79,52,103,43,68,80,81,80,65,65,65,87, +81,47,55,71,66,53,110,77,72,52,56,68,43,65,115,67,71,52,82,68,67,70,52,89,70,67,80,52,79,65,119,68, +52,71,74,103,81,67,66,104,107,74,66,89,103,56,66,66,81,73,109,67,67,103,103,65,66,66,65,81,67,66,78,103, +73,65,66,100,52,85,76,53,100,119,66,65,83,90,81,120,71,65,75,81,99,78,65,103,80,117,81,103,74,117,66,104, +110,65,122,56,65,47,107,77,53,53,51,71,70,119,77,119,79,52,80,80,104,99,65,47,51,119,68,52,83,98,69,100, +52,77,73,71,65,76,52,67,65,65,78,119,72,52,121,111,66,82,81,83,99,68,79,89,52,65,77,47,71,73,43,69, +77,51,103,88,67,83,73,90,101,66,103,56,65,117,55,118,69,79,52,118,81,74,103,73,65,66,43,66,84,66,56,68, +118,73,47,47,56,70,81,76,122,66,70,89,80,76,53,89,68,66,75,81,118,81,100,53,90,51,70,89,111,85,80,79, +52,90,85,66,67,81,79,102,47,53,89,68,86,111,73,70,68,73,119,78,119,43,67,85,72,66,103,81,65,68,69,65, +79,73,85,81,110,72,103,57,119,103,43,56,55,49,52,122,85,81,67,89,98,118,66,79,52,112,68,70,88,119,82,80, +66,100,52,85,79,102,119,73,122,66,53,101,55,85,52,103,65,77,79,52,82,52,66,65,52,83,52,72,104,103,105,66, +79,52,53,50,68,82,81,99,80,53,52,69,67,121,69,74,122,74,51,68,107,89,88,68,71,73,73,65,66,82,81,84, +118,67,86,111,73,48,69,104,118,99,90,103,104,70,67,117,52,81,66,97,81,104,75,69,100,89,73,73,70,79,52,109, +55,104,101,119,71,73,73,82,70,69,74,65,65,70,77,89,82,81,67,82,81,90,51,70,88,89,85,79,67,89,88,103, +100,52,99,74,104,74,53,66,66,73,77,79,103,69,57,109,65,89,67,120,71,65,100,52,107,65,100,119,74,51,68,122, +73,89,66,104,117,57,79,119,98,118,68,80,119,113,84,67,99,73,56,76,65,89,85,56,51,103,69,67,50,66,52,66, +67,111,80,56,53,110,115,52,90,54,66,79,53,85,80,47,53,108,67,65,65,122,43,68,70,52,107,80,79,111,73,66, +66,67,52,101,103,103,71,112,100,111,74,101,66,104,51,103,103,69,68,107,76,118,71,72,82,79,101,68,65,77,73,55, +114,70,69,84,89,76,86,66,51,101,119,54,65,77,68,74,119,120,75,69,103,99,65,81,103,90,51,68,53,47,47,53, +51,79,110,107,56,79,52,97,43,66,65,73,79,54,50,68,118,73,75,81,77,74,75,73,77,73,90,111,102,81,104,51, +117,79,81,73,65,66,82,52,88,47,66,103,76,116,66,100,52,104,51,66,52,43,81,105,70,50,103,122,106,67,101,103, +103,65,66,53,118,109,119,71,114,100,52,89,65,68,83,89,77,71,121,50,87,100,52,106,79,68,100,52,106,53,69,65, +65,53,50,66,77,119,76,118,66,53,51,117,79,52,77,78,84,73,85,66,103,73,82,66,49,84,79,66,65,65,74,108, +66,65,66,107,72,74,65,88,103,72,89,73,57,67,88,65,75,54,67,98,119,118,103,104,120,51,66,65,111,78,103,65, +81,73,49,66,105,77,65,119,53,51,69,120,74,51,66,65,65,85,77,104,87,81,104,112,116,67,100,52,84,51,68,78, +119,122,71,66,104,104,53,66,104,110,77,80,111,81,69,68,66,65,110,77,53,106,118,66,52,89,73,66,70,81,85,81, +43,69,81,100,52,112,108,66,70,89,90,76,67,71,103,118,81,117,68,118,67,79,52,47,103,100,111,87,90,122,73,87, +68,79,52,84,118,68,71,89,73,66,66,120,71,76,119,43,72,79,52,79,75,79,52,110,65,49,87,81,52,71,119,70, +89,77,71,66,73,77,76,51,97,54,73,47,53,51,67,103,69,79,90,120,111,65,70,79,52,77,80,103,80,120,83,119, +73,65,69,57,51,103,83,73,81,65,67,113,115,70,113,69,77,70,52,77,76,101,65,98,106,70,87,52,85,65,48,65, +66,67,65,65,109,79,83,119,112,51,68,120,101,55,104,65,105,71,104,97,51,66,104,79,81,104,65,78,67,100,52,87, +47,108,55,69,68,121,71,81,122,73,76,66,71,52,76,52,71,80,52,90,51,79,68,103,75,86,66,76,103,89,104,66, +76,52,77,77,47,107,65,47,76,99,66,111,72,119,111,67,65,70,54,72,117,101,65,76,100,66,104,51,43,101,65,81, +65,66,117,69,72,99,103,75,100,70,98,103,81,66,66,52,74,116,68,51,89,65,71,103,71,119,85,111,73,105,68,65, +89,84,100,66,50,88,121,50,68,105,67,79,103,74,52,66,79,52,118,81,80,89,102,77,71,81,74,100,66,53,110,77, +53,53,114,69,76,89,103,57,67,65,52,102,118,79,52,99,73,120,69,65,122,74,111,66,104,52,117,66,79,52,115,76, +72,52,81,79,66,67,52,88,47,80,65,77,72,65,65,81,83,67,103,47,117,100,52,85,77,65,65,89,77,67,122,79, +73,119,66,50,71,79,52,111,65,66,74,81,98,118,70,65,65,103,51,66,72,65,80,103,70,73,75,112,68,79,52,84, +103,66,47,47,53,122,77,76,49,99,65,106,85,65,104,85,81,101,65,89,65,66,120,65,101,67,55,113,87,68,65,65, +76,118,67,65,65,102,65,75,52,98,98,66,57,50,81,65,65,74,67,70,103,57,51,100,52,103,71,66,65,103,83,86, +66,79,52,115,74,120,98,118,73,50,69,73,66,119,80,89,65,81,79,113,86,111,89,79,66,88,65,73,67,68,98,73, +53,89,68,79,52,99,74,122,79,90,122,110,77,104,81,105,67,75,89,88,81,79,52,80,77,67,81,76,67,66,76,89, +111,114,73,65,66,71,81,104,112,51,67,101,119,84,118,68,75,73,98,118,66,53,52,84,66,100,52,53,51,72,100,52, +115,78,80,81,87,90,71,73,84,110,68,98,81,77,80,88,52,106,76,70,65,66,69,79,78,81,77,75,51,81,71,66, +70,65,82,51,67,103,56,71,100,52,74,119,82,68,89,82,119,68,85,81,74,72,67,56,72,103,67,103,50,119,100,52, +88,65,43,66,51,68,101,89,79,47,66,103,77,74,120,68,118,72,104,89,77,66,100,52,108,51,97,103,82,67,73,55, +115,78,65,65,74,69,69,70,103,76,116,67,74,52,110,77,53,103,98,71,104,113,82,66,103,57,103,77,103,85,80,100, +111,89,66,68,102,119,73,97,69,120,65,65,66,119,68,118,69,65,73,85,79,104,73,66,66,81,65,77,74,65,89,74, +51,68,57,51,65,104,55,82,68,65,65,79,55,43,65,82,66,69,81,103,65,68,66,65,98,118,66,65,111,80,117,79, +52,56,79,87,52,82,50,70,65,65,90,50,71,67,111,80,79,69,65,77,76,88,52,103,68,67,78,89,84,118,66,43, +72,119,47,56,65,117,65,73,66,65,81,83,99,66,68,81,81,66,66,71,52,83,111,66,70,52,79,81,65,65,76,118, +68,79,52,90,81,67,100,52,101,90,79,119,98,68,67,100,52,87,90,119,69,80,71,119,81,65,76,55,112,51,66,104, +79,81,68,65,76,77,66,81,81,80,103,78,89,47,98,79,52,82,52,68,67,65,88,120,47,68,79,71,65,65,90,110, +66,65,65,77,80,100,52,74,67,66,103,52,65,66,84,103,111,52,66,65,73,80,117,69,119,88,116,101,65,104,108,68, +74,103,79,81,100,52,85,76,51,89,77,67,47,80,119,65,103,87,53,50,69,74,47,103,114,68,104,47,47,79,52,73, +112,68,101,81,48,65,53,105,76,66,71,73,79,119,99,52,90,66,66,53,110,65,71,52,79,90,109,55,49,66,73,111, +82,51,68,104,121,114,67,47,56,81,69,103,89,105,66,117,53,48,66,82,73,100,119,85,119,76,118,66,65,65,112,51, +68,100,119,89,108,66,69,119,83,51,67,65,67,76,118,71,79,52,102,77,53,104,51,67,66,81,73,112,68,103,69,73, +120,65,70,68,113,111,101,67,68,52,80,100,104,118,81,82,89,79,65,47,47,119,56,67,115,66,77,73,77,76,55,122, +97,67,77,111,89,65,67,105,77,102,70,52,80,119,88,52,79,81,117,70,119,100,103,90,51,66,54,66,103,66,101,65, +77,65,100,52,111,82,66,51,99,76,86,103,76,70,70,104,111,69,66,104,97,55,67,104,56,80,104,65,65,66,65,103, +74,52,71,43,121,99,67,100,52,118,72,118,106,66,66,86,73,90,53,69,100,52,103,65,66,83,111,81,120,67,104,115, +73,100,89,87,81,56,72,112,104,79,110,86,119,52,105,67,84,52,104,81,66,79,52,84,118,68,77,89,82,51,68,100, +81,86,119,66,73,82,51,67,104,99,76,80,65,76,118,68,72,119,88,65,70,81,81,83,67,65,66,88,119,80,111,80, +47,115,66,67,72,79,52,83,77,67,119,66,120,69,104,65,70,66,53,110,99,68,89,73,115,77,69,111,75,70,67,97, +52,89,68,67,56,68,67,66,65,81,79,90,53,110,77,66,73,76,118,73,65,111,80,100,72,52,85,80,100,103,73,66, +68,83,65,81,65,67,74,103,77,73,72,89,122,118,68,100,111,81,65,68,66,119,101,90,122,77,65,115,120,51,67,75, +103,90,73,66,73,111,102,65,77,65,111,77,66,119,66,75,66,54,65,77,69,76,65,81,67,66,73,73,73,65,75,88, +82,71,90,47,54,89,68,73,81,78,119,103,55,118,66,79,52,98,117,66,65,66,101,119,65,65,75,43,68,71,104,52, +65,69,122,51,112,101,103,90,116,66,71,119,76,121,67,52,67,49,68,79,119,106,47,68,79,53,66,89,66,104,79,81, +51,74,67,66,104,55,76,66,103,72,117,65,65,77,65,53,118,103,118,73,57,72,86,65,75,112,67,65,66,68,107,66, +79,52,122,116,68,103,69,69,100,119,89,65,74,100,52,84,113,68,103,119,70,69,79,52,115,80,57,53,65,66,79,52, +84,105,66,98,89,112,52,69,75,111,110,99,103,69,75,65,73,80,100,82,111,77,74,67,111,74,67,68,98,89,81,106, +66,68,81,80,65,56,70,119,48,66,81,76,65,89,121,89,66,65,65,117,73,119,65,65,66,103,55,53,68,67,65,73, +83,69,43,68,86,66,65,81,84,118,72,115,70,103,90,81,50,90,100,52,53,84,67,71,119,103,73,67,56,72,117,65, +81,73,78,68,100,52,87,103,48,72,81,53,106,52,66,121,65,97,69,72,111,84,118,70,79,52,79,119,77,111,117,89, +109,99,119,104,47,47,65,73,73,75,68,89,103,89,65,68,104,52,73,66,80,73,77,72,103,55,100,66,103,120,111,70, +67,65,77,65,119,65,67,66,69,73,103,65,67,100,119,77,71,65,119,89,87,68,104,118,76,68,52,115,79,101,111,77, +72,65,119,87,74,119,68,118,73,79,52,74,120,66,101,65,76,118,66,53,106,100,75,65,66,102,52,82,65,79,73,109, +67,78,66,75,111,86,81,65,81,79,79,71,52,89,65,67,47,53,85,66,100,52,89,55,66,66,89,81,52,83,100,52, +115,80,106,54,79,67,76,81,73,65,72,79,52,99,73,72,52,82,50,66,80,65,119,65,67,104,99,79,88,89,77,77, +103,89,78,72,104,112,79,68,65,65,55,88,66,79,52,114,118,66,77,119,77,73,57,72,111,101,89,90,66,67,53,107, +77,52,65,71,66,100,52,84,80,67,52,68,53,67,117,43,90,104,53,105,66,51,101,119,50,72,80,53,110,65,100,65, +98,119,66,65,111,99,80,43,74,51,67,104,73,116,67,79,73,89,116,67,65,111,89,79,66,103,72,103,79,119,85,77, +100,89,73,65,68,66,73,79,119,56,70,119,54,71,81,76,119,73,65,71,54,71,90,122,76,118,75,70,89,74,54,66, +100,52,97,114,67,55,113,82,67,79,52,99,77,53,103,65,66,65,119,73,121,66,56,68,118,68,67,65,82,75,67,43, +67,56,66,65,103,80,47,47,52,71,66,65,66,69,66,105,74,51,66,113,65,99,67,117,70,51,79,52,108,51,65,119, +103,65,70,52,65,65,66,73,81,74,51,67,104,55,119,68,121,89,73,66,49,77,75,55,103,79,67,89,119,79,81,68, +103,99,77,78,89,80,47,78,119,81,77,67,121,68,116,66,66,65,81,72,66,104,118,57,47,112,51,70,79,119,84,90, +66,88,81,99,74,120,51,117,103,70,51,117,69,72,118,75,110,68,79,52,76,118,68,100,81,89,65,68,76,52,107,80, +56,49,119,100,65,49,52,75,81,109,119,99,111,113,51,67,65,81,80,56,66,89,102,119,101,65,84,118,67,121,71,81, +54,69,77,73,52,74,51,66,100,53,85,65,104,81,69,68,120,69,73,100,111,79,103,79,52,77,80,68,81,74,51,71, +77,73,80,73,76,81,104,69,66,56,66,88,67,74,81,82,51,69,71,112,73,65,70,104,47,103,56,65,116,67,76,119, +81,108,66,72,111,73,103,67,65,81,98,119,70,80,81,99,65,103,103,76,69,100,52,83,85,66,54,65,82,66,117,70, +57,54,69,65,104,77,76,51,89,65,66,68,89,77,74,67,119,81,119,67,78,89,87,65,65,81,74,86,66,55,118,119, +47,111,97,66,79,52,89,48,66,53,105,117,68,52,43,81,104,120,51,75,104,52,68,67,87,111,73,71,66,104,55,116, +67,65,103,73,85,69,43,72,117,65,89,74,51,68,47,56,65,55,105,84,68,104,103,101,67,101,103,81,65,69,66,73, +100,69,111,66,111,66,57,73,73,68,79,52,80,99,68,81,78,119,117,68,118,68,50,67,97,67,52,72,65,67,65,76, +117,69,100,52,105,82,66,55,118,122,79,52,74,84,66,103,53,74,67,101,65,88,111,104,69,77,118,76,118,71,65,103, +77,68,47,47,121,79,65,76,86,66,66,103,73,68,67,65,65,56,79,66,89,76,118,68,65,65,86,81,43,65,66,66, +99,111,111,66,66,101,81,53,52,67,103,103,65,66,69,103,75,90,67,81,89,103,65,66,79,52,81,88,68,79,52,119, +65,74,100,81,77,78,55,118,100,100,119,79,73,103,57,51,88,73,88,77,104,51,103,119,68,117,66,76,103,81,51,67, +78,111,74,100,66,43,72,119,47,55,105,67,104,110,115,70,73,107,78,104,115,77,72,111,85,79,67,65,74,51,66,101, +103,81,65,66,103,116,86,78,81,119,110,66,65,89,77,76,87,89,73,65,68,78,103,86,65,79,119,78,65,100,52,85, +78,53,112,102,70,75,119,82,51,71,103,69,74,103,66,107,66,76,73,88,47,86,111,75,111,67,88,81,103,65,72,66, +52,81,65,70,79,65,80,119,76,89,73,66,66,79,52,81,68,66,65,73,73,106,66,83,73,80,77,68,89,120,121,68, +104,97,67,66,98,52,122,118,74,57,119,65,69,50,67,52,66,101,65,75,108,70,79,52,107,73,65,81,78,116,53,110, +79,68,111,74,51,66,51,98,56,69,72,119,73,47,66,74,73,82,110,73,79,81,107,77,99,89,103,65,72,66,81,73, +77,72,67,52,85,80,47,54,108,67,78,103,74,116,67,55,112,53,67,50,71,119,54,71,119,51,111,73,66,68,65,77, +76,104,76,68,66,65,111,73,102,67,97,73,81,65,69,83,119,90,51,70,103,71,81,66,89,85,79,104,89,68,66,79, +52,89,65,72,118,70,52,104,51,101,103,71,90,121,66,88,66,77,119,47,81,76,52,107,78,55,111,50,67,103,99,119, +109,99,119,99,103,81,65,68,51,101,119,75,89,74,86,70,103,57,51,117,54,114,66,65,65,104,117,66,82,119,76,118, +67,80,81,83,114,67,52,71,119,121,69,71,82,89,84,56,75,100,52,53,98,66,79,52,73,65,67,104,56,80,79,53, +72,118,118,97,86,66,117,69,73,77,65,81,107,67,57,119,82,69,47,53,109,66,70,111,73,67,67,79,52,77,78,67, +119,82,48,66,65,73,73,65,71,49,87,103,76,81,74,83,74,100,52,81,48,69,65,65,73,84,75,100,81,103,71,70, +104,65,100,69,100,52,122,84,67,100,52,107,75,69,103,56,80,104,51,51,117,69,76,103,57,52,66,89,106,75,69,67, +73,80,47,98,111,77,78,65,119,80,101,54,72,77,100,52,81,56,66,120,71,65,65,73,75,70,66,101,65,103,73,66, +104,50,79,77,111,88,103,99,89,73,65,74,53,106,118,67,102,81,118,100,101,73,81,65,78,98,103,76,118,75,82,90, +73,121,66,100,52,108,53,121,67,51,66,66,52,79,65,119,72,77,90,89,51,47,120,66,107,67,57,112,50,66,72,111, +56,119,100,52,117,81,80,73,109,73,69,103,82,67,66,68,89,82,114,66,117,69,72,117,56,73,120,69,65,52,72,65, +82,65,77,72,69,65,105,98,68,111,65,72,67,81,52,73,103,66,67,52,73,66,66,67,73,81,88,69,79,52,107,71, +82,120,85,77,88,81,81,74,70,104,68,82,66,65,81,82,51,68,104,67,68,66,47,55,118,67,88,103,80,117,79,52, +56,122,80,65,74,66,68,104,110,53,66,103,98,118,70,104,111,90,70,103,56,72,88,119,82,51,66,66,73,84,119,69, +117,52,70,66,77,81,75,74,67,104,51,117,66,89,76,70,66,74,119,73,65,66,50,66,52,70,65,65,102,103,87,119, +103,65,68,72,103,75,112,66,73,103,88,100,66,52,43,65,73,73,106,101,67,69,119,106,84,67,56,54,85,71,65,65, +119,52,70,69,89,111,43,68,100,119,76,118,67,65,52,80,77,81,73,103,50,71,98,81,82,118,66,104,103,83,67,100, +52,117,47,70,81,115,79,81,89,82,51,66,104,80,56,103,71,79,50,65,73,66,47,107,78,54,72,77,79,119,82,57, +66,97,52,102,115,57,110,103,120,71,65,104,104,84,68,104,98,119,67,79,119,104,78,70,65,65,54,52,67,79,52,81, +97,66,104,103,65,67,100,52,115,79,117,72,110,100,52,82,100,68,100,119,89,66,66,79,52,105,43,68,82,73,79,73, +74,65,76,117,66,83,81,85,80,73,81,86,51,68,73,73,65,66,104,71,90,119,66,51,69,80,52,85,71,79,73,74, +52,66,79,119,74,102,67,54,69,78,65,119,76,71,74,72,52,118,117,80,65,73,90,66,56,65,109,67,103,71,55,65, +65,74,117,67,100,65,101,81,80,65,79,119,86,52,81,65,85,85,73,48,72,103,120,87,66,100,52,87,77,100,52,121, +115,67,117,67,98,66,68,65,89,77,66,68,65,76,118,68,79,52,84,118,66,79,73,74,119,66,101,65,102,100,112,120, +106,67,71,52,105,103,66,104,76,119,67,66,81,110,117,85,111,86,81,72,65,82,113,66,65,65,82,67,68,104,110,53, +68,81,73,65,66,68,73,85,69,89,65,90,73,66,115,65,66,67,65,66,70,119,103,99,119,109,69,122,74,52,73,90, +70,104,110,77,82,53,82,51,70,111,69,65,121,66,104,68,100,52,103,65,66,104,119,65,67,100,119,81,73,67,100,52, +85,72,117,57,119,79,52,74,111,67,65,65,107,79,100,52,99,119,98,111,103,69,66,100,119,103,65,66,100,119,76,118, +74,73,65,79,65,115,56,72,79,53,76,117,70,104,67,120,66,117,65,84,70,120,66,103,67,65,65,83,65,67,117,52, +65,66,73,73,81,57,68,79,52,103,75,67,100,52,80,100,54,68,110,67,104,48,78,85,111,98,118,67,79,111,74,51, +67,47,53,51,72,65,111,106,56,66,100,52,104,51,66,78,119,54,66,67,70,65,76,118,68,79,52,100,51,77,89,77, +80,104,55,117,71,65,89,85,119,89,73,80,103,74,81,103,101,68,68,52,81,72,68,90,111,75,83,72,120,69,74,104, +77,75,83,119,73,65,86,79,52,81,70,67,84,52,74,70,67,57,119,86,74,100,52,47,77,47,76,119,67,83,65,75, +82,70,120,68,82,66,104,57,53,65,119,77,80,43,65,110,74,79,52,76,118,67,77,111,82,100,68,120,65,75,66,120, +66,51,78,104,66,51,67,49,65,113,72,101,73,76,115,66,65,81,77,78,98,111,116,119,69,73,88,47,65,65,73,72, +66,65,65,73,100,70,115,51,77,53,107,65,75,52,77,76,51,99,65,51,98,117,67,86,89,47,103,65,65,76,81,69, +65,73,77,72,85,65,73,65,73,48,65,71,70,100,119,106,114,67,65,89,81,70,67,47,103,56,66,79,52,81,65,69, +43,68,118,70,82,89,101,116,70,89,119,65,68,89,89,111,65,67,104,47,47,70,89,74,47,66,79,52,110,80,47,108, +109,57,120,51,66,65,66,71,65,80,89,81,113,69,70,89,112,51,67,70,65,73,50,72,84,81,79,113,70,66,76,90, +66,85,81,74,117,67,79,52,88,65,52,69,77,73,65,74,76,69,104,47,118,67,103,80,81,121,65,102,70,55,97,99, +67,57,119,65,67,90,73,88,103,73,65,76,69,71,65,65,55,49,66,71,111,77,77,79,52,97,71,66,65,65,78,65, +74,111,99,76,101,66,66,111,68,79,52,103,48,70,75,103,77,80,104,99,122,57,122,69,75,79,73,77,77,72,89,77, +77,66,65,88,56,65,89,85,72,103,56,65,120,65,112,67,73,119,73,72,66,65,65,122,118,69,79,73,85,65,117,57, +119,79,52,48,73,79,53,69,74,122,73,111,66,100,52,88,77,79,52,100,65,112,56,69,99,103,80,100,103,71,119,68, +103,81,55,69,104,54,84,67,117,68,70,69,104,120,82,68,100,52,117,117,51,81,70,66,111,107,69,85,65,80,113,73, +52,83,103,66,79,111,76,111,67,78,103,84,50,67,117,71,65,118,67,119,68,70,52,74,108,66,72,52,86,51,71,89, +79,79,65,119,79,55,104,101,119,79,73,73,111,66,74,111,74,51,70,43,47,51,43,67,111,66,121,66,76,66,74,111, +85,74,47,76,110,70,103,99,65,109,69,65,119,109,65,79,52,80,117,54,66,78,67,103,53,116,66,65,81,83,55,68, +102,89,76,119,66,65,65,98,68,70,52,72,79,57,51,117,57,84,119,67,111,65,65,66,75,119,79,117,67,73,98,118, +71,65,65,108,103,104,65,53,66,103,49,109,115,49,51,65,65,73,54,67,65,81,77,73,53,65,70,66,50,65,65,66, +100,52,89,70,66,71,52,80,117,79,52,86,47,118,52,87,66,53,43,81,120,118,81,65,73,76,118,69,79,52,57,78, +74,119,77,79,100,52,82,108,67,79,119,73,67,66,87,73,74,51,67,100,52,120,71,67,65,65,102,77,52,72,103,56, +72,117,49,50,113,70,119,81,66,66,101,65,106,118,68,79,52,56,71,103,48,65,120,69,65,79,119,74,51,68,117,49, +109,72,119,76,118,69,50,65,66,66,79,52,111,105,70,83,73,84,118,72,104,47,47,121,66,51,69,103,69,105,65,111, +86,69,89,119,83,75,66,98,111,89,50,66,79,65,81,98,66,75,89,76,117,76,77,111,77,65,79,119,73,65,61,34, +41,41,44,48,44,121,43,56,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,78,82,70,46,103,101,116,65, +100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,103,46,103,101,116,72,101,105, +103,104,116,40,41,45,56,44,180,41,59,10,103,46,102,108,105,112,40,41,59,10,115,101,116,87,97,116,99,104,40,95, +162,108,111,97,100,40,41,44,66,84,78,49,41,59,10,163,40,103,108,111,98,97,108,46,66,84,78,50,41,123,115,101, +116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,50,41,59,115,101,116,87,97,116,99,104,40,95, +162,108,111,97,100,40,41,44,66,84,78,51,41,59,125,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254, -254,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,121,85,85,85,85,85, -85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85, -85,85,85,85,85,85,121,163,206,206,206,121,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,200,206,206,206,206,199,121,85,85,85, -85,85,85,85,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85, -85,85,85,121,163,206,206,206,206,206,206,206,163,85,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206,206,206,206,163,85,85, -85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85, -163,200,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,199,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85, -85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206, -206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85, -85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206, -206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85, -85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206, -206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85, -85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,205,206, -206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,206,206,206,206,206,206,206,206,206,206,206,206,206,206,121,85,85, -85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,79,157, -206,206,206,206,206,206,206,206,206,206,206,206,121,79,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,85,85,85,85,85,85,79,79,121,199,206,206,206,206,206,206,206,206,199,121,79,79,85,85, -85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,79,79, -79,198,198,199,199,205,205,199,199,198,198,79,79,79,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,79,79,79,198,198,198,198,198,198,198,198,198,198,79,79,79,85,85, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,86,51, -15,199,198,198,198,198,198,198,198,198,199,15,51,86,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,15,15,128,198,198,198,198,198,198,198,198,128,15,15,101,101,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,58, -15,57,205,198,198,198,198,198,198,205,57,15,58,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,58,15,15,206,205,199,198,198,199,205,206,15,15,58,101,101,101, -101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101, -15,15,129,206,206,206,206,206,206,93,15,15,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,58,15,15,164,206,206,206,206,164,15,15,58,101,101,101,101, -101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101, -101,16,15,15,93,206,206,93,15,15,16,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,65,15,15,15,15,15,15,15,16,65,101,101,101,101,101, -101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101, -101,101,101,58,15,15,15,15,58,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,254,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85, +85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85, +85,85,85,85,85,85,85,85,85,85,85,85,121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121, +85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, +85,85,85,85,85,85,85,85,85,121,200,206,206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206, +163,85,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, +85,85,85,85,85,121,163,206,206,206,206,206,206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206, +206,206,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, +85,85,121,199,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, +206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, +85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206, +206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, +85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, +254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, +206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, +85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206, +206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, +85,85,121,206,206,206,206,206,206,206,206,206,206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206, +121,79,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, +85,85,79,79,121,199,206,206,206,206,206,206,206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79, +79,79,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,79,79,79,198,198,198,198,198,198,198,198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15, +51,86,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,101,101,15,15,128,198,198,198,198,198,198,198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15, +58,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +101,101,101,58,15,15,206,205,199,198,198,199,205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15, +101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101, +101,101,101,101,58,15,15,164,206,206,206,206,164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101, +101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101, +101,101,101,101,101,65,15,15,15,15,15,15,15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101, +101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -166,0,0,0,97,98,111,117,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,97,98,111,117,116,34,44,34,110,97,109,101,34,58,34,65,98,111,117,116,34,44,34,115,114, -99,34,58,34,97,98,111,117,116,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,98,111,117,116,46, -105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,52,44,34,118,101,114,115,105,111,110,34,58,34,48, -46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115, -34,58,34,97,98,111,117,116,46,105,110,102,111,44,97,98,111,117,116,46,97,112,112,46,106,115,44,97,98,111,117,116, -46,105,109,103,34,125,255,255,98,3,0,0,119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,40,170,40,41,123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68,71,69,84,83, -91,34,98,97,116,34,93,46,119,105,100,116,104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103, -105,110,103,40,41,63,49,54,58,48,41,59,125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114,103,105,110,103, -39,44,170,40,99,104,97,114,103,105,110,103,41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110,103,108,101,46, -98,117,122,122,40,41,59,115,101,116,87,105,100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100, -103,101,116,115,40,41,59,103,46,102,108,105,112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73,110,116,101,114, -118,97,108,61,66,97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101,114,118,97,108, -40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41, -58,183,59,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40, -111,110,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40,33,98,97,116, -116,101,114,121,73,110,116,101,114,118,97,108,41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,115,101,116, -73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40, -41,44,54,48,48,48,48,41,59,125,164,123,163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,123,99, -108,101,97,114,73,110,116,101,114,118,97,108,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,59,98,97, -116,116,101,114,121,73,110,116,101,114,118,97,108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83,91,34,98,97, -116,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119,58,170,40,41, -123,172,115,61,51,57,59,172,120,61,175,46,120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40,41,59,163,40, -66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111,108,111,114,40, -34,35,48,102,48,34,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66,72,79,66,122, -103,99,52,72,79,80,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47,52,72,103,66, -52,65,101,65,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59,120,150,49,54, -59,125,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108,108,82,101,99, -116,40,120,44,121,43,50,44,120,43,115,45,52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99,116,40,120,43, -50,44,121,43,52,44,120,43,115,45,54,44,121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120,43,115,45,51, -44,121,43,49,48,44,120,43,115,44,121,43,49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48, -34,41,46,102,105,108,108,82,101,99,116,40,120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101,116,66,97,116, -116,101,114,121,40,41,42,40,115,45,49,50,41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115,101,116,87,105, -100,116,104,40,41,59,125,41,40,41,255,255,138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34,110,97,109,101, -34,58,34,66,97,116,116,101,114,121,32,76,101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58, -34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116,97,103,115,34, -58,34,119,105,100,103,101,116,44,98,97,116,116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,97, -116,46,105,110,102,111,44,119,105,100,98,97,116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0,119,105,100,98, -116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91, -34,98,108,117,101,116,111,111,116,104,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,53, -44,100,114,97,119,58,170,40,41,123,103,46,114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101,116,83,101,99, -117,114,105,116,121,83,116,97,116,117,115,40,41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101,116,67,111,108, -111,114,40,40,103,46,103,101,116,66,80,80,40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46,116,104,101,109, -101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101,116,67,111,108, -111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57,34,41,59,103, -46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74,103,82,52,106, -90,77,97,119,102,65,99,65,52,68,52,78,89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61,61,34,41,44, -50,43,175,46,120,44,50,43,175,46,121,41,59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87,73,68,71,69, -84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78,82,70,46,111, -110,40,39,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93, -46,99,104,97,110,103,101,100,41,59,10,78,82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99,116,39,44,87, -73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,255,255,255, -133,0,0,0,119,105,100,98,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,119,105,100,98,116,34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32, -87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110, -34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101,116,111,111,116, -104,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116,46,119,105,100, -46,106,115,34,125,255,255,255,169,0,0,0,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,0,0,0,0,0, -0,0,0,0,0,0,0,0,40,170,40,41,123,173,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101, -39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,123,125, -59,163,40,33,115,46,119,101,108,99,111,109,101,100,41,123,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,114, -101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101, -46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,180,125,41,108,111,97,100,40,39,119,101,108,99,111,109, -101,46,97,112,112,46,106,115,39,41,125,41,125,125,41,40,41,255,255,255,165,27,0,0,119,101,108,99,111,109,101,46, -97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,170,97,110,105,109,97,116,101,40,115,101, -113,44,112,101,114,105,111,100,41,123,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,163,40,115, -101,113,46,108,101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104,105,102,116,40,41,59,163,40,102,41,102,40, -41,59,125,164,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,112,101,114,105,111,100,41,59,125, -10,170,102,97,100,101,40,99,111,108,44,99,97,108,108,98,97,99,107,41,123,172,110,61,48,59,170,102,40,41,123,34, -114,97,109,34,103,46,115,101,116,67,111,108,111,114,40,99,111,108,41,59,167,40,172,105,61,110,59,105,60,50,52,48, -59,105,150,49,48,41,103,46,100,114,97,119,76,105,110,101,40,105,44,48,44,48,44,105,41,46,100,114,97,119,76,105, -110,101,40,105,44,50,52,48,44,50,52,48,44,105,41,59,103,46,102,108,105,112,40,41,59,110,152,59,163,40,110,60, -49,48,41,115,101,116,84,105,109,101,111,117,116,40,102,44,48,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125, -102,40,41,59,125,10,172,83,67,69,78,69,95,67,79,85,78,84,61,49,49,59,10,170,103,101,116,83,99,101,110,101, -40,110,41,123,163,40,110,138,48,41,171,170,40,41,123,103,46,99,108,101,97,114,40,49,41,59,103,46,115,101,116,70, -111,110,116,40,34,52,120,54,34,44,50,41,59,172,110,61,48,59,172,108,61,66,97,110,103,108,101,46,103,101,116,76, -111,103,111,40,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46,48,52,59, -103,46,115,101,116,67,111,108,111,114,40,110,44,110,44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,44, -40,50,52,48,45,50,50,50,41,47,50,44,40,50,52,48,45,49,48,48,41,47,50,41,59,163,40,110,145,49,41,123, -99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,79,112,101,110,34,44,51,52,44,49,52,52,41,44,53,48,48,41,59, -115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,97,99,107, -97,98,108,101,34,44,51,52,44,49,53,54,41,44,49,48,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40, -41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,109,97,114,116,32,87,97,116,99,104,34,44,51,52,44, -49,54,56,41,44,49,53,48,48,41,59,125,125,44,53,48,41,59,125,59,163,40,110,138,49,41,171,170,40,41,123,172, -105,109,103,61,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112, -114,101,115,115,40,97,116,111,98,40,34,112,116,82,120,72,43,113,89,65,102,118,108,55,48,109,106,53,103,65,67,48, -101,107,118,100,56,70,107,65,65,100,122,51,72,74,65,89,65,72,52,43,101,74,88,87,107,74,74,89,65,70,48,104, -75,50,118,102,78,74,97,73,65,66,53,116,55,83,51,102,78,53,47,86,54,119,65,68,54,118,79,84,103,57,83,117, -109,88,121,50,87,51,81,65,66,51,101,88,117,108,50,74,100,110,79,54,51,88,65,65,112,80,69,86,89,118,65,74, -81,73,65,67,74,111,82,81,68,122,66,76,111,74,81,51,87,53,47,78,73,119,114,52,71,74,111,104,77,70,65,65, -82,79,103,74,89,118,86,74,81,105,80,71,65,66,90,78,78,51,98,115,100,118,89,121,69,83,119,110,87,74,83,73, -65,67,51,82,78,77,51,86,49,74,106,90,65,69,83,52,110,86,74,83,89,65,66,52,120,77,78,74,114,98,107,69, -53,54,87,68,53,120,76,86,100,66,53,78,98,70,111,102,78,74,98,103,65,66,74,104,50,54,113,82,69,80,114,70, -88,114,108,98,65,65,87,106,70,103,102,87,74,103,82,76,97,84,81,104,77,76,121,53,75,78,74,73,78,104,115,74, -76,68,114,89,114,68,53,120,76,67,54,112,76,97,53,110,71,84,82,55,111,76,113,57,98,74,81,74,77,75,84,65, -88,87,74,98,98,110,82,51,82,76,74,83,111,82,77,72,118,52,112,67,53,114,107,101,99,54,83,97,73,114,66,76, -71,119,50,114,50,88,87,49,101,112,99,111,113,89,101,74,105,79,88,74,89,122,105,69,115,79,72,50,82,66,66,119, -55,108,70,53,54,89,103,53,110,71,99,54,70,83,99,90,79,71,74,81,80,88,50,84,109,68,70,73,102,86,84,69, -66,77,83,99,52,104,76,69,119,53,75,66,54,43,114,115,74,77,72,54,51,88,54,112,77,102,53,104,77,81,122,66, -76,67,113,53,76,68,49,90,76,69,74,104,84,108,102,74,105,87,88,84,65,50,71,74,89,112,77,73,99,119,80,78, -99,50,79,54,84,65,117,71,82,73,80,88,49,105,103,68,74,103,47,80,74,109,121,89,68,99,103,88,87,119,120,77, -72,49,65,112,67,53,51,88,99,115,72,65,74,105,86,89,99,103,50,72,74,89,90,77,69,48,89,112,67,53,118,87, -74,107,104,76,78,74,103,76,108,68,84,65,101,70,74,104,70,47,70,81,102,86,74,107,71,54,74,105,71,88,99,111, -109,121,74,103,79,114,74,89,104,77,69,114,89,113,68,53,51,78,74,106,55,108,82,122,66,77,68,99,111,101,71,74, -104,122,111,66,74,98,51,71,74,105,78,49,113,90,66,67,74,103,87,121,74,89,112,78,70,49,76,105,103,65,65,88, -65,74,105,78,83,74,103,122,108,71,74,103,116,47,74,107,90,76,82,121,57,84,74,103,101,72,74,104,122,110,70,99, -117,83,90,71,119,53,77,72,74,111,109,106,99,117,104,76,66,113,100,99,74,105,83,97,105,84,67,104,77,86,49,67, -89,120,121,53,76,67,113,100,88,73,65,87,121,54,43,114,74,104,67,97,108,84,67,78,50,74,103,100,89,72,52,87, -72,74,105,71,112,84,70,55,107,68,99,52,51,87,50,82,77,74,84,85,90,76,81,122,66,76,70,99,52,109,114,54, -43,71,74,104,50,106,84,70,109,88,74,89,121,97,69,119,117,121,99,53,83,97,103,52,120,76,90,84,81,109,71,50, -87,70,74,104,120,78,97,74,89,90,77,76,74,90,83,97,69,74,111,79,72,84,82,57,47,74,97,43,54,74,98,100, -84,113,82,78,69,84,82,82,78,70,49,74,76,86,52,66,76,99,65,65,78,89,73,53,84,111,75,49,66,76,89,74, -104,87,89,74,90,119,65,66,113,53,78,111,74,90,57,49,74,97,65,65,66,100,65,90,78,83,48,90,76,101,121,57, -83,74,97,82,78,89,118,53,75,77,52,50,54,74,90,109,88,117,120,75,85,74,114,75,99,76,48,108,84,122,66,76, -75,122,66,75,89,74,114,86,88,118,102,71,83,111,108,55,69,89,87,88,74,73,50,55,122,70,49,74,76,81,65,68, -113,53,78,85,114,103,89,66,52,119,65,69,69,73,86,48,99,111,109,88,73,55,119,65,70,114,67,99,80,74,103,89, -87,66,84,73,73,65,69,84,73,78,50,74,89,109,87,117,104,77,107,100,83,100,89,67,103,79,101,74,103,117,101,113, -82,76,70,121,122,104,102,84,105,57,98,113,52,84,67,52,53,77,70,52,57,84,117,117,88,74,108,112,79,78,99,111, -103,65,67,48,104,75,66,48,103,72,68,118,90,77,69,113,82,77,112,65,65,78,83,113,57,99,114,108,98,74,65,89, -65,68,113,119,82,68,120,71,107,48,109,73,65,52,101,67,84,81,79,101,118,101,88,74,100,89,65,72,113,120,78,70, -100,65,101,73,65,65,81,71,67,114,79,73,48,111,72,69,65,71,86,88,84,82,74,77,71,118,103,71,67,119,82,77, -55,84,65,90,77,72,119,81,71,67,118,104,77,49,114,66,77,69,82,73,104,77,71,65,119,100,90,74,109,116,83,113, -86,84,119,78,99,119,74,69,68,74,103,49,57,99,118,73,65,68,97,52,100,57,74,104,65,78,68,74,110,83,76,72, -74,103,114,108,54,65,65,104,70,70,65,119,112,90,68,101,103,106,110,55,118,104,77,71,99,118,119,65,66,114,74,65, -70,74,103,106,108,47,84,81,112,66,66,73,52,106,108,47,65,65,78,56,84,81,104,72,68,99,118,52,65,68,99,74, -66,77,68,118,112,77,43,73,89,97,101,68,65,65,104,76,43,113,100,57,83,103,121,99,69,74,110,55,105,69,65,65, -49,56,74,102,55,110,69,99,118,52,65,73,114,74,76,73,99,118,54,97,77,99,118,52,65,68,118,104,77,72,114,74, -74,47,65,65,98,108,47,99,54,90,77,47,65,65,116,57,99,118,55,110,83,73,118,55,110,76,99,118,52,65,72,114, -76,108,47,84,82,112,74,66,118,103,110,106,65,61,61,34,41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115, -101,116,66,103,67,111,108,111,114,40,34,35,54,54,51,51,102,102,34,41,59,172,121,61,50,52,48,44,115,112,101,101, -100,61,53,59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97,99,107,41,123,121,151,115,112,101,101,100,59,172, -120,61,40,50,52,48,45,55,55,41,47,50,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,120,44,121, -41,59,103,46,99,108,101,97,114,82,101,99,116,40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56,49,43,115, -112,101,101,100,41,59,163,40,121,62,54,48,41,115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111,111,110,44, -48,44,99,97,108,108,98,97,99,107,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101,40,34,35, -54,54,51,51,102,102,34,44,170,40,41,123,98,97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116,67,111,108, -111,114,40,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,51,41,59,103,46,115,101,116,70, -111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99, -111,109,101,46,34,44,49,50,48,44,49,54,48,41,59,125,41,59,125,41,59,115,101,116,84,105,109,101,111,117,116,40, -170,40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,53,59, -103,46,115,99,114,111,108,108,40,48,44,45,53,41,59,163,40,110,62,49,55,48,41,99,108,101,97,114,73,110,116,101, -114,118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51,53,48,48,41,59,125,59,163,40,110,138,50,41,171,170, -40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,97,56, -48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50, -41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,48,44,121,61,51,53, -44,104,61,51,53,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -89,111,117,114,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97, -110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40, -34,104,97,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,32, -98,117,116,116,111,110,115,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,115,101,116,70,111,110,116,40,34,86, -101,99,116,111,114,34,44,51,54,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44, -52,48,41,59,125,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50, -48,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,93, -44,50,48,48,41,59,125,59,163,40,110,138,51,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115, -101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103, -46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101, -99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52, -48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111, -110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,117, -112,92,110,105,110,32,109,101,110,117,115,92,110,92,110,84,117,114,110,32,66,97,110,103,108,101,46,106,115,32,111,110, -92,110,105,102,32,105,116,32,119,97,115,32,111,102,102,34,44,50,48,44,52,48,41,59,125,59,163,40,110,138,52,41, -171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48, -97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40, -48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,65, -108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,83,101,108,101,99,116,32,109,101,110,117,92,110,105,116,101,109,92,110, -92,110,76,97,117,110,99,104,32,97,112,112,92,110,119,104,101,110,32,119,97,116,99,104,92,110,105,115,32,115,104,111, -119,105,110,103,34,44,50,48,44,55,48,41,59,125,59,163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115,101, -116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108, -101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70, -111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51, -34,44,50,48,48,44,50,48,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41, -59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103, -40,34,77,111,118,101,32,100,111,119,110,92,110,105,110,32,109,101,110,117,115,92,110,92,110,76,111,110,103,32,112,114, -101,115,115,92,110,116,111,32,101,120,105,116,32,97,112,112,92,110,97,110,100,32,103,111,32,98,97,99,107,92,110,116, -111,32,99,108,111,99,107,34,44,50,48,44,49,48,48,41,59,125,59,163,40,110,138,54,41,171,170,40,41,123,103,46, -114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,51,51,48,48,34,41,59, -103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46, -115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110, -103,40,34,49,34,44,50,48,48,44,52,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50, -48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46, -115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73, -102,32,66,97,110,103,108,101,46,106,115,92,110,101,118,101,114,32,115,116,111,112,115,44,92,110,104,111,108,100,32,98, -117,116,116,111,110,115,92,110,49,32,97,110,100,32,50,32,102,111,114,92,110,97,114,111,117,110,100,32,115,105,120,92, -110,115,101,99,111,110,100,115,46,92,110,92,110,92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92, -110,116,104,101,110,32,114,101,98,111,111,116,46,34,44,50,48,44,50,48,41,59,125,59,163,40,110,138,55,41,171,170, -40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56, -102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50, -41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61,49, -48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103, -40,34,66,97,110,103,108,101,46,106,115,32,104,97,115,32,97,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119, -83,116,114,105,110,103,40,34,115,105,109,112,108,101,32,116,111,117,99,104,115,99,114,101,101,110,34,44,120,44,121,150, -104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,116,39,108,108, -32,100,101,116,101,99,116,32,116,111,117,99,104,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116, -114,105,110,103,40,34,111,110,32,108,101,102,116,32,97,110,100,32,114,105,103,104,116,34,44,120,44,121,150,104,41,59, -125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,111,114,105,122,111,110,116, -97,108,32,115,119,105,112,101,115,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103, -40,34,119,111,114,107,32,116,111,111,46,32,84,114,121,32,110,111,119,34,44,120,44,121,150,104,41,59,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,116,111,32,99,104,97,110,103,101,32,112,97,103,101,46,34,44,120,44,121,150,104, -41,59,125,93,44,51,48,48,41,59,125,59,163,40,110,138,56,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41, -59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,51,51,57,57,48,48,34,41,59,103,46,99,108,101,97,114, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110, +102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116, +34,44,34,110,97,109,101,34,58,34,65,98,111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112, +112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114, +100,101,114,34,58,45,52,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58, +34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102, +111,44,97,98,111,117,116,46,97,112,112,46,106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,98,3,0,0, +119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, +123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116, +104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59, +125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114,103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103, +41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110,103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105, +100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105, +112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105, +115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91, +34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110, +40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91, +34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40,33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, +41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162, +87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123, +163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108, +40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97, +108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83,91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116, +114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119,58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46, +120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40,41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97, +114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119, +73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66,72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47, +47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47,52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72, +103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59,120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114, +40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108,108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45, +52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99,116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44, +121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120,43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43, +49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40, +120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101,116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50, +41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115,101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255, +138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34,110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76, +101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101, +114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116, +116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97, +116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0,119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93, +61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46, +114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101,116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40, +41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101,116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80, +40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102, +34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100, +97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57,34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97, +116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74,103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78, +89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61,61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41, +59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116, +104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44, +87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78, +82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101, +116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110, +102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116, +34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112, +101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97, +103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101,116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34, +119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116,46,119,105,100,46,106,115,34,125,255,255,255,169,0,0,0, +119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, +123,173,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40, +39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101,108,99,111,109, +101,100,41,123,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99, +111,109,101,100,58,180,125,41,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,125,41, +125,125,41,40,41,255,255,255,165,27,0,0,119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100,41,123,172,105, +61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,163,40,115,101,113,46,108,101,110,103,116,104,41,123,172, +102,61,115,101,113,46,115,104,105,102,116,40,41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73,110,116, +101,114,118,97,108,40,105,41,59,125,44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108,44,99, +97,108,108,98,97,99,107,41,123,172,110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67,111,108, +111,114,40,99,111,108,41,59,167,40,172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114,97,119, +76,105,110,101,40,105,44,48,44,48,44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50,52,48, +44,105,41,59,103,46,102,108,105,112,40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101,111,117, +116,40,102,44,48,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69,78,69, +95,67,79,85,78,84,61,49,49,59,10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41,171,170, +40,41,123,103,46,99,108,101,97,114,40,49,41,59,103,46,115,101,116,70,111,110,116,40,34,52,120,54,34,44,50,41, +59,172,110,61,48,59,172,108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111,40,41,59,172,105,61,115,101,116, +73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46,48,52,59,103,46,115,101,116,67,111,108,111,114,40,110, +44,110,44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,44,40,50,52,48,45,50,50,50,41,47,50,44, +40,50,52,48,45,49,48,48,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101,97,114,73,110,116,101,114,118,97, +108,40,105,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,79,112,101,110,34,44,51,52,44,49,52,52,41,44,53,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40, +41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108,101,34,44,51,52,44,49,53,54, +41,44,49,48,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,83,109,97,114,116,32,87,97,116,99,104,34,44,51,52,44,49,54,56,41,44,49,53,48,48,41,59,125, +125,44,53,48,41,59,125,59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103,61,114,101,113,117,105,114,101,40, +34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,112, +116,82,120,72,43,113,89,65,102,118,108,55,48,109,106,53,103,65,67,48,101,107,118,100,56,70,107,65,65,100,122,51, +72,74,65,89,65,72,52,43,101,74,88,87,107,74,74,89,65,70,48,104,75,50,118,102,78,74,97,73,65,66,53,116, +55,83,51,102,78,53,47,86,54,119,65,68,54,118,79,84,103,57,83,117,109,88,121,50,87,51,81,65,66,51,101,88, +117,108,50,74,100,110,79,54,51,88,65,65,112,80,69,86,89,118,65,74,81,73,65,67,74,111,82,81,68,122,66,76, +111,74,81,51,87,53,47,78,73,119,114,52,71,74,111,104,77,70,65,65,82,79,103,74,89,118,86,74,81,105,80,71, +65,66,90,78,78,51,98,115,100,118,89,121,69,83,119,110,87,74,83,73,65,67,51,82,78,77,51,86,49,74,106,90, +65,69,83,52,110,86,74,83,89,65,66,52,120,77,78,74,114,98,107,69,53,54,87,68,53,120,76,86,100,66,53,78, +98,70,111,102,78,74,98,103,65,66,74,104,50,54,113,82,69,80,114,70,88,114,108,98,65,65,87,106,70,103,102,87, +74,103,82,76,97,84,81,104,77,76,121,53,75,78,74,73,78,104,115,74,76,68,114,89,114,68,53,120,76,67,54,112, +76,97,53,110,71,84,82,55,111,76,113,57,98,74,81,74,77,75,84,65,88,87,74,98,98,110,82,51,82,76,74,83, +111,82,77,72,118,52,112,67,53,114,107,101,99,54,83,97,73,114,66,76,71,119,50,114,50,88,87,49,101,112,99,111, +113,89,101,74,105,79,88,74,89,122,105,69,115,79,72,50,82,66,66,119,55,108,70,53,54,89,103,53,110,71,99,54, +70,83,99,90,79,71,74,81,80,88,50,84,109,68,70,73,102,86,84,69,66,77,83,99,52,104,76,69,119,53,75,66, +54,43,114,115,74,77,72,54,51,88,54,112,77,102,53,104,77,81,122,66,76,67,113,53,76,68,49,90,76,69,74,104, +84,108,102,74,105,87,88,84,65,50,71,74,89,112,77,73,99,119,80,78,99,50,79,54,84,65,117,71,82,73,80,88, +49,105,103,68,74,103,47,80,74,109,121,89,68,99,103,88,87,119,120,77,72,49,65,112,67,53,51,88,99,115,72,65, +74,105,86,89,99,103,50,72,74,89,90,77,69,48,89,112,67,53,118,87,74,107,104,76,78,74,103,76,108,68,84,65, +101,70,74,104,70,47,70,81,102,86,74,107,71,54,74,105,71,88,99,111,109,121,74,103,79,114,74,89,104,77,69,114, +89,113,68,53,51,78,74,106,55,108,82,122,66,77,68,99,111,101,71,74,104,122,111,66,74,98,51,71,74,105,78,49, +113,90,66,67,74,103,87,121,74,89,112,78,70,49,76,105,103,65,65,88,65,74,105,78,83,74,103,122,108,71,74,103, +116,47,74,107,90,76,82,121,57,84,74,103,101,72,74,104,122,110,70,99,117,83,90,71,119,53,77,72,74,111,109,106, +99,117,104,76,66,113,100,99,74,105,83,97,105,84,67,104,77,86,49,67,89,120,121,53,76,67,113,100,88,73,65,87, +121,54,43,114,74,104,67,97,108,84,67,78,50,74,103,100,89,72,52,87,72,74,105,71,112,84,70,55,107,68,99,52, +51,87,50,82,77,74,84,85,90,76,81,122,66,76,70,99,52,109,114,54,43,71,74,104,50,106,84,70,109,88,74,89, +121,97,69,119,117,121,99,53,83,97,103,52,120,76,90,84,81,109,71,50,87,70,74,104,120,78,97,74,89,90,77,76, +74,90,83,97,69,74,111,79,72,84,82,57,47,74,97,43,54,74,98,100,84,113,82,78,69,84,82,82,78,70,49,74, +76,86,52,66,76,99,65,65,78,89,73,53,84,111,75,49,66,76,89,74,104,87,89,74,90,119,65,66,113,53,78,111, +74,90,57,49,74,97,65,65,66,100,65,90,78,83,48,90,76,101,121,57,83,74,97,82,78,89,118,53,75,77,52,50, +54,74,90,109,88,117,120,75,85,74,114,75,99,76,48,108,84,122,66,76,75,122,66,75,89,74,114,86,88,118,102,71, +83,111,108,55,69,89,87,88,74,73,50,55,122,70,49,74,76,81,65,68,113,53,78,85,114,103,89,66,52,119,65,69, +69,73,86,48,99,111,109,88,73,55,119,65,70,114,67,99,80,74,103,89,87,66,84,73,73,65,69,84,73,78,50,74, +89,109,87,117,104,77,107,100,83,100,89,67,103,79,101,74,103,117,101,113,82,76,70,121,122,104,102,84,105,57,98,113, +52,84,67,52,53,77,70,52,57,84,117,117,88,74,108,112,79,78,99,111,103,65,67,48,104,75,66,48,103,72,68,118, +90,77,69,113,82,77,112,65,65,78,83,113,57,99,114,108,98,74,65,89,65,68,113,119,82,68,120,71,107,48,109,73, +65,52,101,67,84,81,79,101,118,101,88,74,100,89,65,72,113,120,78,70,100,65,101,73,65,65,81,71,67,114,79,73, +48,111,72,69,65,71,86,88,84,82,74,77,71,118,103,71,67,119,82,77,55,84,65,90,77,72,119,81,71,67,118,104, +77,49,114,66,77,69,82,73,104,77,71,65,119,100,90,74,109,116,83,113,86,84,119,78,99,119,74,69,68,74,103,49, +57,99,118,73,65,68,97,52,100,57,74,104,65,78,68,74,110,83,76,72,74,103,114,108,54,65,65,104,70,70,65,119, +112,90,68,101,103,106,110,55,118,104,77,71,99,118,119,65,66,114,74,65,70,74,103,106,108,47,84,81,112,66,66,73, +52,106,108,47,65,65,78,56,84,81,104,72,68,99,118,52,65,68,99,74,66,77,68,118,112,77,43,73,89,97,101,68, +65,65,104,76,43,113,100,57,83,103,121,99,69,74,110,55,105,69,65,65,49,56,74,102,55,110,69,99,118,52,65,73, +114,74,76,73,99,118,54,97,77,99,118,52,65,68,118,104,77,72,114,74,74,47,65,65,98,108,47,99,54,90,77,47, +65,65,116,57,99,118,55,110,83,73,118,55,110,76,99,118,52,65,72,114,76,108,47,84,82,112,74,66,118,103,110,106, +65,61,61,34,41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35, +54,54,51,51,102,102,34,41,59,172,121,61,50,52,48,44,115,112,101,101,100,61,53,59,170,98,97,108,108,111,111,110, +40,99,97,108,108,98,97,99,107,41,123,121,151,115,112,101,101,100,59,172,120,61,40,50,52,48,45,55,55,41,47,50, +59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,120,44,121,41,59,103,46,99,108,101,97,114,82,101,99, +116,40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56,49,43,115,112,101,101,100,41,59,163,40,121,62,54,48, +41,115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111,111,110,44,48,44,99,97,108,108,98,97,99,107,41,59, +164,99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101,40,34,35,54,54,51,51,102,102,34,44,170,40,41,123, +98,97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,115,101,116, +70,111,110,116,40,34,54,120,56,34,44,51,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, +41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99,111,109,101,46,34,44,49,50,48,44,49,54, +48,41,59,125,41,59,125,41,59,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,172,110,61,48,59,172,105,61, +115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,53,59,103,46,115,99,114,111,108,108,40,48,44,45, +53,41,59,163,40,110,62,49,55,48,41,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,50,48, +41,59,125,44,51,53,48,48,41,59,125,59,163,40,110,138,50,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41, +59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,97,56,48,48,34,41,59,103,46,99,108,101,97,114, +40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65, +108,105,103,110,40,48,44,48,41,59,172,120,61,56,48,44,121,61,51,53,44,104,61,51,53,59,97,110,105,109,97,116, +101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41, +44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121, +150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,104,97,115,34,44,120,44,121,150,104,41, +44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,32,98,117,116,116,111,110,115,34,44,120,44,121, +150,104,41,44,40,41,162,123,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48,41,59,125,44,40,41,162,103,46,100, +114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,44,40,41,162,103,46,100,114,97,119, +83,116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,93,44,50,48,48,41,59,125,59,163,40,110,138, +51,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35, +48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, +110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46, +100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48,41,59,103,46,115,101,116,70,111,110,116, +65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59, +103,46,100,114,97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,117,112,92,110,105,110,32,109,101,110,117,115,92, +110,92,110,84,117,114,110,32,66,97,110,103,108,101,46,106,115,32,111,110,92,110,105,102,32,105,116,32,119,97,115,32, +111,102,102,34,44,50,48,44,52,48,41,59,125,59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101,115,101,116, +40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101, +97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111, +110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34, +44,50,48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59, +103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,83,101,108,101,99,116,32,109,101,110,117,92,110,105,116,101,109,92,110,92,110,76,97,117,110,99,104,32,97,112,112, +92,110,119,104,101,110,32,119,97,116,99,104,92,110,105,115,32,115,104,111,119,105,110,103,34,44,50,48,44,55,48,41, +59,125,59,163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67, +111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70, +111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34, +44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,59,103, +46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34, +54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,100,111,119,110,92, +110,105,110,32,109,101,110,117,115,92,110,92,110,76,111,110,103,32,112,114,101,115,115,92,110,116,111,32,101,120,105,116, +32,97,112,112,92,110,97,110,100,32,103,111,32,98,97,99,107,92,110,116,111,32,99,108,111,99,107,34,44,50,48,44, +49,48,48,41,59,125,59,163,40,110,138,54,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101, +116,66,103,67,111,108,111,114,40,34,35,102,102,51,51,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99, +116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48, +41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101, +116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56, +34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,92, +110,101,118,101,114,32,115,116,111,112,115,44,92,110,104,111,108,100,32,98,117,116,116,111,110,115,92,110,49,32,97,110, +100,32,50,32,102,111,114,92,110,97,114,111,117,110,100,32,115,105,120,92,110,115,101,99,111,110,100,115,46,92,110,92, +110,92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92,110,116,104,101,110,32,114,101,98,111,111,116, +46,34,44,50,48,44,50,48,41,59,125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41, +59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114, 40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65, 108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97, -116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34, -44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,99,111,109,101,115,32,119,105,116,104, -34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,97,32,102,101,119,32,115,105,109, -112,108,101,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,97,112,112,115,32,105, -110,115,116,97,108,108,101,100,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,84,111,32,97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,34,44,120,44,121, -150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111,109, -47,97,112,112,115,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,119,105,116,104, -32,97,32,66,108,117,101,116,111,111,116,104,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110, -103,40,34,99,97,112,97,98,108,101,32,100,101,118,105,99,101,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48, -48,41,59,125,59,163,40,110,138,57,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66, -103,67,111,108,111,114,40,34,35,57,57,48,48,54,54,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101, -116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, -48,41,59,172,120,61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,103,46,100,114,97,119,83,116,114,105,110,103, -40,34,89,111,117,32,99,97,110,32,97,108,115,111,32,109,97,107,101,34,44,120,44,121,150,104,41,59,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,121,111,117,114,32,111,119,110,32,97,112,112,115,33,34,44,120,44,121,150,104,41, -59,121,61,49,54,48,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,34,44, -120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111, -109,34,44,120,44,121,150,104,41,59,172,114,120,61,48,44,114,121,61,48,59,69,46,100,101,102,114,97,103,40,41,59, -172,104,61,71,114,97,112,104,105,99,115,46,99,114,101,97,116,101,65,114,114,97,121,66,117,102,102,101,114,40,57,54, -44,57,54,44,49,44,123,109,115,98,58,180,125,41,59,170,100,114,97,119,40,41,123,114,120,150,48,46,49,59,114,121, -150,48,46,49,49,59,172,114,99,120,61,77,97,116,104,46,99,111,115,40,114,120,41,44,114,115,120,61,77,97,116,104, -46,115,105,110,40,114,120,41,44,114,99,121,61,77,97,116,104,46,99,111,115,40,114,121,41,44,114,115,121,61,77,97, -116,104,46,115,105,110,40,114,121,41,59,170,112,40,120,44,121,44,122,41,123,172,116,59,116,61,120,42,114,99,121,43, -122,42,114,115,121,59,122,61,122,42,114,99,121,45,120,42,114,115,121,59,120,61,116,59,116,61,121,42,114,99,120,43, -122,42,114,115,120,59,122,61,122,42,114,99,120,45,121,42,114,115,120,59,121,61,116,59,122,150,52,59,171,91,57,54, -42,40,48,46,53,43,120,47,122,41,44,57,54,42,40,48,46,53,43,121,47,122,41,93,59,125,172,97,59,104,46,99, -108,101,97,114,40,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91, -48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97, -91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97, -91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40, -97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84, -111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,109,111,118,101, -84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46,108,105,110,101, -84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108,105,110,101,84, -111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,104,46,108,105,110,101,84, -111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108,105,110,101, -84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,109,111, -118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108, -105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,104,46, -109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46, -108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,104,46, -109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108, -105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,104,46, -109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,104,46, -108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,103,46,100,114,97,119,73,109,97,103,101,40,123,119, -105,100,116,104,58,57,54,44,104,101,105,103,104,116,58,57,54,44,98,117,102,102,101,114,58,104,46,98,117,102,102,101, -114,125,44,40,50,52,48,45,57,54,41,47,50,44,54,56,41,59,125,115,101,116,73,110,116,101,114,118,97,108,40,100, -114,97,119,44,53,48,41,59,125,59,163,40,110,138,49,48,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59, -103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,54,54,48,48,57,57,34,41,59,103,46,99,108,101,97,114,40, -41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40, -34,86,101,99,116,111,114,34,44,51,54,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48, -48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,172,120,61,57,48,44, -121,61,51,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105, -110,103,40,34,84,104,97,116,39,115,32,105,116,33,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,120,44,121,150,104,42,51,41,59,103,46,100,114,97,119,83, -116,114,105,110,103,40,34,66,117,116,116,111,110,32,50,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116, -114,105,110,103,40,34,116,111,32,115,116,97,114,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114, -105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,125,93,44,52,48,48,41,59,125, -125,10,172,115,99,101,110,101,78,117,109,98,101,114,61,48,59,10,170,109,111,118,101,40,100,105,114,41,123,163,40,100, -105,114,62,48,158,115,99,101,110,101,78,117,109,98,101,114,43,49,138,83,67,69,78,69,95,67,79,85,78,84,41,171, -59,115,99,101,110,101,78,117,109,98,101,114,61,40,115,99,101,110,101,78,117,109,98,101,114,43,100,105,114,41,37,83, -67,69,78,69,95,67,79,85,78,84,59,163,40,115,99,101,110,101,78,117,109,98,101,114,60,48,41,115,99,101,110,101, -78,117,109,98,101,114,61,48,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,41,59,103,101,116,83,99,101,110, -101,40,115,99,101,110,101,78,117,109,98,101,114,41,40,41,59,163,40,115,99,101,110,101,78,117,109,98,101,114,62,49, -41,123,172,108,61,83,67,69,78,69,95,67,79,85,78,84,59,167,40,172,105,61,48,59,105,60,108,45,50,59,105,152, -41,123,172,120,61,49,50,48,43,40,105,45,40,108,45,50,41,47,50,41,42,49,50,59,163,40,105,60,115,99,101,110, -101,78,117,109,98,101,114,45,49,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,102,105,108,108, -67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,48,41, -59,103,46,102,105,108,108,67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,103,46,115,101,116,67,111,108,111, -114,40,45,49,41,59,103,46,100,114,97,119,67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,125,125,125,163, -40,115,99,101,110,101,78,117,109,98,101,114,60,83,67,69,78,69,95,67,79,85,78,84,45,49,41,115,101,116,84,105, -109,101,111,117,116,40,170,40,41,123,109,111,118,101,40,49,41,59,125,44,53,48,48,48,41,59,125,10,66,97,110,103, -108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,109,111,118,101,40,45,100,105,114,41,41,59,10,115, -101,116,87,97,116,99,104,40,40,41,162,109,111,118,101,40,49,41,44,66,84,78,51,44,123,114,101,112,101,97,116,58, -180,125,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,123,163,40,115,99,101,110,101,78,117,109,98,101,114,138, -83,67,69,78,69,95,67,79,85,78,84,45,49,41,123,108,111,97,100,40,41,59,125,125,44,66,84,78,50,44,123,114, -101,112,101,97,116,58,180,44,101,100,103,101,58,34,102,97,108,108,105,110,103,34,125,41,59,10,115,101,116,87,97,116, -99,104,40,40,41,162,109,111,118,101,40,45,49,41,44,66,84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59, -10,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101, -46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,10,109,111,118,101,40,48,41,59,255,255,255,234,1,0,0, -119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,40,170,40,98, -97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39, -41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,114,101,113, -117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110, -103,46,106,115,111,110,39,44,49,41,160,123,125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105, -116,108,101,39,58,39,87,101,108,99,111,109,101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120,116,32,98,111, -111,116,39,58,123,118,97,108,117,101,58,33,115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101,100,44,102,111, -114,109,97,116,58,118,162,118,63,39,89,101,115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101,58,118,162,114, -101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101, -46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110,32,78,111,119, -39,58,40,41,162,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44,39,84,117,114, -110,32,111,102,102,32,38,32,114,117,110,32,110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114,101,40,39,83, -116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119, -101,108,99,111,109,101,100,58,181,125,41,59,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,180,41,59, -163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111,102,116,79,102, -102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39,58,98,97,99, -107,44,125,41,125,41,255,255,4,9,0,0,119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32, +104,97,115,32,97,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,115,105,109,112, +108,101,32,116,111,117,99,104,115,99,114,101,101,110,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162, +123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,116,39,108,108,32,100,101,116,101,99,116,32,116,111,117,99, +104,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,111,110,32,108,101,102, +116,32,97,110,100,32,114,105,103,104,116,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46, +100,114,97,119,83,116,114,105,110,103,40,34,72,111,114,105,122,111,110,116,97,108,32,115,119,105,112,101,115,34,44,120, +44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,119,111,114,107,32,116,111,111,46,32, +84,114,121,32,110,111,119,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111, +32,99,104,97,110,103,101,32,112,97,103,101,46,34,44,120,44,121,150,104,41,59,125,93,44,51,48,48,41,59,125,59, +163,40,110,138,56,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111, +114,40,34,35,51,51,57,57,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116, +40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120, +61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,99,111,109,101,115,32,119,105,116,104,34,44,120,44,121,150,104,41,59,103,46,100, +114,97,119,83,116,114,105,110,103,40,34,97,32,102,101,119,32,115,105,109,112,108,101,34,44,120,44,121,150,104,41,59, +103,46,100,114,97,119,83,116,114,105,110,103,40,34,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34,44,120,44, +121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32, +97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119, +83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111,109,47,97,112,112,115,34,44,120,44,121,150,104, +41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,119,105,116,104,32,97,32,66,108,117,101,116,111,111,116,104, +34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,99,97,112,97,98,108,101,32,100, +101,118,105,99,101,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48,48,41,59,125,59,163,40,110,138,57,41,171, +170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,57,57,48, +48,54,54,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44, +50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61, +49,48,44,104,61,50,49,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,32,99,97,110,32,97,108, +115,111,32,109,97,107,101,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,121,111, +117,114,32,111,119,110,32,97,112,112,115,33,34,44,120,44,121,150,104,41,59,121,61,49,54,48,59,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111,109,34,44,120,44,121,150,104,41,59,172,114, +120,61,48,44,114,121,61,48,59,69,46,100,101,102,114,97,103,40,41,59,172,104,61,71,114,97,112,104,105,99,115,46, +99,114,101,97,116,101,65,114,114,97,121,66,117,102,102,101,114,40,57,54,44,57,54,44,49,44,123,109,115,98,58,180, +125,41,59,170,100,114,97,119,40,41,123,114,120,150,48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77, +97,116,104,46,99,111,115,40,114,120,41,44,114,115,120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121, +61,77,97,116,104,46,99,111,115,40,114,121,41,44,114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170, +112,40,120,44,121,44,122,41,123,172,116,59,116,61,120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99, +121,45,120,42,114,115,121,59,120,61,116,59,116,61,121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99, +120,45,121,42,114,115,120,59,121,61,116,59,122,150,52,59,171,91,57,54,42,40,48,46,53,43,120,47,122,41,44,57, +54,42,40,48,46,53,43,121,47,122,41,93,59,125,172,97,59,104,46,99,108,101,97,114,40,41,59,97,61,112,40,45, +49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112, +40,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, +112,40,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, +112,40,45,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, +61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, +59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93, +41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93, +41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, +59,97,61,112,40,45,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, +59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93, +41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91, +49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97, +91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97, +91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,103,46,100,114,97,119,73,109,97,103,101,40,123,119,105,100,116,104,58,57,54,44,104,101,105,103, +104,116,58,57,54,44,98,117,102,102,101,114,58,104,46,98,117,102,102,101,114,125,44,40,50,52,48,45,57,54,41,47, +50,44,54,56,41,59,125,115,101,116,73,110,116,101,114,118,97,108,40,100,114,97,119,44,53,48,41,59,125,59,163,40, +110,138,49,48,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114, +40,34,35,54,54,48,48,57,57,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65, +108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41, +59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101,116, +70,111,110,116,40,34,54,120,56,34,44,50,41,59,172,120,61,57,48,44,121,61,51,48,44,104,61,50,49,59,97,110, +105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39,115,32,105, +116,33,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101, +115,115,34,44,120,44,121,150,104,42,51,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,117,116,116,111, +110,32,50,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,115,116,97, +114,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46, +106,115,34,44,120,44,121,150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172,115,99,101,110,101,78,117,109,98, +101,114,61,48,59,10,170,109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62,48,158,115,99,101,110,101,78,117, +109,98,101,114,43,49,138,83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99,101,110,101,78,117,109,98,101,114, +61,40,115,99,101,110,101,78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78,69,95,67,79,85,78,84,59,163, +40,115,99,101,110,101,78,117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109,98,101,114,61,48,59,99,108,101, +97,114,73,110,116,101,114,118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115,99,101,110,101,78,117,109,98,101, +114,41,40,41,59,163,40,115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172,108,61,83,67,69,78,69,95,67, +79,85,78,84,59,167,40,172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172,120,61,49,50,48,43,40,105,45, +40,108,45,50,41,47,50,41,42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45,49,41,123,103, +46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,102,105,108,108,67,105,114,99,108,101,40,120,44,50,51,48, +44,52,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,48,41,59,103,46,102,105,108,108,67,105,114,99,108, +101,40,120,44,50,51,48,44,52,41,59,103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,100,114,97,119, +67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114, +60,83,67,69,78,69,95,67,79,85,78,84,45,49,41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111, +118,101,40,49,41,59,125,44,53,48,48,48,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101, +39,44,100,105,114,162,109,111,118,101,40,45,100,105,114,41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,109, +111,118,101,40,49,41,44,66,84,78,51,44,123,114,101,112,101,97,116,58,180,125,41,59,10,115,101,116,87,97,116,99, +104,40,40,41,162,123,163,40,115,99,101,110,101,78,117,109,98,101,114,138,83,67,69,78,69,95,67,79,85,78,84,45, +49,41,123,108,111,97,100,40,41,59,125,125,44,66,84,78,50,44,123,114,101,112,101,97,116,58,180,44,101,100,103,101, +58,34,102,97,108,108,105,110,103,34,125,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,109,111,118,101,40,45, +49,41,44,66,84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59,10,66,97,110,103,108,101,46,115,101,116,76, +67,68,84,105,109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114, +40,49,41,59,10,109,111,118,101,40,48,41,59,255,255,255,234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116, +105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, +103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39, +119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103, +101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123, +125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109, +101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120,116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33, +115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101,100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101, +115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101,58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99, +111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110,32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119, +101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44,39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32, +110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105, +116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59, +66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102, +116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46, +111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39,58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0, +119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204, -205,206,214,214,214,214,206,205,204,204,198,150,150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192,150,150,186,186, -186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,213,215, -214,205,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,204,204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186, -186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204,205,214,214,205, -204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,97,97,97,91,91,169,204,206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204,213,214,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,254,254,97,97,135,214,171,91,91,204,204,214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150, -186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204,214,205,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,254,97,134,215,172,97,97,91,91,204,204,213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150, -186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204,206,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,97,133,214,172,97,97,97,91,91,127,204,204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186, -186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204,204,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,97,134,215,134,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127,204,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,97,97,178,134,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186, -186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91,127,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,97,97,171,97,97,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150,150,186,186,186, -186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91,91,91,204,204, -204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186, -186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91, -168,204,204,204,204,204,204,198,150,150,150,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186,186,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,91,91, -91,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,91,97,97,97,97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,91, -91,254,254,164,164,254,254,158,151,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91, -92,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136, -136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254,254,254,254,254, +254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150, +150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192,150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204, +186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204, +204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204,205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204, +204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204, +206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204,213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204, +214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204, +213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204, +204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254, +254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186, +150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91, +91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150, +186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97, +91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186, +186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97, +97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97, +97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -136,136,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254, +254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254, +254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44,34,110,97,109, -101,34,58,34,87,101,108,99,111,109,101,34,44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46,97,112,112,46, -106,115,34,44,34,105,99,111,110,34,58,34,119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101,114,115,105,111, -110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99,111,109,101,34, -44,34,102,105,108,101,115,34,58,34,119,101,108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111,109,101,46,98, -111,111,116,46,106,115,44,119,101,108,99,111,109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109,101,46,115,101, -116,116,105,110,103,115,46,106,115,44,119,101,108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97,34,58,34,119, -101,108,99,111,109,101,46,106,115,111,110,34,125,255,255,255,232,13,0,0,97,108,97,114,109,46,97,112,112,46,106,115, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101, -100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114, -110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,118,105,98,80,97,116,116,101,114,110,115, -61,91,34,34,44,34,46,34,44,34,46,46,34,44,34,45,34,44,34,45,45,34,44,34,45,46,45,34,44,34,45,45, -45,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,118,105,98,80,97,116,116,101,114, -110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,118,105,98, -80,97,116,116,101,114,110,115,46,108,101,110,103,116,104,44,102,111,114,109,97,116,58,118,162,118,105,98,80,97,116,116, -101,114,110,115,91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,99,97,108,108,98,97, -99,107,40,118,105,98,80,97,116,116,101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108, -101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103, -101,116,115,40,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46, -103,101,116,65,108,97,114,109,115,40,41,59,10,170,100,101,99,111,100,101,84,105,109,101,40,116,41,123,116,61,48,124, -116,59,172,104,114,115,61,48,124,40,116,47,51,54,48,48,48,48,48,41,59,171,123,104,114,115,58,104,114,115,44,109, -105,110,115,58,77,97,116,104,46,114,111,117,110,100,40,40,116,45,104,114,115,42,51,54,48,48,48,48,48,41,47,54, -48,48,48,48,41,125,59,125,10,170,101,110,99,111,100,101,84,105,109,101,40,111,41,123,171,111,46,104,114,115,42,51, -54,48,48,48,48,48,43,111,46,109,105,110,115,42,54,48,48,48,48,59,125,10,170,102,111,114,109,97,116,84,105,109, -101,40,116,41,123,172,111,61,100,101,99,111,100,101,84,105,109,101,40,116,41,59,171,111,46,104,114,115,43,34,58,34, -43,40,34,48,34,43,111,46,109,105,110,115,41,46,115,117,98,115,116,114,40,45,50,41,59,125,10,170,103,101,116,67, -117,114,114,101,110,116,84,105,109,101,40,41,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105,109, -101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48,43,116,105,109,101,46,103,101,116,77,105,110, -117,116,101,115,40,41,42,54,48,48,48,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,42,49, -48,48,48,41,59,125,10,170,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,114,101,113,117,105,114,101,40, -34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,114,101,113,117,105, -114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,125,10,170,115,104,111,119,77,97,105,110, -77,101,110,117,40,41,123,174,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108,97,114,109, -47,84,105,109,101,114,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,123,108,111,97,100,40,41,59,125,44,39, -78,101,119,32,65,108,97,114,109,39,58,40,41,162,101,100,105,116,65,108,97,114,109,40,45,49,41,44,39,78,101,119, -32,84,105,109,101,114,39,58,40,41,162,101,100,105,116,84,105,109,101,114,40,45,49,41,125,59,97,108,97,114,109,115, -46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,100,120,41,162,123,172,116,120,116,59,163,40,97,108,97, -114,109,46,116,105,109,101,114,41,116,120,116,61,34,84,105,109,101,114,34,43,34,32,34,43,102,111,114,109,97,116,84, -105,109,101,40,97,108,97,114,109,46,116,105,109,101,114,41,59,164,116,120,116,61,34,65,108,97,114,109,34,43,34,32, -34,43,102,111,114,109,97,116,84,105,109,101,40,97,108,97,114,109,46,116,41,59,163,40,97,108,97,114,109,46,114,112, -41,116,120,116,150,34,92,48,34,43,97,116,111,98,40,34,70,66,97,66,65,65,65,66,103,65,65,99,65,65,72,110, -47,47,47,47,47,47,119,65,72,115,65,66,122,65,65,89,119,65,65,77,65,65,68,65,65,65,65,65,65,119,65,65, -77,65,65,68,71,65,65,122,103,65,78,52,65,68,47,47,47,47,47,47,53,52,65,65,79,65,65,66,103,65,65,61, -34,41,59,109,101,110,117,91,116,120,116,93,61,123,118,97,108,117,101,58,34,92,48,34,43,97,116,111,98,40,97,108, -97,114,109,46,111,110,63,34,69,104,75,66,65,72,47,47,118,47,47,47,47,47,47,47,47,47,47,47,47,47,53,47, -47,120,47,47,106,47,47,72,43,101,80,43,77,102,47,65,47,47,104,47,47,122,47,47,47,47,47,47,47,47,47,47, -51,47,47,103,34,58,34,69,104,75,66,65,72,47,47,118,47,47,56,65,65,56,65,65,56,65,65,56,65,65,56,65, -65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,47,47,47,51, -47,47,103,34,41,44,111,110,99,104,97,110,103,101,58,170,40,41,123,163,40,97,108,97,114,109,46,116,105,109,101,114, -41,101,100,105,116,84,105,109,101,114,40,105,100,120,44,97,108,97,114,109,41,59,164,101,100,105,116,65,108,97,114,109, -40,105,100,120,44,97,108,97,114,109,41,59,125,125,59,125,41,59,163,40,87,73,68,71,69,84,83,91,34,97,108,97, -114,109,34,93,41,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,171, -69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,10,170,101,100,105,116,68,79,87,40,100,111,119,44, -111,110,99,104,97,110,103,101,41,123,174,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,68,97, -121,115,32,111,102,32,87,101,101,107,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,111,110,99,104,97,110,103, -101,40,100,111,119,41,125,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,40,105,162,123,172,100,97,121,79,102, -87,101,101,107,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,123,103,101,116,68, -97,121,58,40,41,162,105,125,41,59,109,101,110,117,91,100,97,121,79,102,87,101,101,107,93,61,123,118,97,108,117,101, -58,33,33,40,100,111,119,38,40,49,143,105,41,41,44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58, -34,78,111,34,44,111,110,99,104,97,110,103,101,58,118,162,118,63,100,111,119,159,49,143,105,58,100,111,119,157,126,40, -49,143,105,41,44,125,59,125,41,40,105,41,59,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,10, -170,101,100,105,116,65,108,97,114,109,40,97,108,97,114,109,73,110,100,101,120,44,97,108,97,114,109,41,123,172,110,101, -119,65,108,97,114,109,61,97,108,97,114,109,73,110,100,101,120,60,48,59,172,97,61,123,116,58,49,50,42,51,54,48, -48,48,48,48,44,111,110,58,180,44,114,112,58,180,44,97,115,58,181,44,100,111,119,58,48,98,49,49,49,49,49,49, -49,44,108,97,115,116,58,48,44,118,105,98,114,97,116,101,58,34,46,46,34,125,163,40,33,110,101,119,65,108,97,114, -109,41,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108,97,114,109,115,91,97,108,97,114,109,73,110, -100,101,120,93,41,59,163,40,97,108,97,114,109,41,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108, -97,114,109,41,59,172,116,61,100,101,99,111,100,101,84,105,109,101,40,97,46,116,41,59,174,109,101,110,117,61,123,39, -39,58,123,39,116,105,116,108,101,39,58,39,65,108,97,114,109,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162, -115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,72,111,117,114,115,39,58,123,118,97,108,117,101,58,116,46, -104,114,115,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,118,162,116,46,104,114,115,61,118,125,44,39,77,105,110,117,116,101,115,39,58,123,118,97,108,117,101,58,116,46,109, -105,110,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,118,162,116,46,109,105,110,115,61,118,125,44,39,69,110,97,98,108,101,100,39,58,123,118,97,108,117,101,58,97,46, -111,110,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103, -101,58,118,162,97,46,111,110,61,118,125,44,39,82,101,112,101,97,116,39,58,123,118,97,108,117,101,58,97,46,114,112, -44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58, -118,162,97,46,114,112,61,118,125,44,39,68,97,121,115,39,58,123,118,97,108,117,101,58,34,83,77,84,87,84,70,83, -34,46,115,112,108,105,116,40,34,34,41,46,109,97,112,40,40,100,44,110,41,162,97,46,100,111,119,38,40,49,143,110, -41,63,100,58,34,46,34,41,46,106,111,105,110,40,34,34,41,44,111,110,99,104,97,110,103,101,58,40,41,162,101,100, -105,116,68,79,87,40,97,46,100,111,119,44,100,162,123,97,46,100,111,119,61,100,59,101,100,105,116,65,108,97,114,109, -40,97,108,97,114,109,73,110,100,101,120,44,97,41,125,41,125,44,39,86,105,98,114,97,116,101,39,58,114,101,113,117, -105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,46,118,105,98,114,97, -116,101,44,118,162,97,46,118,105,98,114,97,116,101,61,118,41,44,39,65,117,116,111,32,115,110,111,111,122,101,39,58, -123,118,97,108,117,101,58,97,46,97,115,44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58,34,78,111, -34,44,111,110,99,104,97,110,103,101,58,118,162,97,46,97,115,61,118,125,125,59,109,101,110,117,91,34,83,97,118,101, -34,93,61,170,40,41,123,97,46,116,61,101,110,99,111,100,101,84,105,109,101,40,116,41,59,163,40,97,46,116,60,103, -101,116,67,117,114,114,101,110,116,84,105,109,101,40,41,41,97,46,100,97,121,61,40,184,68,97,116,101,40,41,41,46, -103,101,116,68,97,116,101,40,41,59,163,40,110,101,119,65,108,97,114,109,41,97,108,97,114,109,115,46,112,117,115,104, -40,97,41,59,164,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,59,115,97,118,101,65,110, -100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,59,163,40,33,110,101, -119,65,108,97,114,109,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,170,40,41,123,97,108,97,114,109, -115,46,115,112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101, -108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,59,125,171,69,46,115,104,111,119, -77,101,110,117,40,109,101,110,117,41,59,125,10,170,101,100,105,116,84,105,109,101,114,40,97,108,97,114,109,73,110,100, -101,120,44,97,108,97,114,109,41,123,172,110,101,119,65,108,97,114,109,61,97,108,97,114,109,73,110,100,101,120,60,48, -59,172,97,61,123,116,105,109,101,114,58,53,42,54,48,42,49,48,48,48,44,111,110,58,180,44,114,112,58,181,44,97, -115,58,181,44,100,111,119,58,48,98,49,49,49,49,49,49,49,44,108,97,115,116,58,48,44,118,105,98,114,97,116,101, -58,34,46,46,34,125,163,40,33,110,101,119,65,108,97,114,109,41,79,98,106,101,99,116,46,97,115,115,105,103,110,40, -97,44,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,41,59,163,40,97,108,97,114,109,41,79,98, -106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108,97,114,109,41,59,172,116,61,100,101,99,111,100,101,84,105, -109,101,40,97,46,116,105,109,101,114,41,59,174,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, -84,105,109,101,114,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117, -40,41,44,39,72,111,117,114,115,39,58,123,118,97,108,117,101,58,116,46,104,114,115,44,109,105,110,58,48,44,109,97, -120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,46,104,114,115,61,118,125,44, -39,77,105,110,117,116,101,115,39,58,123,118,97,108,117,101,58,116,46,109,105,110,115,44,109,105,110,58,48,44,109,97, -120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,46,109,105,110,115,61,118,125, -44,39,69,110,97,98,108,101,100,39,58,123,118,97,108,117,101,58,97,46,111,110,44,102,111,114,109,97,116,58,118,162, -118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,97,46,111,110,61,118,125,44, -39,86,105,98,114,97,116,101,39,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112, -97,116,116,101,114,110,40,97,46,118,105,98,114,97,116,101,44,118,162,97,46,118,105,98,114,97,116,101,61,118,41,44, -125,59,109,101,110,117,91,34,83,97,118,101,34,93,61,170,40,41,123,97,46,116,105,109,101,114,61,101,110,99,111,100, -101,84,105,109,101,40,116,41,59,97,46,116,61,103,101,116,67,117,114,114,101,110,116,84,105,109,101,40,41,43,97,46, -116,105,109,101,114,59,163,40,110,101,119,65,108,97,114,109,41,97,108,97,114,109,115,46,112,117,115,104,40,97,41,59, -164,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,59,115,97,118,101,65,110,100,82,101,108, -111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,59,163,40,33,110,101,119,65,108,97, -114,109,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,170,40,41,123,97,108,97,114,109,115,46,115,112, -108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100, -40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,59,125,171,69,46,115,104,111,119,77,101,110,117, -40,109,101,110,117,41,59,125,10,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,132,4,0,0,97,108,97,114, -109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,132,6,102,102,102,102, -102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17, -17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,17,102,102,102,102,17,17,102,102,102,102,17,17,17, -102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17,17,102,102,102,17,17,17,17,17,102,102,102,102,102,97,17, -17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17,17,22,102,102,102,102,17,17,17,17,17,102,204,204,204,204, -204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17, -17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204,204,204,204,204,204,193,17,17,17,17,22,102,102,17,17,17, -17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17,17,17,17,102,102,17,17,17,17,76,204,204,67,255,255,255, -255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17,20,204,204,195,255,255,255,255,255,255,255,255,60,204,204,65, -17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240,15,255,255,255,243,76,204,196,17,17,17,102,102,17,17,17, -204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204,17,17,17,102,102,17,17,108,204,196,255,255,255,255,255,240, -15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204,204,195,255,255,255,255,255,240,15,255,255,255,255,255,60,204, -204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240,15,255,255,255,255,255,243,204,204,102,22,102,102,102,108,204, -196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76,204,198,102,102,102,102,108,204,195,255,255,255,255,255,255,240, -15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244, -204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,204,204, -63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,255,255,240, -15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,48,3,255,255,255,255,255,255,255, -204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204, -255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,243,64, -0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204,63,255,255,255,255,255,52,63,48,0,63,255,255,255,255,243, -204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255,243,0,3,255,255,255,255,243,204,204,102,102,102,102,108,204, -79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,243,67,255,255, -255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204,195,255,255,255,52,63,255,255,255,255,48,47,255,255,255,60, -204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255,255,255,243,255,255,255,255,76,204,198,102,102,102,102,102,204, -204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204,204,102,102,102,102,102,102,204,204,195,255,243,255,255,255,255, -255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108,204,196,255,255,255,255,255,255,255,255,255,255,255,255,76,204, -198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255,255,255,255,255,255,244,204,204,102,102,102,102,102,102,102,102, -204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204,102,102,102,102,102,102,102,102,108,204,204,195,255,255,255,255, -255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102,102,204,204,204,67,255,255,255,255,255,255,52,204,204,204,102, -102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255,255,51,68,204,204,204,65,102,102,102,102,102,102,102,102,102, -97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22,102,102,102,102,102,102,102,102,17,17,22,204,204,204,204,204, -204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97,17,17,102,102,204,204,204,204,204,204,204,204,102,102,17,17, -22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204,204,204,102,102,102,102,97,17,22,102,102,102,102,102,102,97, -17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,22,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44,34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34, +44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34, +119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116, +97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99,111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101, +108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111, +109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101, +108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97,34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34, +125,255,255,255,119,56,0,0,115,101,116,116,105,110,103,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108, +115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101, +100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184, +68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101, +118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63, +49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101, +114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116, +68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93, +59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61, +48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40, +105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100, +41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100, +111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115, +46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114, +101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45, +48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108, +105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98, +98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58, +109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116, +101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40, +34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115, +46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41, +42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40, +48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114, +101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104, +46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110, +103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105, +100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46, +72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83, +116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116, +105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115, +111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41, +123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50, +41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85, +112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123, +111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66, +84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46, +119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107, +101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101, +83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125, +10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101, +114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110, +103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108, +111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58, +180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110, +101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114, +115,116,68,97,121,79,102,87,101,101,107,58,48,44,98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111, +110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97, +107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110, +84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115, +104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84, +105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116, +116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116, +83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34, +58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110, +117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97, +99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83, +101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121, +115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76, +69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101, +110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59, +171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115, +116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39, +58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77, +101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41, +44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39, +58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111, +99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84, +105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104, +111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101, +110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116,101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123, +98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101, +112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115, +40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40, +86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, +111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59, +125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34,118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79, +102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98,114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73, +116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101, +120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58, +98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93, +44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86, +91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111,103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123, +102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101, +115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118,138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40, +86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, +111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100, +97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58, +123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115, +104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66,101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101, +109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105, +98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, +58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46, +118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105, +110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66,82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101, +116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41, +59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, +115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109, +115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, +116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, +41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73, +68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113,109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59, +125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104, +111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100,86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34, +107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93,59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75, +98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98,114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115, +101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39, +116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116,104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162, +115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101, +39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109, +97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101, +116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, +80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108, +101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, +58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46, +98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68, +39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120, +79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41,41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78, +46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97, +110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97, +116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123, +118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46, +112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105, +109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105, +115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115, +101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34, +41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115, +104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109, +101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171,103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101, +116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116,104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101, +116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, +59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115,101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115, +101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46, +102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116,104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61, +170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116,40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40, +48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59, +125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40, +41,59,109,46,100,114,97,119,40,41,59,125,172,116,104,101,109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116, +108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116, +101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99, +108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34, +35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102, +102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39, +76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41, +44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103, +50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58, +99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58,181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34, +83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111, +114,69,97,99,104,40,110,162,123,173,110,101,119,84,104,101,109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,110,41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119, +84,104,101,109,101,46,110,97,109,101,63,110,101,119,84,104,101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123, +117,112,100,40,123,102,103,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101, +119,84,104,101,109,101,46,98,103,41,44,102,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44, +98,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84, +104,101,109,101,46,102,103,72,41,44,98,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100, +97,114,107,58,110,101,119,84,104,101,109,101,46,100,97,114,107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77, +101,110,117,91,39,67,117,115,116,111,109,105,122,101,39,93,61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104, +101,109,101,77,101,110,117,40,41,59,172,109,61,69,46,115,104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101, +110,117,41,59,170,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84, +40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109,101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98, +103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40,118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117, +112,100,40,116,104,41,59,125,173,114,103,98,61,123,125,59,114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48, +48,48,34,59,114,103,98,91,39,119,104,105,116,101,39,93,61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100, +39,93,61,34,35,102,48,48,34,59,114,103,98,91,39,103,114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103, +98,91,39,98,108,117,101,39,93,61,34,35,48,48,102,34,59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48, +102,102,34,59,114,103,98,91,39,109,97,103,101,110,116,97,39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121, +101,108,108,111,119,39,93,61,34,35,102,102,48,34,59,163,40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98, +91,39,111,114,97,110,103,101,39,93,61,34,35,102,102,55,102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101, +39,93,61,34,35,55,102,48,48,102,102,34,59,114,103,98,91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55, +102,34,59,125,173,99,111,108,111,114,115,61,91,93,44,110,97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98, +41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59,99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114, +103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111, +109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77, +101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123,102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44, +98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44,102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32, +50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117,110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108, +105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105,103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34, +102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34,98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34, +93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110,117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105, +110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118, +97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111,108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116, +104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109,97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110, +99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99,111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103, +39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115,101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101, +46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46,116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40, +39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41,59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125, +41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93,61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110, +117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80, +97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162, +115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116, +105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115, +115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123, +115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101, +83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105,61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123, +109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43,49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101, +116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105,93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110, +99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112, +108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61, +112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125, +41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104, +105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40, +41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101, +116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115, +46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111, +114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91,100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61, +170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116, +104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, +46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120, +79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105, +109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125, +125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101,118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111, +119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32,100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116, +111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87,104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40, +170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110, +101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70, +46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78, +82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105, +110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, +61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114, +41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108, +76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105, +115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59, +10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41,123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123, +39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83, +121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68,32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44, +109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118,160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116, +105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41,59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116, +39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44, +109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, +103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105, +109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109, +97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, +110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110, +115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71,76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115, +115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44, +102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115, +101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116, +105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112, +116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101, +58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114, +109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116, +105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103, +115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111, +110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117, +44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85,112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110, +103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98, +111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46, +111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111, +112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110, +115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101, +116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97, +116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110, +103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111, +110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115, +101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109, +97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, +110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103, +115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105, +111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117, +101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116, +119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109,105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44, +115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111, +112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97, +108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105, +115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110, +115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58,45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115, +116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118,160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105, +111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105, +110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61, +118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46, +115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117,41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101, +110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, +76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77, +101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, +115,46,116,105,109,101,122,111,110,101,44,102,111,114,109,97,116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41, +43,118,44,109,105,110,58,45,49,49,44,109,97,120,58,49,51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97, +110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100, +97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123, +118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97, +116,58,118,162,118,63,34,49,50,104,34,58,34,50,52,104,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, +116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,125,125,44,39,83,116,97,114,116,32,87,101,101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101, +116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48, +44,109,97,120,58,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116, +105,108,115,34,41,46,100,111,119,40,118,44,49,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101, +116,116,105,110,103,115,40,41,59,125,44,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108, +101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61, +123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99, +107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111, +39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48, +44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34, +44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44, +111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116, +101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39, +58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46, +46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108, +101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, +46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119, +114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105, +114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106, +115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125, +44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115, +115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32, +99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116, +111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109, +101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40, +66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83, +80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80, +111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34, +41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108, +101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97, +110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101, +116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103, +108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101, +114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49, +48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125,125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10, +109,101,110,117,91,39,67,97,108,105,98,114,97,116,101,32,66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46, +115,104,111,119,80,114,111,109,112,116,40,34,73,115,32,116,104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121, +32,99,104,97,114,103,101,100,63,34,44,123,116,105,116,108,101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46, +116,104,101,110,40,111,107,162,123,163,40,111,107,41,123,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97, +103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46, +98,97,116,70,117,108,108,86,111,108,116,97,103,101,61,40,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97, +110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97, +108,111,103,82,101,97,100,40,68,51,41,41,47,52,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34, +41,46,119,114,105,116,101,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46, +115,104,111,119,65,108,101,114,116,40,34,67,97,108,105,98,114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41, +162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115, +104,111,119,65,108,101,114,116,40,34,80,108,101,97,115,101,32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106, +115,32,102,111,114,32,51,32,104,111,117,114,115,32,97,110,100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104, +101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125, +125,41,59,125,59,10,109,101,110,117,91,39,82,101,115,101,116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162, +123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115, +63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105,110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162, +123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41, +59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, +77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41, +59,125,59,10,109,101,110,117,91,34,84,117,114,110,32,79,102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80, +114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32, +116,105,109,101,114,115,32,119,111,110,39,116,32,102,105,114,101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32, +79,102,102,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105, +114,109,101,100,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97, +116,101,114,33,34,44,34,71,111,111,100,98,121,101,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123, +69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108, +101,46,115,111,102,116,79,102,102,63,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108, +101,46,111,102,102,40,41,59,125,44,50,53,48,48,41,59,125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40, +41,59,125,125,41,59,125,59,10,163,40,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123, +109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119, +80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104, +105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116, +104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101, +114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111, +114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125, +10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99, +116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123, +125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101, +61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115, +117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111, +119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101, +63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114, +162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101, +61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46, +115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40, +41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65, +112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105, +110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100, +74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63, +97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44, +98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108, +111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111, +99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117, +40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100, +101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103, +115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107, +139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111, +99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111, +99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115, +114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117, +40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123, +99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162, +123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115, +104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105, +109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101, +39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123,115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109, +101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97, +121,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68, +97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100, +46,103,101,116,77,111,110,116,104,40,41,43,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34, +100,97,116,101,95,117,116,105,108,115,34,41,46,109,111,110,116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77, +111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59,125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101, +58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41,44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49, +48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118, +41,59,125,125,44,39,72,111,117,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44, +111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59, +100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58, +123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117,116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116, +101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100, +46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97, +108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108, +117,101,41,59,125,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10, +125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110, +117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39, +60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112, +115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47,92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47, +41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116,114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41, +41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105, +100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97,109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110, +97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114, +125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41,162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114, +100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46, +110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41, +171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46,108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110, +117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101,116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125, +10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40,97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112, +46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125, +59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97,112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112, +112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10,174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123, +69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36,123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109, +115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32,103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116, +99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112, +101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101, +97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116,105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83, +101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112,83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104, +40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116, +116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111, +114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141, +34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111,119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32, +115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112,112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111, +119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111, +110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32, +101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115, +101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0, +115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0, +255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0, +1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, +0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0,85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85, +69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0,0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85, +234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170,213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0, +0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122,170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170, +169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0,0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170, +168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0, +0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234,170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170, +171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0,0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90, +170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170,181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0, +0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85,94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85, +85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0,0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0, +5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, +0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116,105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116,114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114, +117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34,116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98, +114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112,34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110, +101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101,44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49, +50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114,105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116, +105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84,78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110, +66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97, +107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58, +102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105,115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84, +104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44,34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48, +44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58,49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116, +105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115, +101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34,83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58, +34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103, +46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34, +48,46,52,56,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101, +115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111,44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44, +115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97,116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111, +110,34,125,255,198,41,0,0,97,108,97,114,109,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108, +115,34,44,170,40,41,123,174,79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78, +85,84,69,61,54,48,42,79,78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79, +78,69,95,77,73,78,85,84,69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101, +120,112,111,114,116,115,46,101,110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115, +97,102,101,84,105,109,101,40,116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105, +109,101,46,104,42,79,78,69,95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43, +116,105,109,101,46,115,42,79,78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109, +101,41,123,171,123,100,58,116,105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109, +101,46,109,160,48,44,115,58,116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100, +101,84,105,109,101,61,40,109,105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101, +114,34,41,176,34,79,110,108,121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101, +100,34,59,172,100,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41, +59,109,105,108,108,105,115,151,100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40, +109,105,108,108,105,115,47,79,78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79, +85,82,59,172,109,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85, +84,69,41,59,109,105,108,108,105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46, +102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104, +58,104,44,109,58,109,44,115,58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61, +40,118,97,108,117,101,41,162,123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34, +111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101, +40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115, +117,112,112,111,114,116,101,100,32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104, +62,50,51,41,176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60, +61,32,104,32,60,61,32,50,51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41, +176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32, +60,61,32,53,57,34,59,171,116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46, +115,117,98,115,116,114,40,45,50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105, +111,110,61,40,118,97,108,117,101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112, +97,99,116,160,181,59,172,100,117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109, +101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46, +100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117, +114,97,116,105,111,110,150,116,105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117, +114,97,116,105,111,110,150,116,105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117, +114,97,116,105,111,110,150,116,105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117, +114,97,116,105,111,110,150,116,105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105, +111,110,46,116,114,105,109,40,41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97, +99,101,40,34,32,34,44,34,34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116, +67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116, +101,40,41,59,171,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46, +103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40, +41,41,42,49,48,48,48,59,125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34, +100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97, +98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108, +101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48, +48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118, +105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100, +111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111, +119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162, +123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108, +101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112, +111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98, +98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46, +109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59, +125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162, +123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40, +184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118, +105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49, +58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112, +101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40, +97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101, +61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105, +152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116, +101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101, +100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48, +41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111, +110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59, +125,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170, +40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109, +105,115,101,40,114,101,115,111,108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110, +138,34,34,41,114,101,115,111,108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116, +101,114,110,61,112,97,116,116,101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75, +61,48,46,50,53,44,66,85,90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48, +48,44,77,69,68,73,85,77,95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138, +34,46,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69, +65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48, +48,41,41,59,164,163,40,99,138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95, +77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116, +40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117, +122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101, +116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66, +97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41, +46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41, +59,164,163,40,99,138,34,59,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44, +66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40, +100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122, +122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115, +101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111, +117,116,40,100,111,66,117,122,122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10, +77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40, +41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97, +99,107,41,123,172,112,97,116,116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34, +58,58,34,44,34,44,34,44,34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45, +45,34,44,34,61,61,34,44,34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44, +34,61,61,61,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114, +110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116, +116,101,114,110,115,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115, +91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98, +117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98, +97,99,107,40,112,97,116,116,101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108,101,46, +108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, +115,40,41,59,10,174,102,105,114,115,116,68,97,121,79,102,87,101,101,107,61,40,114,101,113,117,105,114,101,40,34,83, +116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34, +44,180,41,160,123,125,41,46,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,59,10,174,87,79,82,75,68, +65,89,83,61,54,50,10,174,87,69,69,75,69,78,68,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,49, +57,50,58,54,53,59,10,174,69,86,69,82,89,95,68,65,89,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107, +63,50,53,52,58,49,50,55,59,10,174,105,99,111,110,65,108,97,114,109,79,110,61,34,92,48,34,43,97,116,111,98, +40,34,71,66,105,66,65,65,65,65,65,65,65,65,65,65,89,65,89,65,52,65,99,66,120,43,79,68,110,47,110,65, +80,47,119,65,102,47,52,65,47,110,56,65,47,110,56,66,47,110,43,66,47,110,43,66,47,110,43,66,47,110,43,66, +47,104,43,66,47,52,43,65,47,43,56,65,47,47,56,65,102,47,52,65,80,47,119,65,72,47,103,65,66,43,65,65, +65,65,65,65,65,65,65,65,61,61,34,41,59,10,174,105,99,111,110,65,108,97,114,109,79,102,102,61,34,92,48,34, +43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56, +65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65, +80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52, +80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103, +61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,71,65,71, +65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47, +103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52, +99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,174,105,99,111,110, +84,105,109,101,114,79,110,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40, +34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65, +66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65, +65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65, +65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89, +65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119, +65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65, +65,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101, +109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65, +65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119, +65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119, +77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111, +98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47, +43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80, +65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56, +119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117, +105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,104,97,110,100,108, +101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,100,111,119,41,123,163,40,102,105,114,115,116,68,97,121,79, +102,87,101,101,107,138,49,41,123,163,40,40,100,111,119,38,49,41,138,49,41,123,100,111,119,150,49,50,55,59,125,164, +163,40,40,100,111,119,38,49,50,56,41,138,49,50,56,41,123,100,111,119,151,49,50,55,59,125,125,171,100,111,119,59, +125,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114, +69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101, +107,40,97,46,100,111,119,41,41,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117, +61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,108,97,114,109,115,32,38,32,84,105,109,101,114,115,34,125, +44,34,60,32,66,97,99,107,34,58,40,41,162,108,111,97,100,40,41,44,34,78,101,119,46,46,46,34,58,40,41,162, +115,104,111,119,78,101,119,77,101,110,117,40,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,101, +44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,101,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40, +34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,101,46,116, +105,109,101,114,41,58,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109, +97,116,84,105,109,101,40,101,46,116,41,43,40,101,46,114,112,63,96,32,36,123,100,101,99,111,100,101,68,79,87,40, +101,41,125,96,58,34,34,41,59,109,101,110,117,91,108,97,98,101,108,93,61,123,118,97,108,117,101,58,101,46,111,110, +63,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101,114,79,110,58,105,99,111,110,65,108,97,114,109,79, +110,41,58,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101,114,79,102,102,58,105,99,111,110,65,108,97, +114,109,79,102,102,41,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,101,46, +116,105,109,101,114,63,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,58,115,104,111,119,69,100,105,116, +65,108,97,114,109,77,101,110,117,44,49,48,44,101,44,105,110,100,101,120,41,125,59,125,41,59,10,109,101,110,117,91, +34,65,100,118,97,110,99,101,100,34,93,61,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40, +41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,78,101,119,77,101, +110,117,40,41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,78, +101,119,46,46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117, +40,41,44,34,65,108,97,114,109,34,58,40,41,162,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40, +183,44,183,41,44,34,84,105,109,101,114,34,58,40,41,162,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110, +117,40,183,44,183,41,125,41,59,10,125,170,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,115,101, +108,101,99,116,101,100,65,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61, +97,108,97,114,109,73,110,100,101,120,139,183,59,10,172,97,108,97,114,109,61,114,101,113,117,105,114,101,40,34,115,99, +104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,65,108,97,114,109,40,41,59,10,97,108,97,114,109,46,100, +111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,108,97,114,109,46,100,111, +119,41,59,10,163,40,115,101,108,101,99,116,101,100,65,108,97,114,109,41,123,79,98,106,101,99,116,46,97,115,115,105, +103,110,40,97,108,97,114,109,44,115,101,108,101,99,116,101,100,65,108,97,114,109,41,59,125,10,172,116,105,109,101,61, +114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101, +40,97,108,97,114,109,46,116,41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115, +78,101,119,63,34,78,101,119,32,65,108,97,114,109,34,58,34,69,100,105,116,32,65,108,97,114,109,34,125,44,34,60, +32,66,97,99,107,34,58,40,41,162,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97, +108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108, +111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,34,58,123,118, +97,108,117,101,58,116,105,109,101,46,104,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98, +115,116,114,40,45,50,41,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104, +97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,34,58,123,118,97,108,117,101, +58,116,105,109,101,46,109,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40, +45,50,41,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, +58,118,162,116,105,109,101,46,109,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,97,108, +97,114,109,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,111,110,61,118,125,44,34,82, +101,112,101,97,116,34,58,123,118,97,108,117,101,58,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,44,111, +110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101, +112,101,97,116,77,101,110,117,44,49,48,48,44,97,108,97,114,109,46,114,112,44,97,108,97,114,109,46,100,111,119,44, +40,114,101,112,101,97,116,44,100,111,119,41,162,123,97,108,97,114,109,46,114,112,61,114,101,112,101,97,116,59,97,108, +97,114,109,46,100,111,119,61,100,111,119,59,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109, +101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105, +109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109, +44,97,108,97,114,109,73,110,100,101,120,41,59,125,41,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105, +114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,108,97,114,109,46,118,105, +98,114,97,116,101,44,118,162,97,108,97,114,109,46,118,105,98,114,97,116,101,61,118,41,44,34,65,117,116,111,32,83, +110,111,111,122,101,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,97,115,44,111,110,99,104,97,110,103,101,58, +118,162,97,108,97,114,109,46,97,115,61,118,125,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97, +105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116, +101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117, +114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,65,108,97,114,109,34,125,41,46,116,104,101, +110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115, +112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97, +100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,97,108,97,114,109,46,116,61,114,101, +113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116, +105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110, +117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,125,41,59,125,59,125,10,69, +46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,65,108,97,114,109,70, +111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,123,10,97, +108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99, +111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,97,108,97,114,109,46,108,97,115,116,61,97,108,97,114,109,46, +116,60,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101, +110,116,84,105,109,101,77,105,108,108,105,115,40,41,63,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41, +58,48,59,10,163,40,97,108,97,114,109,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40, +97,108,97,114,109,41,59,125,164,123,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,108,97, +114,109,59,125,10,125,170,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,10,97,108,97,114,109,115,46,102, +105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100, +111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59, +10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114, +109,115,41,59,10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,10, +97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97, +99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40, +97,46,100,111,119,41,41,59,10,125,170,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,123,10,171,97,108, +97,114,109,46,114,112,10,63,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,10,46,100, +111,119,115,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,50,41,10,46,109,97,112,40,40,100,97,121,44, +105,110,100,101,120,41,162,97,108,97,114,109,46,100,111,119,38,40,49,143,40,105,110,100,101,120,43,102,105,114,115,116, +68,97,121,79,102,87,101,101,107,41,41,63,100,97,121,58,34,95,34,41,10,46,106,111,105,110,40,34,34,41,10,46, +116,111,76,111,119,101,114,67,97,115,101,40,41,10,58,34,79,110,99,101,34,10,125,170,115,104,111,119,69,100,105,116, +82,101,112,101,97,116,77,101,110,117,40,114,101,112,101,97,116,44,100,111,119,44,100,111,119,67,104,97,110,103,101,67, +97,108,108,98,97,99,107,41,123,10,172,111,114,105,103,105,110,97,108,82,101,112,101,97,116,61,114,101,112,101,97,116, +59,10,172,111,114,105,103,105,110,97,108,68,111,119,61,100,111,119,59,10,172,105,115,67,117,115,116,111,109,61,114,101, +112,101,97,116,158,100,111,119,140,87,79,82,75,68,65,89,83,158,100,111,119,140,87,69,69,75,69,78,68,158,100,111, +119,140,69,86,69,82,89,95,68,65,89,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58, +34,82,101,112,101,97,116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,100,111,119,67, +104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97,116,44,100,111,119,41,44,34,79,110,99,101,34, +58,123,118,97,108,117,101,58,33,114,101,112,101,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67, +104,97,110,103,101,67,97,108,108,98,97,99,107,40,181,44,69,86,69,82,89,95,68,65,89,41,125,44,34,87,111,114, +107,100,97,121,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,79,82,75,68,65,89, +83,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40, +180,44,87,79,82,75,68,65,89,83,41,125,44,34,87,101,101,107,101,110,100,115,34,58,123,118,97,108,117,101,58,114, +101,112,101,97,116,158,100,111,119,138,87,69,69,75,69,78,68,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111, +119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,69,69,75,69,78,68,41,125,44,34,69,118,101, +114,121,32,68,97,121,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,69,86,69,82,89,95, +68,65,89,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99, +107,40,180,44,69,86,69,82,89,95,68,65,89,41,125,44,34,67,117,115,116,111,109,34,58,123,118,97,108,117,101,58, +105,115,67,117,115,116,111,109,63,100,101,99,111,100,101,68,79,87,40,123,114,112,58,180,44,100,111,119,58,100,111,119, +125,41,58,181,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, +67,117,115,116,111,109,68,97,121,115,77,101,110,117,44,49,48,44,105,115,67,117,115,116,111,109,63,100,111,119,58,69, +86,69,82,89,95,68,65,89,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105, +110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,41,125,125,59,10,69,46,115,104,111,119, +77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117, +40,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82, +101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,41,123,10,174,109,101,110,117,61,123,34,34,58,123,34, +116,105,116,108,101,34,58,34,67,117,115,116,111,109,32,68,97,121,115,34,125,44,34,60,32,66,97,99,107,34,58,40, +41,162,123,172,114,101,112,101,97,116,61,100,111,119,62,48,59,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97, +99,107,40,114,101,112,101,97,116,44,114,101,112,101,97,116,63,100,111,119,58,69,86,69,82,89,95,68,65,89,41,125, +125,59,10,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,115,40,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,41,46,102,111,114,69,97,99,104,40,40,100,97,121,44,105,41,162,123,109, +101,110,117,91,100,97,121,93,61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,40,105,43,102,105,114, +115,116,68,97,121,79,102,87,101,101,107,41,41,41,44,111,110,99,104,97,110,103,101,58,118,162,118,63,40,100,111,119, +159,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,58,40,100,111,119,157,126,40,49,143, +40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,41,125,59,125,41,59,10,109,101,110,117,91,34, +67,97,110,99,101,108,34,93,61,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82, +101,112,101,97,116,77,101,110,117,44,49,48,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103, +105,110,97,108,68,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,10,69,46,115,104,111, +119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117, +40,115,101,108,101,99,116,101,100,84,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,123,10,172,105,115,78, +101,119,61,116,105,109,101,114,73,110,100,101,120,139,183,59,10,172,116,105,109,101,114,61,114,101,113,117,105,114,101,40, +34,115,99,104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,40,41,59,10,163,40,115,101, +108,101,99,116,101,100,84,105,109,101,114,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,116,105,109,101,114, +44,115,101,108,101,99,116,101,100,84,105,109,101,114,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40, +34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,116,105,109,101,114,46,116, +105,109,101,114,41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63, +34,78,101,119,32,84,105,109,101,114,34,58,34,69,100,105,116,32,84,105,109,101,114,34,125,44,34,60,32,66,97,99, +107,34,58,40,41,162,123,112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114, +44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40, +41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,115,34,58,123,118,97,108,117, +101,58,116,105,109,101,46,104,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99, +104,97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,115,34,58,123,118,97,108, +117,101,58,116,105,109,101,46,109,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110, +99,104,97,110,103,101,58,118,162,116,105,109,101,46,109,61,118,125,44,34,83,101,99,111,110,100,115,34,58,123,118,97, +108,117,101,58,116,105,109,101,46,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,115,116,101,112,58,49,44,119, +114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,115,61,118,125,44,34,69,110,97,98, +108,101,100,34,58,123,118,97,108,117,101,58,116,105,109,101,114,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162, +116,105,109,101,114,46,111,110,61,118,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98, +117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,116,105,109,101,114,46,118,105,98,114,97,116,101, +44,118,162,116,105,109,101,114,46,118,105,98,114,97,116,101,61,118,41,44,34,67,97,110,99,101,108,34,58,40,41,162, +115,104,111,119,77,97,105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91, +34,68,101,108,101,116,101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32, +121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,84,105,109,101,114,34, +125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108, +97,114,109,115,46,115,112,108,105,99,101,40,116,105,109,101,114,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110, +100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,116,105,109,101, +114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110, +99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100, +105,116,84,105,109,101,114,77,101,110,117,44,49,48,44,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41, +125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112, +97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120, +44,116,105,109,101,41,123,10,116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109, +101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,116,105,109,101, +114,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114, +114,101,110,116,84,105,109,101,77,105,108,108,105,115,40,41,43,116,105,109,101,114,46,116,105,109,101,114,59,10,116,105, +109,101,114,46,108,97,115,116,61,48,59,10,163,40,116,105,109,101,114,73,110,100,101,120,139,183,41,123,97,108,97,114, +109,115,46,112,117,115,104,40,116,105,109,101,114,41,59,125,164,123,97,108,97,114,109,115,91,116,105,109,101,114,73,110, +100,101,120,93,61,116,105,109,101,114,59,125,10,125,170,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40, +41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,100,118,97, +110,99,101,100,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40, +41,44,34,83,99,104,101,100,117,108,101,114,32,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114, +101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,115,101, +116,116,105,110,103,115,46,106,115,34,41,41,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117, +40,41,41,44,34,69,110,97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,180,41, +44,34,68,105,115,97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,181,41,44,34, +68,101,108,101,116,101,32,65,108,108,34,58,40,41,162,100,101,108,101,116,101,65,108,108,40,41,125,41,59,10,125,170, +101,110,97,98,108,101,65,108,108,40,111,110,41,123,10,163,40,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101, +162,101,46,111,110,138,33,111,110,41,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116, +40,111,110,63,34,78,111,116,104,105,110,103,32,116,111,32,69,110,97,98,108,101,34,58,34,78,111,116,104,105,110,103, +32,116,111,32,68,105,115,97,98,108,101,34,44,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105, +115,97,98,108,101,32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100, +77,101,110,117,40,41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117, +32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34, +68,105,115,97,98,108,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163, +40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44, +105,41,162,123,97,108,97,114,109,46,111,110,61,111,110,59,163,40,111,110,41,123,163,40,97,108,97,114,109,46,116,105, +109,101,114,41,123,112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105, +44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109, +101,40,97,108,97,114,109,46,116,105,109,101,114,41,41,125,164,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111, +114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108, +115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,41,125,125,125,41,59,115,97,118, +101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115, +104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,170,100,101,108,101,116,101, +65,108,108,40,41,123,10,163,40,97,108,97,114,109,115,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119, +65,108,101,114,116,40,34,78,111,116,104,105,110,103,32,116,111,32,100,101,108,101,116,101,34,44,34,68,101,108,101,116, +101,32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117, +40,41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114, +101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40, +99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,61,91,93,59,115, +97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164, +123,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,115,104,111,119,77, +97,105,110,77,101,110,117,40,41,59,255,255,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,17,17,17,102,102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17, +102,102,102,17,17,102,102,102,17,17,17,17,17,102,102,102,102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102, +97,17,17,17,17,22,102,102,102,102,17,17,17,17,17,102,204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102, +102,97,17,17,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204, +204,204,204,204,204,204,204,204,204,193,17,17,17,17,22,102,102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204, +204,204,65,17,17,17,17,102,102,17,17,17,17,76,204,204,67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102, +102,17,17,17,20,204,204,195,255,255,255,255,255,255,255,255,60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63, +255,255,255,240,15,255,255,255,243,76,204,196,17,17,17,102,102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255, +255,244,204,204,17,17,17,102,102,17,17,108,204,196,255,255,255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102, +102,97,22,204,204,195,255,255,255,255,255,240,15,255,255,255,255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255, +255,255,255,240,15,255,255,255,255,255,243,204,204,102,22,102,102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255, +255,255,255,76,204,198,102,102,102,102,108,204,195,255,255,255,255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102, +102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255, +255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255, +255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102, +102,102,204,204,255,255,255,255,255,255,255,48,3,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255, +255,255,255,5,80,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255, +255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102, +102,102,204,204,63,255,255,255,255,255,52,63,48,0,63,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255, +255,243,67,255,243,0,3,255,255,255,255,243,204,204,102,102,102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63, +255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102, +102,102,108,204,195,255,255,255,52,63,255,255,255,255,48,47,255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243, +67,255,255,255,255,255,243,255,255,255,255,76,204,198,102,102,102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255, +255,255,243,204,204,102,102,102,102,102,102,204,204,195,255,243,255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102, +102,102,102,108,204,196,255,255,255,255,255,255,255,255,255,255,255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255, +255,255,255,255,255,255,255,255,255,244,204,204,102,102,102,102,102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255, +243,76,204,204,102,102,102,102,102,102,102,102,108,204,204,195,255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102, +102,102,102,102,102,204,204,204,67,255,255,255,255,255,255,52,204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204, +204,68,51,255,255,51,68,204,204,204,65,102,102,102,102,102,102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204, +204,193,17,22,102,102,102,102,102,102,102,102,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102, +102,102,102,97,17,17,102,102,204,204,204,204,204,204,204,204,102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102, +102,102,204,204,204,204,102,102,102,102,97,17,22,102,102,102,102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,17,22,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,95,1,0,0, -97,108,97,114,109,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71, -69,84,83,91,34,97,108,97,114,109,34,93,61,123,97,114,101,97,58,34,116,108,34,44,119,105,100,116,104,58,48,44, -100,114,97,119,58,170,40,41,123,163,40,175,46,119,105,100,116,104,41,103,46,114,101,115,101,116,40,41,46,100,114,97, -119,73,109,97,103,101,40,97,116,111,98,40,34,71,66,103,66,65,65,65,65,65,65,65,65,65,66,103,65,68,104,104, -119,68,68,119,119,71,80,56,89,71,102,43,89,77,102,43,77,77,47,47,77,77,47,47,77,65,47,47,65,65,47,47, -65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,66,47,47,103,68,47,47,119,68,47,47,119,65,65,65, -65,65,68,119,65,65,66,103,65,65,65,65,65,65,65,65,65,34,41,44,175,46,120,44,175,46,121,41,59,125,44,114, -101,108,111,97,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,119,105,100,116,104, -61,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115, -99,104,101,100,46,106,115,111,110,39,44,49,41,160,91,93,41,46,115,111,109,101,40,97,108,97,114,109,162,97,108,97, -114,109,46,111,110,158,40,97,108,97,114,109,46,104,105,100,100,101,110,141,181,41,41,63,50,52,58,48,59,125,125,59, -10,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,255,171,0,0,0, -97,108,97,114,109,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100, -34,58,34,97,108,97,114,109,34,44,34,110,97,109,101,34,58,34,65,108,97,114,109,115,34,44,34,115,114,99,34,58, -34,97,108,97,114,109,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,108,97,114,109,46,105,109,103, -34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,55,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44, -97,108,97,114,109,44,119,105,100,103,101,116,34,44,34,102,105,108,101,115,34,58,34,97,108,97,114,109,46,105,110,102, -111,44,97,108,97,114,109,46,97,112,112,46,106,115,44,97,108,97,114,109,46,105,109,103,44,97,108,97,114,109,46,119, -105,100,46,106,115,34,125,255, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,95,1,0,0,97,108,97,114,109,46,119,105,100,46,106,115, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93, +61,123,97,114,101,97,58,34,116,108,34,44,119,105,100,116,104,58,48,44,100,114,97,119,58,170,40,41,123,163,40,175, +46,119,105,100,116,104,41,103,46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40, +34,71,66,103,66,65,65,65,65,65,65,65,65,65,66,103,65,68,104,104,119,68,68,119,119,71,80,56,89,71,102,43, +89,77,102,43,77,77,47,47,77,77,47,47,77,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47, +65,65,47,47,65,66,47,47,103,68,47,47,119,68,47,47,119,65,65,65,65,65,68,119,65,65,66,103,65,65,65,65, +65,65,65,65,65,34,41,44,175,46,120,44,175,46,121,41,59,125,44,114,101,108,111,97,100,58,170,40,41,123,87,73, +68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,119,105,100,116,104,61,40,114,101,113,117,105,114,101,40,39,83, +116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49, +41,160,91,93,41,46,115,111,109,101,40,97,108,97,114,109,162,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109, +46,104,105,100,100,101,110,141,181,41,41,63,50,52,58,48,59,125,125,59,10,87,73,68,71,69,84,83,91,34,97,108, +97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,255,171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110, +97,109,101,34,58,34,65,108,97,114,109,115,34,44,34,115,114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106, +115,34,44,34,105,99,111,110,34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58, +34,48,46,51,49,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116, +34,44,34,102,105,108,101,115,34,58,34,97,108,97,114,109,46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46, +106,115,44,97,108,97,114,109,46,105,109,103,44,97,108,97,114,109,46,119,105,100,46,106,115,34,125,255, }; diff --git a/libs/banglejs/banglejs2_storage_default.c b/libs/banglejs/banglejs2_storage_default.c index 2c9d7c8dcf..33341f7a48 100644 --- a/libs/banglejs/banglejs2_storage_default.c +++ b/libs/banglejs/banglejs2_storage_default.c @@ -1,7 +1,7 @@ // Initial storage contents for Bangle.js 2.0 // Generated by BangleApps/bin/build_bangles_c.js -const int jsfStorageInitialContentLength = 83220; +const int jsfStorageInitialContentLength = 93140; const char jsfStorageInitialContents[] = { 48,0,0,0,46,98,111,111,116,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 10,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98, @@ -23,7 +23,7 @@ const char jsfStorageInitialContents[] = { 116,87,97,116,99,104,40,40,41,61,62,123,66,97,110,103,108,101,46,115,104,111,119,76,97,117,110,99,104,101,114,40, 41,59,125,44,32,103,108,111,98,97,108,46,66,84,78,50,124,124,66,84,78,44,32,123,114,101,112,101,97,116,58,102, 97,108,115,101,44,101,100,103,101,58,34,102,97,108,108,105,110,103,34,125,41,59,96,59,10,101,118,97,108,40,99,108, -111,99,107,65,112,112,41,59,10,190,99,108,111,99,107,65,112,112,59,255,18,31,0,0,98,111,111,116,117,112,100,97, +111,99,107,65,112,112,41,59,10,190,99,108,111,99,107,65,112,112,59,255,141,31,0,0,98,111,111,116,117,112,100,97, 116,101,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,69,46,115,104,111,119,77,101,115,115,97, 103,101,40,34,85,112,100,97,116,105,110,103,32,98,111,111,116,48,46,46,46,34,41,59,10,172,115,61,114,101,113,117, 105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103, @@ -263,2292 +263,2602 @@ const char jsfStorageInitialContents[] = { 40,39,46,98,111,111,116,48,39,44,34,47,47,34,43,98,111,111,116,70,105,108,101,43,34,92,110,34,44,102,105,108, 101,79,102,102,115,101,116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,43,98,111,111,116,70,105,108,101,46,108, 101,110,103,116,104,43,49,59,172,98,102,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114, -101,97,100,40,98,111,111,116,70,105,108,101,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41, -46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,102,44,102,105,108,101,79,102,102,115,101,116,41,59,102, -105,108,101,79,102,102,115,101,116,150,98,102,46,108,101,110,103,116,104,59,114,101,113,117,105,114,101,40,39,83,116,111, -114,97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,34,59,92,110,34,44,102,105,108,101, -79,102,102,115,101,116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,59,125,41,59,114,101,113,117,105,114,101,40, -39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,111,111,116,80,111, -115,116,44,102,105,108,101,79,102,102,115,101,116,41,59,190,98,111,111,116,59,190,98,111,111,116,80,111,115,116,59,190, -98,111,111,116,70,105,108,101,115,59,190,102,105,108,101,83,105,122,101,59,190,102,105,108,101,79,102,102,115,101,116,59, -69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,82,101,108,111,97,100,105,110,103,46,46,46,34,41,59,101,118, -97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,46,98,111,111, -116,48,39,41,41,59,255,255,157,0,0,0,98,111,111,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,98,111,111,116,34,44,34,110,97,109,101,34,58,34,66,111,111, -116,108,111,97,100,101,114,34,44,34,116,121,112,101,34,58,34,98,111,111,116,108,111,97,100,101,114,34,44,34,115,111, -114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,55,34,44,34,116, -97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,98,111,111,116, -46,105,110,102,111,44,46,98,111,111,116,48,44,46,98,111,111,116,99,100,101,44,98,111,111,116,117,112,100,97,116,101, -46,106,115,34,125,255,255,255,164,6,0,0,108,97,117,110,99,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172, -115,99,97,108,101,118,97,108,61,49,59,10,172,118,101,99,116,111,114,118,97,108,61,50,48,59,10,172,102,111,110,116, -61,103,46,103,101,116,70,111,110,116,115,40,41,46,105,110,99,108,117,100,101,115,40,34,49,50,120,50,48,34,41,63, -34,49,50,120,50,48,34,58,34,54,120,56,58,50,34,59,10,173,115,101,116,116,105,110,103,115,61,79,98,106,101,99, -116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,125,44,115,46,114,101,97,100,74,83, -79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,10,163,40,34,118,101,99,116, -111,114,115,105,122,101,34,185,115,101,116,116,105,110,103,115,41,123,118,101,99,116,111,114,118,97,108,61,112,97,114,115, -101,73,110,116,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122,101,41,59,125,10,163,40,34,102, -111,110,116,34,185,115,101,116,116,105,110,103,115,41,123,163,40,115,101,116,116,105,110,103,115,46,102,111,110,116,138,34, -86,101,99,116,111,114,34,41,123,115,99,97,108,101,118,97,108,61,118,101,99,116,111,114,118,97,108,47,50,48,59,102, -111,110,116,61,34,86,101,99,116,111,114,34,43,40,118,101,99,116,111,114,118,97,108,41,46,116,111,83,116,114,105,110, -103,40,41,59,125,164,123,102,111,110,116,61,115,101,116,116,105,110,103,115,46,102,111,110,116,59,115,99,97,108,101,118, -97,108,61,40,102,111,110,116,46,115,112,108,105,116,40,34,120,34,41,91,49,93,41,47,50,48,59,125,125,10,172,97, -112,112,115,61,115,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,46,109,97,112,40,97,112,112,162,123,172, -97,61,115,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,97,158,123,110,97,109,101,58,97,46,110, -97,109,101,44,116,121,112,101,58,97,46,116,121,112,101,44,105,99,111,110,58,97,46,105,99,111,110,44,115,111,114,116, -111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,44,115,114,99,58,97,46,115,114,99,125,59,125,41,46, -102,105,108,116,101,114,40,97,112,112,162,97,112,112,158,40,97,112,112,46,116,121,112,101,138,34,97,112,112,34,160,40, -97,112,112,46,116,121,112,101,138,34,99,108,111,99,107,34,158,115,101,116,116,105,110,103,115,46,115,104,111,119,67,108, -111,99,107,115,41,160,33,97,112,112,46,116,121,112,101,41,41,59,10,97,112,112,115,46,115,111,114,116,40,40,97,44, -98,41,162,123,172,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111,114,116, -111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41,171,45, -49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,59,10,97,112,112,115, -46,102,111,114,69,97,99,104,40,97,112,112,162,123,163,40,97,112,112,46,105,99,111,110,41,97,112,112,46,105,99,111, -110,61,115,46,114,101,97,100,40,97,112,112,46,105,99,111,110,41,59,125,41,59,10,163,40,103,46,119,114,97,112,83, -116,114,105,110,103,41,123,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,59,97,112,112,115,46,102,111,114,69, -97,99,104,40,97,112,112,162,97,112,112,46,110,97,109,101,61,103,46,119,114,97,112,83,116,114,105,110,103,40,97,112, -112,46,110,97,109,101,44,103,46,103,101,116,87,105,100,116,104,40,41,45,54,52,41,46,106,111,105,110,40,34,92,110, -34,41,41,59,125,10,170,100,114,97,119,65,112,112,40,105,44,114,41,123,172,97,112,112,61,97,112,112,115,91,105,93, -59,163,40,33,97,112,112,41,171,59,103,46,99,108,101,97,114,82,101,99,116,40,40,114,46,120,41,44,40,114,46,121, -41,44,40,114,46,120,43,114,46,119,45,49,41,44,40,114,46,121,43,114,46,104,45,49,41,41,59,103,46,115,101,116, -70,111,110,116,40,102,111,110,116,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,48,41,46,100,114, -97,119,83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,54,52,42,115,99,97,108,101,118,97,108,44,114,46, -121,43,40,51,50,42,115,99,97,108,101,118,97,108,41,41,59,163,40,97,112,112,46,105,99,111,110,41,177,123,103,46, -100,114,97,119,73,109,97,103,101,40,97,112,112,46,105,99,111,110,44,56,42,115,99,97,108,101,118,97,108,44,114,46, -121,43,40,56,42,115,99,97,108,101,118,97,108,41,44,123,115,99,97,108,101,58,115,99,97,108,101,118,97,108,125,41, -59,125,99,97,116,99,104,40,101,41,123,125,125,10,103,46,99,108,101,97,114,40,41,59,10,66,97,110,103,108,101,46, -108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, -115,40,41,59,10,69,46,115,104,111,119,83,99,114,111,108,108,101,114,40,123,104,58,54,52,42,115,99,97,108,101,118, -97,108,44,99,58,97,112,112,115,46,108,101,110,103,116,104,44,100,114,97,119,58,100,114,97,119,65,112,112,44,115,101, -108,101,99,116,58,105,162,123,172,97,112,112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,163,40, -33,97,112,112,46,115,114,99,160,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100, -40,97,112,112,46,115,114,99,41,139,183,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,65,112,112,32, -83,111,117,114,99,101,92,110,78,111,116,32,102,111,117,110,100,34,41,59,115,101,116,84,105,109,101,111,117,116,40,100, -114,97,119,77,101,110,117,44,50,48,48,48,41,59,125,164,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34, -76,111,97,100,105,110,103,46,46,46,34,41,59,108,111,97,100,40,97,112,112,46,115,114,99,41,59,125,125,125,41,59, -10,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,41,123,115,101,116,87, -97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,44,123,101,100,103,101,58,34,102,97,108,108,105,110, -103,34,125,41,59,125,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,181,41,59,10,172,108,111,99, -107,84,105,109,101,111,117,116,59,10,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,108,111,99,107,101, -100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108,111, -99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107,101, -100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100,40, -41,44,49,48,48,48,48,41,59,125,41,59,180,2,0,0,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46, -106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,79, -98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,125,44,114,101,113,117, -105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46, -106,115,111,110,34,44,180,41,160,123,125,41,59,173,102,111,110,116,115,61,103,46,103,101,116,70,111,110,116,115,40,41, -59,170,115,97,118,101,40,107,101,121,44,118,97,108,117,101,41,123,115,101,116,116,105,110,103,115,91,107,101,121,93,61, -118,97,108,117,101,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34, -108,97,117,110,99,104,46,106,115,111,110,34,44,115,101,116,116,105,110,103,115,41,59,125,174,97,112,112,77,101,110,117, -61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,76,97,117,110,99,104,101,114,32,83,101,116,116,105,110,103,115, -34,125,44,34,60,32,66,97,99,107,34,58,98,97,99,107,44,34,70,111,110,116,34,58,123,118,97,108,117,101,58,102, -111,110,116,115,46,105,110,99,108,117,100,101,115,40,115,101,116,116,105,110,103,115,46,102,111,110,116,41,63,102,111,110, -116,115,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,102,111,110,116,41,58,102,111,110,116,115,46, -105,110,100,101,120,79,102,40,34,49,50,120,50,48,34,41,44,109,105,110,58,48,44,109,97,120,58,102,111,110,116,115, -46,108,101,110,103,116,104,45,49,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,40,109,41,162,123,115,97,118,101,40,34,102,111,110,116,34,44,102,111,110,116,115,91,109,93,41,125,44,102,111,114, -109,97,116,58,118,162,102,111,110,116,115,91,118,93,125,44,34,86,101,99,116,111,114,32,102,111,110,116,32,115,105,122, -101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122,101,160,49,48, -44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110,99, -104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115,105,122,101,34,44,109,41,125, -125,44,34,83,104,111,119,32,99,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46, -115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58,34,78, -111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115,104,111,119,67,108,111,99,107, -115,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117,40,97,112,112,77,101,110,117,41,59,125,41,59, -210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34,110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34, -44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34,44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97, -112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34, -58,34,48,46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110, -99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108,97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99, -104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97, -116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110,34,125,255,255,163,52,0,0,97,110,116,111,110,99,108,107, -46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,10,174,83,69,84,84,73,78,71,83,70,73, -76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,59,10,71,114,97,112,104,105,99,115,46,112,114,111, -116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110,116,111,110,61,170,40,115,99,97,108,101,41,123,103,46,115, -101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111,98,40,34,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65, -65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65, -65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65, -65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103, -65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65, -65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47, -103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,103,65,65,65,65,65,65,65,65,65,65, -65,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,72,47,47,103,65,65,65, -65,65,65,65,65,66,47,47,47,103,65,65,65,65,65,65,65,65,102,47,47,47,103,65,65,65,65,65,65,65,80,47, -47,47,47,103,65,65,65,65,65,65,68,47,47,47,47,47,103,65,65,65,65,65,65,47,47,47,47,47,47,103,65,65, -65,65,65,80,47,47,47,47,47,47,103,65,65,65,65,72,47,47,47,47,47,47,47,103,65,65,65,66,47,47,47,47, -47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47,47,103,65,65,80,47,47,47,47,47,47,47,47,47,103,65, -68,47,47,47,47,47,47,47,47,47,47,65,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47,47,47,47,47,47, -47,47,47,52,65,65,65,47,47,47,47,47,47,47,47,43,65,65,65,65,47,47,47,47,47,47,47,47,103,65,65,65, -65,47,47,47,47,47,47,47,119,65,65,65,65,65,47,47,47,47,47,47,56,65,65,65,65,65,65,47,47,47,47,47, -47,65,65,65,65,65,65,65,47,47,47,47,47,103,65,65,65,65,65,65,65,47,47,47,47,52,65,65,65,65,65,65, -65,65,47,47,47,43,65,65,65,65,65,65,65,65,65,47,47,47,103,65,65,65,65,65,65,65,65,65,47,47,119,65, -65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,65,65,65,47,65,65,65,65,65,65,65,65,65, -65,65,65,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,65,65,65,65,65,66,47,47,47,47,47,47,47, -56,65,65,65,65,72,47,47,47,47,47,47,47,47,65,65,65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,47, -47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,68,47,47,47,47,47,47,47, -47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80, -47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47, -47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65, -102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,56,65,65,65,65,65,66,47,47,52,65,47,47,119,65,65,65, -65,65,65,102,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52, -65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,119,65,65,65,65,65,65,102,47,52,65,47,47,47,47,47, -47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47, -119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,80,47,47,47, -47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47, -47,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,66,47,47, -47,47,47,47,47,47,47,56,65,65,65,47,47,47,47,47,47,47,47,47,52,65,65,65,80,47,47,47,47,47,47,47, -47,103,65,65,65,68,47,47,47,47,47,47,47,43,65,65,65,65,65,102,47,47,47,47,47,47,52,65,65,65,65,65, +101,97,100,40,98,111,111,116,70,105,108,101,41,59,172,98,102,108,101,110,61,98,102,46,108,101,110,103,116,104,59,172, +98,102,111,102,102,115,101,116,61,48,59,166,40,98,102,108,101,110,41,123,172,98,102,99,104,117,110,107,61,77,97,116, +104,46,109,105,110,40,98,102,108,101,110,44,50,48,52,56,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114,97, +103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,102,46,115,117,98,115,116,114,40,98,102, +111,102,102,115,101,116,44,98,102,99,104,117,110,107,41,44,102,105,108,101,79,102,102,115,101,116,41,59,102,105,108,101, +79,102,102,115,101,116,150,98,102,99,104,117,110,107,59,98,102,111,102,102,115,101,116,150,98,102,99,104,117,110,107,59, +98,102,108,101,110,151,98,102,99,104,117,110,107,59,125,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39, +41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,34,59,92,110,34,44,102,105,108,101,79,102,102,115,101, +116,41,59,102,105,108,101,79,102,102,115,101,116,150,50,59,125,41,59,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,119,114,105,116,101,40,39,46,98,111,111,116,48,39,44,98,111,111,116,80,111,115,116,44,102,105, +108,101,79,102,102,115,101,116,41,59,190,98,111,111,116,59,190,98,111,111,116,80,111,115,116,59,190,98,111,111,116,70, +105,108,101,115,59,190,102,105,108,101,83,105,122,101,59,190,102,105,108,101,79,102,102,115,101,116,59,69,46,115,104,111, +119,77,101,115,115,97,103,101,40,34,82,101,108,111,97,100,105,110,103,46,46,46,34,41,59,101,118,97,108,40,114,101, +113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,46,98,111,111,116,48,39,41,41, +59,255,255,255,157,0,0,0,98,111,111,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,98,111,111,116,34,44,34,110,97,109,101,34,58,34,66,111,111,116,108,111,97, +100,101,114,34,44,34,116,121,112,101,34,58,34,98,111,111,116,108,111,97,100,101,114,34,44,34,115,111,114,116,111,114, +100,101,114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,56,34,44,34,116,97,103,115,34, +58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,98,111,111,116,46,105,110,102, +111,44,46,98,111,111,116,48,44,46,98,111,111,116,99,100,101,44,98,111,111,116,117,112,100,97,116,101,46,106,115,34, +125,255,255,255,201,6,0,0,108,97,117,110,99,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172,115,99,97,108, +101,118,97,108,61,49,59,10,172,118,101,99,116,111,114,118,97,108,61,50,48,59,10,172,102,111,110,116,61,103,46,103, +101,116,70,111,110,116,115,40,41,46,105,110,99,108,117,100,101,115,40,34,49,50,120,50,48,34,41,63,34,49,50,120, +50,48,34,58,34,54,120,56,58,50,34,59,10,173,115,101,116,116,105,110,103,115,61,79,98,106,101,99,116,46,97,115, +115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102,117,108,108,115,99,114,101,101,110,58,181,125, +44,115,46,114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41, +59,10,163,40,34,118,101,99,116,111,114,115,105,122,101,34,185,115,101,116,116,105,110,103,115,41,123,118,101,99,116,111, +114,118,97,108,61,112,97,114,115,101,73,110,116,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,115,105,122, +101,41,59,125,10,163,40,34,102,111,110,116,34,185,115,101,116,116,105,110,103,115,41,123,163,40,115,101,116,116,105,110, +103,115,46,102,111,110,116,138,34,86,101,99,116,111,114,34,41,123,115,99,97,108,101,118,97,108,61,118,101,99,116,111, +114,118,97,108,47,50,48,59,102,111,110,116,61,34,86,101,99,116,111,114,34,43,40,118,101,99,116,111,114,118,97,108, +41,46,116,111,83,116,114,105,110,103,40,41,59,125,164,123,102,111,110,116,61,115,101,116,116,105,110,103,115,46,102,111, +110,116,59,115,99,97,108,101,118,97,108,61,40,102,111,110,116,46,115,112,108,105,116,40,34,120,34,41,91,49,93,41, +47,50,48,59,125,125,10,172,97,112,112,115,61,115,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,46,109, +97,112,40,97,112,112,162,123,172,97,61,115,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,97,158, +123,110,97,109,101,58,97,46,110,97,109,101,44,116,121,112,101,58,97,46,116,121,112,101,44,105,99,111,110,58,97,46, +105,99,111,110,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,44,115,114,99,58,97, +46,115,114,99,125,59,125,41,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,158,40,97,112,112,46,116,121,112, +101,138,34,97,112,112,34,160,40,97,112,112,46,116,121,112,101,138,34,99,108,111,99,107,34,158,115,101,116,116,105,110, +103,115,46,115,104,111,119,67,108,111,99,107,115,41,160,33,97,112,112,46,116,121,112,101,41,41,59,10,97,112,112,115, +46,115,111,114,116,40,40,97,44,98,41,162,123,172,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45, +40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60, +98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48, +59,125,41,59,10,97,112,112,115,46,102,111,114,69,97,99,104,40,97,112,112,162,123,163,40,97,112,112,46,105,99,111, +110,41,97,112,112,46,105,99,111,110,61,115,46,114,101,97,100,40,97,112,112,46,105,99,111,110,41,59,125,41,59,10, +163,40,103,46,119,114,97,112,83,116,114,105,110,103,41,123,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,59, +97,112,112,115,46,102,111,114,69,97,99,104,40,97,112,112,162,97,112,112,46,110,97,109,101,61,103,46,119,114,97,112, +83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,103,46,103,101,116,87,105,100,116,104,40,41,45,54,52,41, +46,106,111,105,110,40,34,92,110,34,41,41,59,125,10,170,100,114,97,119,65,112,112,40,105,44,114,41,123,172,97,112, +112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,103,46,99,108,101,97,114,82,101,99,116,40,40, +114,46,120,41,44,40,114,46,121,41,44,40,114,46,120,43,114,46,119,45,49,41,44,40,114,46,121,43,114,46,104,45, +49,41,41,59,103,46,115,101,116,70,111,110,116,40,102,111,110,116,41,46,115,101,116,70,111,110,116,65,108,105,103,110, +40,45,49,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,97,112,112,46,110,97,109,101,44,54,52,42,115,99, +97,108,101,118,97,108,44,114,46,121,43,40,51,50,42,115,99,97,108,101,118,97,108,41,41,59,163,40,97,112,112,46, +105,99,111,110,41,177,123,103,46,100,114,97,119,73,109,97,103,101,40,97,112,112,46,105,99,111,110,44,56,42,115,99, +97,108,101,118,97,108,44,114,46,121,43,40,56,42,115,99,97,108,101,118,97,108,41,44,123,115,99,97,108,101,58,115, +99,97,108,101,118,97,108,125,41,59,125,99,97,116,99,104,40,101,41,123,125,125,10,103,46,99,108,101,97,114,40,41, +59,10,163,40,33,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,41,123,66,97,110,103,108,101, +46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, +115,40,41,59,125,10,69,46,115,104,111,119,83,99,114,111,108,108,101,114,40,123,104,58,54,52,42,115,99,97,108,101, +118,97,108,44,99,58,97,112,112,115,46,108,101,110,103,116,104,44,100,114,97,119,58,100,114,97,119,65,112,112,44,115, +101,108,101,99,116,58,105,162,123,172,97,112,112,61,97,112,112,115,91,105,93,59,163,40,33,97,112,112,41,171,59,163, +40,33,97,112,112,46,115,114,99,160,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97, +100,40,97,112,112,46,115,114,99,41,139,183,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,65,112,112, +32,83,111,117,114,99,101,92,110,78,111,116,32,102,111,117,110,100,34,41,59,115,101,116,84,105,109,101,111,117,116,40, +100,114,97,119,77,101,110,117,44,50,48,48,48,41,59,125,164,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40, +34,76,111,97,100,105,110,103,46,46,46,34,41,59,108,111,97,100,40,97,112,112,46,115,114,99,41,59,125,125,125,41, +59,10,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,41,123,115,101,116, +87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,44,123,101,100,103,101,58,34,102,97,108,108,105, +110,103,34,125,41,59,125,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,181,41,59,10,172,108,111, +99,107,84,105,109,101,111,117,116,59,10,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,108,111,99,107, +101,100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108, +111,99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107, +101,100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100, +40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,29,3,0,0,108,97,117,110,99,104,46,115,101,116,116,105, +110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, +103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102, +117,108,108,115,99,114,101,101,110,58,181,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, +114,101,97,100,74,83,79,78,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,173,102, +111,110,116,115,61,103,46,103,101,116,70,111,110,116,115,40,41,59,170,115,97,118,101,40,107,101,121,44,118,97,108,117, +101,41,123,115,101,116,116,105,110,103,115,91,107,101,121,93,61,118,97,108,117,101,59,114,101,113,117,105,114,101,40,34, +83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,108,97,117,110,99,104,46,106,115,111,110,34,44,115,101, +116,116,105,110,103,115,41,59,125,174,97,112,112,77,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34, +76,97,117,110,99,104,101,114,34,125,44,34,60,32,66,97,99,107,34,58,98,97,99,107,44,34,70,111,110,116,34,58, +123,118,97,108,117,101,58,102,111,110,116,115,46,105,110,99,108,117,100,101,115,40,115,101,116,116,105,110,103,115,46,102, +111,110,116,41,63,102,111,110,116,115,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,102,111,110,116, +41,58,102,111,110,116,115,46,105,110,100,101,120,79,102,40,34,49,50,120,50,48,34,41,44,109,105,110,58,48,44,109, +97,120,58,102,111,110,116,115,46,108,101,110,103,116,104,45,49,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44, +111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,102,111,110,116,34,44,102,111,110,116,115,91, +109,93,41,125,44,102,111,114,109,97,116,58,118,162,102,111,110,116,115,91,118,93,125,44,34,86,101,99,116,111,114,32, +70,111,110,116,32,83,105,122,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,101,99,116,111, +114,115,105,122,101,160,49,48,44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114, +97,112,58,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115, +105,122,101,34,44,109,41,125,125,44,34,83,104,111,119,32,67,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115, +101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63, +34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115, +104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115,99,114,101,101,110,34,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,138,180,44,102,111,114,109,97,116, +58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97, +118,101,40,34,102,117,108,108,115,99,114,101,101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117, +40,97,112,112,77,101,110,117,41,59,125,41,59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34, +110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34, +44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101, +114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,51,34,44,34,116,97,103,115,34,58,34, +116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108, +97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46, +115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110, +34,125,255,255,163,52,0,0,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0, +0,0,0,0,10,174,83,69,84,84,73,78,71,83,70,73,76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111, +110,34,59,10,71,114,97,112,104,105,99,115,46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110, +116,111,110,61,170,40,115,99,97,108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111, +98,40,34,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102, +47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65, +65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65, +102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65, +65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65, +65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,65, -102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,65,65,65,65, -65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65, -66,47,56,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47, -47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103, +65,65,65,65,68,103,65,65,65,65,65,65,65,65,65,65,65,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103, +65,65,65,65,65,65,65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66,47,47,47,103,65,65,65,65,65,65, +65,65,102,47,47,47,103,65,65,65,65,65,65,65,80,47,47,47,47,103,65,65,65,65,65,65,68,47,47,47,47,47, +103,65,65,65,65,65,65,47,47,47,47,47,47,103,65,65,65,65,65,80,47,47,47,47,47,47,103,65,65,65,65,72, +47,47,47,47,47,47,47,103,65,65,65,66,47,47,47,47,47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47, +47,103,65,65,80,47,47,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,47,47,47,47,65,65,47,47,47, +47,47,47,47,47,47,47,103,65,65,47,47,47,47,47,47,47,47,47,52,65,65,65,47,47,47,47,47,47,47,47,43, +65,65,65,65,47,47,47,47,47,47,47,47,103,65,65,65,65,47,47,47,47,47,47,47,119,65,65,65,65,65,47,47, +47,47,47,47,56,65,65,65,65,65,65,47,47,47,47,47,47,65,65,65,65,65,65,65,47,47,47,47,47,103,65,65, +65,65,65,65,65,47,47,47,47,52,65,65,65,65,65,65,65,65,47,47,47,43,65,65,65,65,65,65,65,65,65,47, +47,47,103,65,65,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65, +65,65,65,65,65,65,47,65,65,65,65,65,65,65,65,65,65,65,65,103,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47, +47,47,47,65,65,65,65,65,66,47,47,47,47,47,47,47,56,65,65,65,65,72,47,47,47,47,47,47,47,47,65,65, +65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47, +47,47,47,47,47,56,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47, +65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47, +47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, +47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,56, +65,65,65,65,65,66,47,47,52,65,47,47,119,65,65,65,65,65,65,102,47,52,65,47,47,103,65,65,65,65,65,65, +80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47, +119,65,65,65,65,65,65,102,47,52,65,47,47,47,47,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, +47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102, +47,47,47,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47, +47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65, +68,47,47,47,47,47,47,47,47,47,43,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,65,47,47,47,47,47, +47,47,47,47,52,65,65,65,80,47,47,47,47,47,47,47,47,103,65,65,65,68,47,47,47,47,47,47,47,43,65,65, +65,65,65,102,47,47,47,47,47,47,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65, +65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103, +65,65,65,65,65,65,65,65,65,65,102,47,65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65, +65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,66,47,56,65,65,65,65,65,65,65,65,65,65,68,47,47, +47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47, +47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47, +47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47, +47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47, +47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47, +47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,52,65,65,65,65,66,47,103, +65,65,68,47,47,52,65,65,65,65,102,47,103,65,65,80,47,47,52,65,65,65,66,47,47,103,65,65,47,47,47,52, +65,65,65,72,47,47,103,65,66,47,47,47,52,65,65,65,102,47,47,103,65,68,47,47,47,52,65,65,65,47,47,47, +103,65,72,47,47,47,52,65,65,68,47,47,47,103,65,80,47,47,47,52,65,65,72,47,47,47,103,65,80,47,47,47, +52,65,65,80,47,47,47,103,65,102,47,47,47,52,65,65,102,47,47,47,103,65,102,47,47,47,52,65,66,47,47,47, +47,103,65,102,47,47,47,52,65,68,47,47,47,47,103,65,47,47,47,47,52,65,72,47,47,47,47,103,65,47,47,47, +47,52,65,102,47,47,47,47,103,65,47,47,47,47,52,65,47,47,47,47,47,103,65,47,47,119,65,65,66,47,47,47, +47,47,103,65,47,47,103,65,65,72,47,47,47,47,47,103,65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47, +103,65,65,47,47,47,56,47,47,103,65,47,47,103,65,68,47,47,47,119,47,47,103,65,47,47,119,65,47,47,47,47, +103,47,47,103,65,47,47,47,47,47,47,47,47,65,47,47,103,65,47,47,47,47,47,47,47,56,65,47,47,103,65,47, +47,47,47,47,47,47,52,65,47,47,103,65,102,47,47,47,47,47,47,119,65,47,47,103,65,102,47,47,47,47,47,47, +103,65,47,47,103,65,102,47,47,47,47,47,43,65,65,47,47,103,65,80,47,47,47,47,47,56,65,65,47,47,103,65, +80,47,47,47,47,47,52,65,65,47,47,103,65,72,47,47,47,47,47,103,65,65,47,47,103,65,68,47,47,47,47,47, +65,65,65,47,47,103,65,66,47,47,47,47,56,65,65,65,47,47,103,65,65,47,47,47,47,119,65,65,65,47,47,103, +65,65,80,47,47,47,65,65,65,65,47,47,103,65,65,68,47,47,56,65,65,65,65,47,47,103,65,65,65,80,43,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,66,47,43,65,65,65,65,65,68,47,119,65,65,66,47,47,56,65,65,65,65,80,47,119, +65,65,66,47,47,47,65,65,65,65,47,47,119,65,65,66,47,47,47,119,65,65,66,47,47,119,65,65,66,47,47,47, +52,65,65,68,47,47,119,65,65,66,47,47,47,56,65,65,72,47,47,119,65,65,66,47,47,47,43,65,65,80,47,47, +119,65,65,66,47,47,47,43,65,65,80,47,47,119,65,65,66,47,47,47,47,65,65,102,47,47,119,65,65,66,47,47, +47,47,65,65,102,47,47,119,65,65,66,47,47,47,47,103,65,102,47,47,119,65,65,66,47,47,47,47,103,65,47,47, +47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,47,47,65,65, +102,47,47,119,65,47,47,52,65,47,47,65,65,65,47,47,119,65,47,47,103,65,47,47,65,65,65,102,47,119,65,47, +47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,68,47,47,119, +65,65,47,47,119,65,47,47,119,72,47,47,56,65,66,47,47,119,65,47,47,47,47,47,47,47,47,47,47,47,103,65, +47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47, +47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,65,65,102,47,47,47,47,47,47,47,47,47,47,65, +65,80,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47, +47,47,47,47,47,56,65,65,72,47,47,47,43,47,47,47,47,47,52,65,65,68,47,47,47,43,102,47,47,47,47,119, +65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,65,102,47,47,52,72,47,47,47,43,65,65,65,65,72,47,47, +103,66,47,47,47,119,65,65,65,65,65,80,52,65,65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65, +65,65,65,65,47,47,119,65,65,65,65,65,65,65,65,65,80,47,47,119,65,65,65,65,65,65,65,65,66,47,47,47, +119,65,65,65,65,65,65,65,65,102,47,47,47,119,65,65,65,65,65,65,65,72,47,47,47,47,119,65,65,65,65,65, +65,65,47,47,47,47,47,119,65,65,65,65,65,65,80,47,47,47,47,47,119,65,65,65,65,65,66,47,47,47,47,47, +47,119,65,65,65,65,65,102,47,47,47,47,47,47,119,65,65,65,65,72,47,47,47,47,47,47,47,119,65,65,65,65, +47,47,47,47,47,47,47,47,119,65,65,65,80,47,47,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47, +72,47,119,65,65,65,47,47,47,47,47,47,119,72,47,119,65,65,65,47,47,47,47,47,56,65,72,47,119,65,65,65, +47,47,47,47,47,65,65,72,47,119,65,65,65,47,47,47,47,103,65,65,72,47,119,65,65,65,47,47,47,52,65,65, +65,72,47,119,65,65,65,47,47,43,65,65,65,65,72,47,119,65,65,65,47,47,47,47,47,47,47,47,47,47,47,103, 65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47, 47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47, 103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47, 47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47, -47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47, +47,47,47,47,47,47,47,47,103,65,65,65,65,65,65,65,65,72,47,52,65,65,65,65,65,65,65,65,65,65,72,47, +119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,72,47,52,65,65,65,65,66,47,103,65,65,68,47,47,52,65,65,65,65,102,47,103,65,65,80, -47,47,52,65,65,65,66,47,47,103,65,65,47,47,47,52,65,65,65,72,47,47,103,65,66,47,47,47,52,65,65,65, -102,47,47,103,65,68,47,47,47,52,65,65,65,47,47,47,103,65,72,47,47,47,52,65,65,68,47,47,47,103,65,80, -47,47,47,52,65,65,72,47,47,47,103,65,80,47,47,47,52,65,65,80,47,47,47,103,65,102,47,47,47,52,65,65, -102,47,47,47,103,65,102,47,47,47,52,65,66,47,47,47,47,103,65,102,47,47,47,52,65,68,47,47,47,47,103,65, -47,47,47,47,52,65,72,47,47,47,47,103,65,47,47,47,47,52,65,102,47,47,47,47,103,65,47,47,47,47,52,65, -47,47,47,47,47,103,65,47,47,119,65,65,66,47,47,47,47,47,103,65,47,47,103,65,65,72,47,47,47,47,47,103, -65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47,103,65,65,47,47,47,56,47,47,103,65,47,47,103,65,68, -47,47,47,119,47,47,103,65,47,47,119,65,47,47,47,47,103,47,47,103,65,47,47,47,47,47,47,47,47,65,47,47, -103,65,47,47,47,47,47,47,47,56,65,47,47,103,65,47,47,47,47,47,47,47,52,65,47,47,103,65,102,47,47,47, -47,47,47,119,65,47,47,103,65,102,47,47,47,47,47,47,103,65,47,47,103,65,102,47,47,47,47,47,43,65,65,47, -47,103,65,80,47,47,47,47,47,56,65,65,47,47,103,65,80,47,47,47,47,47,52,65,65,47,47,103,65,72,47,47, -47,47,47,103,65,65,47,47,103,65,68,47,47,47,47,47,65,65,65,47,47,103,65,66,47,47,47,47,56,65,65,65, -47,47,103,65,65,47,47,47,47,119,65,65,65,47,47,103,65,65,80,47,47,47,65,65,65,65,47,47,103,65,65,68, -47,47,56,65,65,65,65,47,47,103,65,65,65,80,43,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,66,47,43,65,65,65,65,65, -68,47,119,65,65,66,47,47,56,65,65,65,65,80,47,119,65,65,66,47,47,47,65,65,65,65,47,47,119,65,65,66, -47,47,47,119,65,65,66,47,47,119,65,65,66,47,47,47,52,65,65,68,47,47,119,65,65,66,47,47,47,56,65,65, -72,47,47,119,65,65,66,47,47,47,43,65,65,80,47,47,119,65,65,66,47,47,47,43,65,65,80,47,47,119,65,65, -66,47,47,47,47,65,65,102,47,47,119,65,65,66,47,47,47,47,65,65,102,47,47,119,65,65,66,47,47,47,47,103, -65,102,47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,65, -65,66,47,47,47,47,103,65,47,47,47,119,47,47,65,65,102,47,47,119,65,47,47,52,65,47,47,65,65,65,47,47, -119,65,47,47,103,65,47,47,65,65,65,102,47,119,65,47,47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,66, -47,47,103,65,65,102,47,119,65,47,47,103,68,47,47,119,65,65,47,47,119,65,47,47,119,72,47,47,56,65,66,47, -47,119,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47, -47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47, -47,47,65,65,102,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47,65,65,80,47, -47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,56,65,65,72,47,47,47,43,47,47,47, -47,47,52,65,65,68,47,47,47,43,102,47,47,47,47,119,65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,65, -102,47,47,52,72,47,47,47,43,65,65,65,65,72,47,47,103,66,47,47,47,119,65,65,65,65,65,80,52,65,65,72, -47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65,65,65,65,65, -80,47,47,119,65,65,65,65,65,65,65,65,66,47,47,47,119,65,65,65,65,65,65,65,65,102,47,47,47,119,65,65, -65,65,65,65,65,72,47,47,47,47,119,65,65,65,65,65,65,65,47,47,47,47,47,119,65,65,65,65,65,65,80,47, -47,47,47,47,119,65,65,65,65,65,66,47,47,47,47,47,47,119,65,65,65,65,65,102,47,47,47,47,47,47,119,65, -65,65,65,72,47,47,47,47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47,47,119,65,65,65,80,47,47,47, -47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47,72,47,119,65,65,65,47,47,47,47,47,47,119,72,47,119, -65,65,65,47,47,47,47,47,56,65,72,47,119,65,65,65,47,47,47,47,47,65,65,72,47,119,65,65,65,47,47,47, -47,103,65,65,72,47,119,65,65,65,47,47,47,52,65,65,65,72,47,119,65,65,65,47,47,43,65,65,65,65,72,47, -119,65,65,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47, -47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47, -47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47, -47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47, -47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65, -47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,65,65,65,65,65,65, -65,72,47,52,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65, -65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,66,47,47,56,65, -65,65,47,47,47,47,47,43,66,47,47,47,65,65,65,47,47,47,47,47,43,66,47,47,47,119,65,65,47,47,47,47, -47,43,66,47,47,47,52,65,65,47,47,47,47,47,43,66,47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47, -56,65,65,47,47,47,47,47,43,66,47,47,47,43,65,65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47, -47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47, -47,47,103,65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47, -47,47,47,43,65,47,47,47,47,103,65,47,47,103,80,47,103,65,65,66,47,47,119,65,47,47,103,102,47,65,65,65, -65,47,47,119,65,47,47,103,102,47,65,65,65,65,102,47,119,65,47,47,103,47,47,65,65,65,65,102,47,119,65,47, -47,103,47,47,65,65,65,65,47,47,119,65,47,47,103,47,47,103,65,65,65,47,47,119,65,47,47,103,47,47,43,65, -65,80,47,47,119,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65, -47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47, -47,47,47,47,47,65,65,47,47,103,102,47,47,47,47,47,47,47,65,65,47,47,103,102,47,47,47,47,47,47,43,65, -65,47,47,103,80,47,47,47,47,47,47,43,65,65,47,47,103,72,47,47,47,47,47,47,56,65,65,47,47,103,68,47, -47,47,47,47,47,52,65,65,47,47,103,66,47,47,47,47,47,47,119,65,65,47,47,103,65,47,47,47,47,47,47,65, -65,65,65,65,65,65,72,47,47,47,47,56,65,65,65,65,65,65,65,65,47,47,47,47,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,66,47,47,56,65,65,65,47,47,47,47,47,43,66,47,47,47,65,65,65,47, +47,47,47,47,43,66,47,47,47,119,65,65,47,47,47,47,47,43,66,47,47,47,52,65,65,47,47,47,47,47,43,66, +47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47,43,65,65, +47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43, +66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,66,47,47,47,47,103, +65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,65,47,47,47,47,103,65,47,47,103,80,47, +103,65,65,66,47,47,119,65,47,47,103,102,47,65,65,65,65,47,47,119,65,47,47,103,102,47,65,65,65,65,102,47, +119,65,47,47,103,47,47,65,65,65,65,102,47,119,65,47,47,103,47,47,65,65,65,65,47,47,119,65,47,47,103,47, +47,103,65,65,65,47,47,119,65,47,47,103,47,47,43,65,65,80,47,47,119,65,47,47,103,47,47,47,47,47,47,47, +47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103, +47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,65,65,47,47,103,102,47,47,47,47,47, +47,47,65,65,47,47,103,102,47,47,47,47,47,47,43,65,65,47,47,103,80,47,47,47,47,47,47,43,65,65,47,47, +103,72,47,47,47,47,47,47,56,65,65,47,47,103,68,47,47,47,47,47,47,52,65,65,47,47,103,66,47,47,47,47, +47,47,119,65,65,47,47,103,65,47,47,47,47,47,47,65,65,65,65,65,65,65,72,47,47,47,47,56,65,65,65,65, +65,65,65,65,47,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,103,65,65,65,65,66,47, -47,47,47,47,47,47,43,65,65,65,65,72,47,47,47,47,47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47, -47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,72,47, -47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47, -47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102, -47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47, -47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,52,65,47,47,119,65,68,47,52,65,65,102,47,52,65, -47,47,103,65,72,47,119,65,65,80,47,52,65,47,47,103,65,72,47,119,65,65,80,47,52,65,47,47,103,65,80,47, -119,65,65,80,47,52,65,47,47,103,65,80,47,52,65,65,102,47,52,65,47,47,119,65,80,47,43,65,68,47,47,52, -65,47,47,47,119,80,47,47,47,47,47,47,52,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80, -47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47, -119,65,80,47,47,52,80,47,47,47,47,47,47,103,65,80,47,47,52,72,47,47,47,47,47,47,103,65,72,47,47,52, -72,47,47,47,47,47,47,65,65,72,47,47,52,68,47,47,47,47,47,43,65,65,68,47,47,52,68,47,47,47,47,47, -56,65,65,66,47,47,52,66,47,47,47,47,47,52,65,65,65,47,47,52,65,47,47,47,47,47,119,65,65,65,80,47, -52,65,80,47,47,47,47,65,65,65,65,66,47,52,65,68,47,47,47,52,65,65,65,65,65,65,65,65,65,72,47,56, +65,65,68,47,47,47,47,47,47,103,65,65,65,65,66,47,47,47,47,47,47,47,43,65,65,65,65,72,47,47,47,47, +47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65, +65,68,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47, +47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47, +103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47, +47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, +47,52,65,47,47,119,65,68,47,52,65,65,102,47,52,65,47,47,103,65,72,47,119,65,65,80,47,52,65,47,47,103, +65,72,47,119,65,65,80,47,52,65,47,47,103,65,80,47,119,65,65,80,47,52,65,47,47,103,65,80,47,52,65,65, +102,47,52,65,47,47,119,65,80,47,43,65,68,47,47,52,65,47,47,47,119,80,47,47,47,47,47,47,52,65,102,47, +47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47, +47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,80,47,47,52,80,47,47,47,47,47,47,103,65,80, +47,47,52,72,47,47,47,47,47,47,103,65,72,47,47,52,72,47,47,47,47,47,47,65,65,72,47,47,52,68,47,47, +47,47,47,43,65,65,68,47,47,52,68,47,47,47,47,47,56,65,65,66,47,47,52,66,47,47,47,47,47,52,65,65, +65,47,47,52,65,47,47,47,47,47,119,65,65,65,80,47,52,65,80,47,47,47,47,65,65,65,65,66,47,52,65,68, +47,47,47,52,65,65,65,65,65,65,65,65,65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65, +65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65, +65,65,47,47,103,65,65,65,65,65,65,65,68,103,65,47,47,103,65,65,65,65,65,65,80,47,103,65,47,47,103,65, +65,65,65,65,72,47,47,103,65,47,47,103,65,65,65,65,66,47,47,47,103,65,47,47,103,65,65,65,65,80,47,47, +47,103,65,47,47,103,65,65,65,68,47,47,47,47,103,65,47,47,103,65,65,65,102,47,47,47,47,103,65,47,47,103, +65,65,66,47,47,47,47,47,103,65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47,103,65,66,47,47,47,47, +47,47,103,65,47,47,103,65,72,47,47,47,47,47,47,103,65,47,47,103,65,47,47,47,47,47,47,47,103,65,47,47, +103,68,47,47,47,47,47,47,47,103,65,47,47,103,102,47,47,47,47,47,47,47,103,65,47,47,104,47,47,47,47,47, +47,47,47,103,65,47,47,110,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47, +47,47,47,47,47,47,47,47,65,65,65,65,47,47,47,47,47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47, +52,65,65,65,65,65,47,47,47,47,47,47,47,65,65,65,65,65,65,47,47,47,47,47,47,52,65,65,65,65,65,65, +47,47,47,47,47,47,65,65,65,65,65,65,65,47,47,47,47,47,52,65,65,65,65,65,65,65,47,47,47,47,47,65, +65,65,65,65,65,65,65,47,47,47,47,56,65,65,65,65,65,65,65,65,47,47,47,47,103,65,65,65,65,65,65,65, +65,47,47,47,43,65,65,65,65,65,65,65,65,65,47,47,47,52,65,65,65,65,65,65,65,65,65,47,47,47,65,65, +65,65,65,65,65,65,65,65,47,47,52,65,65,65,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65, -65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,68,103,65,47, -47,103,65,65,65,65,65,65,80,47,103,65,47,47,103,65,65,65,65,65,72,47,47,103,65,47,47,103,65,65,65,65, -66,47,47,47,103,65,47,47,103,65,65,65,65,80,47,47,47,103,65,47,47,103,65,65,65,68,47,47,47,47,103,65, -47,47,103,65,65,65,102,47,47,47,47,103,65,47,47,103,65,65,66,47,47,47,47,47,103,65,47,47,103,65,65,80, -47,47,47,47,47,103,65,47,47,103,65,66,47,47,47,47,47,47,103,65,47,47,103,65,72,47,47,47,47,47,47,103, -65,47,47,103,65,47,47,47,47,47,47,47,103,65,47,47,103,68,47,47,47,47,47,47,47,103,65,47,47,103,102,47, -47,47,47,47,47,47,103,65,47,47,104,47,47,47,47,47,47,47,47,103,65,47,47,110,47,47,47,47,47,47,47,47, -103,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47,47,47,47,47,47,47,47,47,65,65,65,65,47,47,47,47, -47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47,52,65,65,65,65,65,47,47,47,47,47,47,47,65,65,65, -65,65,65,47,47,47,47,47,47,52,65,65,65,65,65,65,47,47,47,47,47,47,65,65,65,65,65,65,65,47,47,47, -47,47,52,65,65,65,65,65,65,65,47,47,47,47,47,65,65,65,65,65,65,65,65,47,47,47,47,56,65,65,65,65, -65,65,65,65,47,47,47,47,103,65,65,65,65,65,65,65,65,47,47,47,43,65,65,65,65,65,65,65,65,65,47,47, -47,52,65,65,65,65,65,65,65,65,65,47,47,47,65,65,65,65,65,65,65,65,65,65,47,47,52,65,65,65,65,65, -65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,103,66,47,47,47,119, +65,65,65,65,80,47,47,52,72,47,47,47,43,65,65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,66,47,47, +47,43,102,47,47,47,47,52,65,65,68,47,47,47,43,47,47,47,47,47,56,65,65,72,47,47,47,47,47,47,47,47, +47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47, +47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47, +47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47, +47,47,47,47,47,47,47,47,47,47,119,65,47,47,52,68,47,47,119,65,66,47,47,52,65,47,47,119,66,47,47,103, +65,65,47,47,52,65,47,47,103,65,47,47,103,65,65,102,47,52,65,47,47,103,65,47,47,65,65,65,102,47,52,65, +47,47,103,65,47,47,103,65,65,102,47,52,65,47,47,119,66,47,47,103,65,65,47,47,52,65,47,47,47,80,47,47, +56,65,72,47,47,52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119, +65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47, +47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47, +65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47, +43,47,47,47,47,47,56,65,65,66,47,47,47,56,102,47,47,47,47,119,65,65,65,102,47,47,52,80,47,47,47,47, +65,65,65,65,72,47,47,119,68,47,47,47,56,65,65,65,65,65,47,43,65,65,102,47,47,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,68,47,47,103,66,47,47,47,119,65,65,65,65,80,47,47,52,72,47,47,47,43,65,65,65, -65,47,47,47,56,80,47,47,47,47,103,65,65,66,47,47,47,43,102,47,47,47,47,52,65,65,68,47,47,47,43,47, -47,47,47,47,56,65,65,72,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65, -65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47, -47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47, -119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,47,47,47,47,47,47,47,47,47,119,65,47,47,52,68, -47,47,119,65,66,47,47,52,65,47,47,119,66,47,47,103,65,65,47,47,52,65,47,47,103,65,47,47,103,65,65,102, -47,52,65,47,47,103,65,47,47,65,65,65,102,47,52,65,47,47,103,65,47,47,103,65,65,102,47,52,65,47,47,119, -66,47,47,103,65,65,47,47,52,65,47,47,47,80,47,47,56,65,72,47,47,52,65,102,47,47,47,47,47,47,47,47, -47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47, -47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47, -47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,68, -47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47,43,47,47,47,47,47,56,65,65,66,47,47,47,56,102,47, -47,47,47,119,65,65,65,102,47,47,52,80,47,47,47,47,65,65,65,65,72,47,47,119,68,47,47,47,56,65,65,65, -65,65,47,43,65,65,102,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66, +47,47,47,43,65,65,47,43,65,65,65,65,80,47,47,47,47,103,65,47,47,119,65,65,65,102,47,47,47,47,119,65, +47,47,52,65,65,66,47,47,47,47,47,52,65,47,47,56,65,65,68,47,47,47,47,47,56,65,47,47,43,65,65,68, +47,47,47,47,47,43,65,47,47,47,65,65,72,47,47,47,47,47,43,65,47,47,47,65,65,80,47,47,47,47,47,47, +65,47,47,47,103,65,80,47,47,47,47,47,47,65,47,47,47,103,65,102,47,47,47,47,47,47,65,47,47,47,119,65, +102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47, +47,65,47,47,47,119,65,47,47,47,47,47,47,47,65,66,47,47,52,65,47,47,52,65,68,47,47,65,65,80,47,52, +65,47,47,103,65,66,47,47,65,65,80,47,52,65,47,47,103,65,65,47,47,65,65,80,47,52,65,47,47,103,65,65, +47,43,65,65,80,47,52,65,47,47,103,65,66,47,56,65,65,80,47,52,65,47,47,119,65,66,47,56,65,65,102,47, +52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47, +47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, +47,119,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47, +47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47,47,47,47,47,47, +47,56,65,65,66,47,47,47,47,47,47,47,47,47,52,65,65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,80, +47,47,47,47,47,47,47,47,65,65,65,65,66,47,47,47,47,47,47,47,52,65,65,65,65,65,68,47,47,47,47,47, +119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,47,65,65,66,47,56,65,65,65,65,65,65,47,47,65,65,68, +47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65, +65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65, +68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65, +65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65, +65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66,47,47,47,43,65,65,47,43,65,65,65,65,80,47,47,47, -47,103,65,47,47,119,65,65,65,102,47,47,47,47,119,65,47,47,52,65,65,66,47,47,47,47,47,52,65,47,47,56, -65,65,68,47,47,47,47,47,56,65,47,47,43,65,65,68,47,47,47,47,47,43,65,47,47,47,65,65,72,47,47,47, -47,47,43,65,47,47,47,65,65,80,47,47,47,47,47,47,65,47,47,47,103,65,80,47,47,47,47,47,47,65,47,47, -47,103,65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47, -47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119,65,47,47,47,47,47,47,47,65,66, -47,47,52,65,47,47,52,65,68,47,47,65,65,80,47,52,65,47,47,103,65,66,47,47,65,65,80,47,52,65,47,47, -103,65,65,47,47,65,65,80,47,52,65,47,47,103,65,65,47,43,65,65,80,47,52,65,47,47,103,65,66,47,56,65, -65,80,47,52,65,47,47,119,65,66,47,56,65,65,102,47,52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102, -47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47, -47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,47,47,47,103,65, -80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47, -47,47,47,47,43,65,65,68,47,47,47,47,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,47,47,47,52,65, -65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,80,47,47,47,47,47,47,47,47,65,65,65,65,66,47,47,47, -47,47,47,47,52,65,65,65,65,65,68,47,47,47,47,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,47, -65,65,66,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65, -65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47, -47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56, -65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65, -47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47, -56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,34,41,44,52,54, -44,97,116,111,98,40,34,69,105,65,110,71,105,99,110,74,121,99,110,74,121,99,110,69,119,61,61,34,41,44,55,56, -43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54,41,41,59,125,59,10,71,114,97,112,104,105,99,115,46,112, -114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110,116,111,110,83,109,97,108,108,61,170,40,115,99,97, -108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111,98,40,34,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56, -65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65, -65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65, +65,65,65,65,65,65,65,65,65,61,61,34,41,44,52,54,44,97,116,111,98,40,34,69,105,65,110,71,105,99,110,74, +121,99,110,74,121,99,110,69,119,61,61,34,41,44,55,56,43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54, +41,41,59,125,59,10,71,114,97,112,104,105,99,115,46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116, +65,110,116,111,110,83,109,97,108,108,61,170,40,115,99,97,108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115, +116,111,109,40,97,116,111,98,40,34,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,77,65,65,65,65,65,65,65,65,68,56,65,65,65,65,65,65,65, -65,47,56,65,65,65,65,65,65,65,102,47,56,65,65,65,65,65,65,72,47,47,56,65,65,65,65,65,66,47,47,47, -56,65,65,65,65,65,47,47,47,47,56,65,65,65,65,80,47,47,47,47,56,65,65,65,68,47,47,47,47,47,56,65, -65,66,47,47,47,47,47,47,56,65,65,102,47,47,47,47,47,47,56,65,72,47,47,47,47,47,47,47,52,65,47,47, -47,47,47,47,47,43,65,65,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,119,65,65,65,47,47,47,47, -47,56,65,65,65,65,47,47,47,47,43,65,65,65,65,65,47,47,47,47,103,65,65,65,65,65,47,47,47,52,65,65, -65,65,65,65,47,47,56,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,47,119,65,65,65,65,65,65, -65,65,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,72,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,43,65,65,72,47, -47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47, -47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, -47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,65,65,65,65,68,47,56,65,47,56,65,65,65,65,65,47, -56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65,65,65,65,47,56,65,47,43,65,65,65,65,66,47,56,65, -47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47, -47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,80,47,47,47,47,47,47,47,119,65,80,47,47,47, -47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47, -47,56,65,65,65,80,47,47,47,47,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,102,119,65,65,65,65,65,65,65,65,47,52,65,65,65,65,65,65,65,65,47,52,65,65,65,65,65,65,65, -66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65,65,68,47, -103,65,65,65,65,65,65,65,72,47,47,47,47,47,47,47,56,65,80,47,47,47,47,47,47,47,56,65,47,47,47,47, -47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, -47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, -56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72, -47,52,65,65,65,80,56,65,65,47,47,52,65,65,65,47,56,65,66,47,47,52,65,65,72,47,56,65,72,47,47,52, -65,65,80,47,56,65,80,47,47,52,65,65,47,47,56,65,80,47,47,52,65,66,47,47,56,65,102,47,47,52,65,68, -47,47,56,65,102,47,47,52,65,80,47,47,56,65,47,47,47,52,65,102,47,47,56,65,47,47,47,52,65,47,47,47, -56,65,47,47,47,52,68,47,47,47,56,65,47,47,65,65,72,47,47,47,56,65,47,56,65,65,80,47,47,47,56,65, -47,56,65,65,47,47,43,47,56,65,47,56,65,68,47,47,56,47,56,65,47,43,65,102,47,47,119,47,56,65,47,47, -47,47,47,47,103,47,56,65,47,47,47,47,47,43,65,47,56,65,47,47,47,47,47,56,65,47,56,65,102,47,47,47, -47,52,65,47,56,65,102,47,47,47,47,119,65,47,56,65,80,47,47,47,47,65,65,47,56,65,80,47,47,47,43,65, -65,47,56,65,72,47,47,47,56,65,65,47,56,65,68,47,47,47,119,65,65,47,56,65,65,47,47,47,65,65,65,47, -56,65,65,80,47,52,65,65,65,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,72,52,65,65,102,47,103,65,65,65,47,52,65,65,102,47,56,65,65,68,47,52,65,65,102,47,47,65,65,72,47, -52,65,65,102,47,47,103,65,80,47,52,65,65,102,47,47,119,65,80,47,52,65,65,102,47,47,119,65,102,47,52,65, -65,102,47,47,52,65,102,47,52,65,65,102,47,47,52,65,47,47,52,65,65,102,47,47,56,65,47,47,52,65,65,102, -47,47,56,65,47,47,52,65,65,80,47,47,56,65,47,47,65,47,56,65,66,47,56,65,47,56,65,47,56,65,65,47, -56,65,47,56,66,47,56,65,65,47,56,65,47,56,66,47,56,65,65,47,56,65,47,43,68,47,47,65,66,47,56,65, -47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47, -47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,119,65,80,47,47,47, -47,47,47,47,103,65,72,47,47,57,47,47,47,47,103,65,68,47,47,52,47,47,47,43,65,65,66,47,47,119,102,47, -47,52,65,65,65,80,47,65,72,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,66,47,47,119,65,65,65,65,65,65,80,47,47,119,65,65, -65,65,65,68,47,47,47,119,65,65,65,65,65,47,47,47,47,119,65,65,65,65,72,47,47,47,47,119,65,65,65,66, -47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,119,65,65,68,47,47,47,47,47,47,119,65,65,47,47,47,47, -47,47,47,119,65,65,47,47,47,47,47,104,47,119,65,65,47,47,47,47,119,66,47,119,65,65,47,47,47,56,65,66, -47,119,65,65,47,47,47,65,65,66,47,119,65,65,47,47,103,65,65,66,47,119,65,65,47,47,47,47,47,47,47,47, -56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, +65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65, +102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56, +65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,77,65, +65,65,65,65,65,65,65,68,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,102,47,56,65,65,65, +65,65,65,72,47,47,56,65,65,65,65,65,66,47,47,47,56,65,65,65,65,65,47,47,47,47,56,65,65,65,65,80, +47,47,47,47,56,65,65,65,68,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,56,65,65,102,47,47,47,47, +47,47,56,65,72,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,43,65,65,47,47,47,47,47,47,47,65, +65,65,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,56,65,65,65,65,47,47,47,47,43,65,65,65,65,65, +47,47,47,47,103,65,65,65,65,65,47,47,47,52,65,65,65,65,65,65,47,47,56,65,65,65,65,65,65,65,47,47, +65,65,65,65,65,65,65,65,47,119,65,65,65,65,65,65,65,65,52,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,47,47,47,119,65,65,65,47,47,47,47,47, +47,56,65,65,66,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47, +103,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65, +47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47, +65,65,65,65,68,47,56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65, +65,65,65,47,56,65,47,43,65,65,65,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, +47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, +52,65,80,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65, +68,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,56,65,65,65,80,47,47,47,47,47,119,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,119,65,65,65,65,65,65,65,65,47,52,65, +65,65,65,65,65,65,65,47,52,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65, +65,65,65,65,68,47,119,65,65,65,65,65,65,65,68,47,103,65,65,65,65,65,65,65,72,47,47,47,47,47,47,47, +56,65,80,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, 47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47, 47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47, -47,47,47,47,56,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66, -47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80,47,52, -65,65,47,47,47,47,52,80,47,43,65,65,47,47,47,47,52,80,47,47,65,65,47,47,47,47,52,80,47,47,103,65, -47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80,47,47,52,65,47,47, -47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47,56,65,47,47,47,47,52,80,47,47,56,65,47,47,47,47, -52,80,47,47,56,65,47,56,72,47,65,65,66,47,56,65,47,56,72,43,65,65,65,47,56,65,47,56,80,43,65,65, -65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56,80,47,103,65,68,47,56,65,47,56,80,47,47,47,47,47, -56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,52,65, -47,56,72,47,47,47,47,47,52,65,47,56,72,47,47,47,47,47,119,65,47,56,68,47,47,47,47,47,119,65,47,56, -66,47,47,47,47,47,103,65,47,56,65,47,47,47,47,43,65,65,47,56,65,80,47,47,47,52,65,65,65,65,65,66, -47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,56, -65,65,66,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,119,65, -80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,47,47, -47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,43,65,72, -47,65,66,47,56,65,47,56,65,80,43,65,65,47,56,65,47,52,65,102,43,65,65,47,56,65,47,56,65,102,43,65, -65,47,56,65,47,56,65,102,47,103,72,47,56,65,47,47,52,102,47,47,47,47,56,65,47,47,52,102,47,47,47,47, -56,65,47,47,52,102,47,47,47,47,56,65,102,47,52,102,47,47,47,47,52,65,102,47,52,102,47,47,47,47,52,65, -80,47,52,80,47,47,47,47,119,65,80,47,52,80,47,47,47,47,103,65,72,47,52,72,47,47,47,47,65,65,68,47, -52,68,47,47,47,43,65,65,66,47,52,66,47,47,47,52,65,65,65,80,52,65,80,47,47,103,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65, -65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,66,56,65,47,56,65,65,65,65,66,47, -56,65,47,56,65,65,65,65,102,47,56,65,47,56,65,65,65,72,47,47,56,65,47,56,65,65,65,47,47,47,56,65, -47,56,65,65,72,47,47,47,56,65,47,56,65,65,47,47,47,47,56,65,47,56,65,68,47,47,47,47,56,65,47,56, -65,102,47,47,47,47,56,65,47,56,66,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,47,47, -47,47,47,47,56,65,47,47,47,47,47,47,47,47,65,65,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47, -103,65,65,65,47,47,47,47,47,52,65,65,65,65,47,47,47,47,47,65,65,65,65,65,47,47,47,47,52,65,65,65, -65,65,47,47,47,47,65,65,65,65,65,65,47,47,47,56,65,65,65,65,65,65,47,47,47,103,65,65,65,65,65,65, -47,47,43,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,103, -68,47,47,103,65,65,65,47,47,52,80,47,47,56,65,65,68,47,47,56,102,47,47,47,65,65,72,47,47,43,47,47, -47,47,103,65,72,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,52,65,80,47,47,47,47,47,47,47, -56,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65, -47,47,47,47,47,47,47,47,43,65,47,47,66,47,47,65,66,47,43,65,47,43,65,47,43,65,65,47,43,65,47,56, -65,102,43,65,65,47,43,65,47,43,65,102,43,65,65,47,43,65,47,47,65,47,47,65,66,47,43,65,47,47,47,47, -47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47, -47,47,56,65,102,47,47,47,47,47,47,47,56,65,80,47,47,47,47,47,47,47,52,65,72,47,47,47,47,47,47,47, -52,65,72,47,47,43,47,47,47,47,119,65,68,47,47,43,47,47,47,47,65,65,65,47,47,52,80,47,47,43,65,65, -65,80,47,103,72,47,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,103,65,102,103,65,65,65,47,47,47, -56,65,47,56,65,65,66,47,47,47,43,65,47,47,65,65,72,47,47,47,47,65,47,47,103,65,72,47,47,47,47,103, -47,47,119,65,80,47,47,47,47,103,47,47,119,65,102,47,47,47,47,119,47,47,52,65,102,47,47,47,47,119,47,47, -52,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47,47,119,47,47,56,65, -47,47,103,80,47,119,65,47,56,65,47,56,65,68,47,119,65,47,56,65,47,56,65,68,47,119,65,102,56,65,47,56, -65,68,47,103,65,47,56,65,47,43,65,72,47,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47, -47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47, -47,47,52,65,102,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47, -103,65,68,47,47,47,47,47,47,43,65,65,65,47,47,47,47,47,47,52,65,65,65,80,47,47,47,47,47,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80, -43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65, -65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47, -52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65, +47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,52,65,65,65,80,56,65,65,47,47,52,65,65,65,47, +56,65,66,47,47,52,65,65,72,47,56,65,72,47,47,52,65,65,80,47,56,65,80,47,47,52,65,65,47,47,56,65, +80,47,47,52,65,66,47,47,56,65,102,47,47,52,65,68,47,47,56,65,102,47,47,52,65,80,47,47,56,65,47,47, +47,52,65,102,47,47,56,65,47,47,47,52,65,47,47,47,56,65,47,47,47,52,68,47,47,47,56,65,47,47,65,65, +72,47,47,47,56,65,47,56,65,65,80,47,47,47,56,65,47,56,65,65,47,47,43,47,56,65,47,56,65,68,47,47, +56,47,56,65,47,43,65,102,47,47,119,47,56,65,47,47,47,47,47,47,103,47,56,65,47,47,47,47,47,43,65,47, +56,65,47,47,47,47,47,56,65,47,56,65,102,47,47,47,47,52,65,47,56,65,102,47,47,47,47,119,65,47,56,65, +80,47,47,47,47,65,65,47,56,65,80,47,47,47,43,65,65,47,56,65,72,47,47,47,56,65,65,47,56,65,68,47, +47,47,119,65,65,47,56,65,65,47,47,47,65,65,65,47,56,65,65,80,47,52,65,65,65,47,56,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,52,65,65,102,47,103,65,65,65,47,52,65,65,102, +47,56,65,65,68,47,52,65,65,102,47,47,65,65,72,47,52,65,65,102,47,47,103,65,80,47,52,65,65,102,47,47, +119,65,80,47,52,65,65,102,47,47,119,65,102,47,52,65,65,102,47,47,52,65,102,47,52,65,65,102,47,47,52,65, +47,47,52,65,65,102,47,47,56,65,47,47,52,65,65,102,47,47,56,65,47,47,52,65,65,80,47,47,56,65,47,47, +65,47,56,65,66,47,56,65,47,56,65,47,56,65,65,47,56,65,47,56,66,47,56,65,65,47,56,65,47,56,66,47, +56,65,65,47,56,65,47,43,68,47,47,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, +47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, +52,65,102,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,103,65,72,47,47,57,47,47,47,47,103,65, +68,47,47,52,47,47,47,43,65,65,66,47,47,119,102,47,47,52,65,65,65,80,47,65,72,47,47,103,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65, +66,47,47,119,65,65,65,65,65,65,80,47,47,119,65,65,65,65,65,68,47,47,47,119,65,65,65,65,65,47,47,47, +47,119,65,65,65,65,72,47,47,47,47,119,65,65,65,66,47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,119, +65,65,68,47,47,47,47,47,47,119,65,65,47,47,47,47,47,47,47,119,65,65,47,47,47,47,47,104,47,119,65,65, +47,47,47,47,119,66,47,119,65,65,47,47,47,56,65,66,47,119,65,65,47,47,47,65,65,66,47,119,65,65,47,47, +103,65,65,66,47,119,65,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47, +47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, +47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, +56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,65,65,65,65,65,66,47,119,65,65, +65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,80,47,52,65,65,47,47,47,47,52,80,47,43,65,65,47,47,47,47, +52,80,47,47,65,65,47,47,47,47,52,80,47,47,103,65,47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80, +47,47,119,65,47,47,47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47, +56,65,47,47,47,47,52,80,47,47,56,65,47,47,47,47,52,80,47,47,56,65,47,56,72,47,65,65,66,47,56,65, +47,56,72,43,65,65,65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56, +80,47,103,65,68,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47, +47,47,47,47,56,65,47,56,80,47,47,47,47,47,52,65,47,56,72,47,47,47,47,47,52,65,47,56,72,47,47,47, +47,47,119,65,47,56,68,47,47,47,47,47,119,65,47,56,66,47,47,47,47,47,103,65,47,56,65,47,47,47,47,43, +65,65,47,56,65,80,47,47,47,52,65,65,65,65,65,66,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68, +47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,47,65,65,72,47,47,47, +47,47,47,47,103,65,80,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47, +47,47,52,65,102,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, +56,65,47,47,47,47,47,47,47,47,56,65,47,43,65,72,47,65,66,47,56,65,47,56,65,80,43,65,65,47,56,65, +47,52,65,102,43,65,65,47,56,65,47,56,65,102,43,65,65,47,56,65,47,56,65,102,47,103,72,47,56,65,47,47, +52,102,47,47,47,47,56,65,47,47,52,102,47,47,47,47,56,65,47,47,52,102,47,47,47,47,56,65,102,47,52,102, +47,47,47,47,52,65,102,47,52,102,47,47,47,47,52,65,80,47,52,80,47,47,47,47,119,65,80,47,52,80,47,47, +47,47,103,65,72,47,52,72,47,47,47,47,65,65,68,47,52,68,47,47,47,43,65,65,66,47,52,66,47,47,47,52, +65,65,65,80,52,65,80,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56, +65,65,65,65,65,66,56,65,47,56,65,65,65,65,66,47,56,65,47,56,65,65,65,65,102,47,56,65,47,56,65,65, +65,72,47,47,56,65,47,56,65,65,65,47,47,47,56,65,47,56,65,65,72,47,47,47,56,65,47,56,65,65,47,47, +47,47,56,65,47,56,65,68,47,47,47,47,56,65,47,56,65,102,47,47,47,47,56,65,47,56,66,47,47,47,47,47, +56,65,47,56,80,47,47,47,47,47,56,65,47,56,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,65,65, +47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,103,65,65,65,47,47,47,47,47,52,65,65,65,65,47,47, +47,47,47,65,65,65,65,65,47,47,47,47,52,65,65,65,65,65,47,47,47,47,65,65,65,65,65,65,47,47,47,56, +65,65,65,65,65,65,47,47,47,103,65,65,65,65,65,65,47,47,43,65,65,65,65,65,65,65,47,47,119,65,65,65, +65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,103,68,47,47,103,65,65,65,47,47,52,80,47,47,56,65,65, +68,47,47,56,102,47,47,47,65,65,72,47,47,43,47,47,47,47,103,65,72,47,47,47,47,47,47,47,119,65,80,47, +47,47,47,47,47,47,52,65,80,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47, +47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,47,47,47,47,47,47,47,47,43,65,47,47,66,47,47,65, +66,47,43,65,47,43,65,47,43,65,65,47,43,65,47,56,65,102,43,65,65,47,43,65,47,43,65,102,43,65,65,47, +43,65,47,47,65,47,47,65,66,47,43,65,47,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65, +102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,80,47, +47,47,47,47,47,47,52,65,72,47,47,47,47,47,47,47,52,65,72,47,47,43,47,47,47,47,119,65,68,47,47,43, +47,47,47,47,65,65,65,47,47,52,80,47,47,43,65,65,65,80,47,103,72,47,47,119,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -61,61,34,41,44,52,54,44,97,116,111,98,40,34,68,104,103,101,70,66,52,101,72,104,52,101,72,104,52,101,68,119, -61,61,34,41,44,54,48,43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54,41,41,59,125,59,10,172,115,101, -99,111,110,100,115,77,111,100,101,59,10,172,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,59,10,172,115,101, -99,111,110,100,115,87,105,116,104,67,111,108,111,110,59,10,172,100,97,116,101,79,110,77,97,105,110,59,10,172,100,97, -116,101,79,110,83,101,99,115,59,10,172,119,101,101,107,68,97,121,59,10,172,99,97,108,87,101,101,107,59,10,172,117, -112,112,101,114,67,97,115,101,59,10,172,118,101,99,116,111,114,70,111,110,116,59,10,172,100,114,97,119,84,105,109,101, -111,117,116,59,10,172,113,117,101,117,101,77,105,108,108,105,115,61,49,48,48,48,59,10,172,115,101,99,111,110,100,115, -83,99,114,101,101,110,61,180,59,10,172,105,115,66,97,110,103,108,101,49,61,40,112,114,111,99,101,115,115,46,101,110, -118,46,72,87,86,69,82,83,73,79,78,138,49,41,59,10,170,108,111,97,100,83,101,116,116,105,110,103,115,40,41,123, -170,100,101,102,40,118,97,108,117,101,44,100,101,102,41,123,171,118,97,108,117,101,141,183,63,118,97,108,117,101,58,100, -101,102,59,125,172,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41, -46,114,101,97,100,74,83,79,78,40,83,69,84,84,73,78,71,83,70,73,76,69,44,180,41,160,123,125,59,115,101,99, -111,110,100,115,77,111,100,101,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,77,111,100, -101,44,34,78,101,118,101,114,34,41,59,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,61,100,101,102,40,115, -101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,44,180,41,59,115,101,99,111,110, -100,115,87,105,116,104,67,111,108,111,110,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115, -87,105,116,104,67,111,108,111,110,44,180,41,59,100,97,116,101,79,110,77,97,105,110,61,100,101,102,40,115,101,116,116, -105,110,103,115,46,100,97,116,101,79,110,77,97,105,110,44,34,76,111,110,103,34,41,59,100,97,116,101,79,110,83,101, -99,115,61,100,101,102,40,115,101,116,116,105,110,103,115,46,100,97,116,101,79,110,83,101,99,115,44,34,89,101,97,114, -34,41,59,119,101,101,107,68,97,121,61,100,101,102,40,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,44, -180,41,59,99,97,108,87,101,101,107,61,100,101,102,40,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,44, -181,41,59,117,112,112,101,114,67,97,115,101,61,100,101,102,40,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67, -97,115,101,44,180,41,59,118,101,99,116,111,114,70,111,110,116,61,100,101,102,40,115,101,116,116,105,110,103,115,46,118, -101,99,116,111,114,70,111,110,116,44,181,41,59,163,40,100,97,116,101,79,110,83,101,99,115,139,180,41,100,97,116,101, -79,110,83,101,99,115,61,34,89,101,97,114,34,59,163,40,100,97,116,101,79,110,83,101,99,115,139,181,41,100,97,116, -101,79,110,83,101,99,115,61,34,78,111,34,59,125,10,170,113,117,101,117,101,68,114,97,119,40,41,123,163,40,100,114, -97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,100,114,97,119,84,105,109,101,111, -117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,100, -114,97,119,84,105,109,101,111,117,116,61,183,59,100,114,97,119,40,41,59,125,44,113,117,101,117,101,77,105,108,108,105, -115,45,40,68,97,116,101,46,110,111,119,40,41,37,113,117,101,117,101,77,105,108,108,105,115,41,41,59,125,10,170,117, -112,100,97,116,101,83,116,97,116,101,40,41,123,163,40,66,97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,41, -123,163,40,40,115,101,99,111,110,100,115,77,111,100,101,139,34,85,110,108,111,99,107,101,100,34,158,33,66,97,110,103, -108,101,46,105,115,76,111,99,107,101,100,40,41,41,160,115,101,99,111,110,100,115,77,111,100,101,139,34,65,108,119,97, -121,115,34,41,123,115,101,99,111,110,100,115,83,99,114,101,101,110,61,180,59,113,117,101,117,101,77,105,108,108,105,115, -61,49,48,48,48,59,125,164,123,115,101,99,111,110,100,115,83,99,114,101,101,110,61,181,59,113,117,101,117,101,77,105, -108,108,105,115,61,54,48,48,48,48,59,125,100,114,97,119,40,41,59,125,164,123,163,40,100,114,97,119,84,105,109,101, -111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,100,114,97,119,84,105,109,101,111,117,116,41,59,100,114, -97,119,84,105,109,101,111,117,116,61,183,59,125,125,10,170,105,115,111,83,116,114,40,100,97,116,101,41,123,171,100,97, -116,101,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,34,48,34,43,40,100,97,116,101,46, -103,101,116,77,111,110,116,104,40,41,43,49,41,41,46,115,108,105,99,101,40,45,50,41,43,34,45,34,43,40,34,48, -34,43,100,97,116,101,46,103,101,116,68,97,116,101,40,41,41,46,115,108,105,99,101,40,45,50,41,59,125,10,172,99, -97,108,87,101,101,107,66,117,102,102,101,114,61,91,181,44,181,44,181,93,59,10,170,73,83,79,56,54,48,49,99,97, -108,87,101,101,107,40,100,97,116,101,41,123,100,97,116,101,78,111,84,105,109,101,61,100,97,116,101,59,100,97,116,101, -78,111,84,105,109,101,46,115,101,116,72,111,117,114,115,40,48,44,48,44,48,44,48,41,59,163,40,99,97,108,87,101, -101,107,66,117,102,102,101,114,91,48,93,139,100,97,116,101,46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115, -101,116,40,41,158,99,97,108,87,101,101,107,66,117,102,102,101,114,91,49,93,139,100,97,116,101,78,111,84,105,109,101, -41,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,59,99,97,108,87,101,101,107,66,117,102,102,101,114, -91,48,93,61,100,97,116,101,46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41,59,99,97,108, -87,101,101,107,66,117,102,102,101,114,91,49,93,61,100,97,116,101,78,111,84,105,109,101,59,172,116,100,116,61,184,68, -97,116,101,40,100,97,116,101,46,118,97,108,117,101,79,102,40,41,41,59,172,100,97,121,110,61,40,100,97,116,101,46, -103,101,116,68,97,121,40,41,43,54,41,37,55,59,116,100,116,46,115,101,116,68,97,116,101,40,116,100,116,46,103,101, -116,68,97,116,101,40,41,45,100,97,121,110,43,51,41,59,172,102,105,114,115,116,84,104,117,114,115,100,97,121,61,116, -100,116,46,118,97,108,117,101,79,102,40,41,59,116,100,116,46,115,101,116,77,111,110,116,104,40,48,44,49,41,59,163, -40,116,100,116,46,103,101,116,68,97,121,40,41,141,52,41,123,116,100,116,46,115,101,116,77,111,110,116,104,40,48,44, -49,43,40,40,52,45,116,100,116,46,103,101,116,68,97,121,40,41,41,43,55,41,37,55,41,59,125,99,97,108,87,101, -101,107,66,117,102,102,101,114,91,50,93,61,49,43,77,97,116,104,46,99,101,105,108,40,40,102,105,114,115,116,84,104, -117,114,115,100,97,121,45,116,100,116,41,47,54,48,52,56,48,48,48,48,48,41,59,171,99,97,108,87,101,101,107,66, -117,102,102,101,114,91,50,93,59,125,10,170,100,111,67,111,108,111,114,40,41,123,171,33,105,115,66,97,110,103,108,101, -49,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,158,115,101,99,111,110,100,115,67,111,108,111, -117,114,101,100,59,125,10,170,100,114,97,119,40,41,123,172,120,61,103,46,103,101,116,87,105,100,116,104,40,41,47,50, -59,172,121,61,103,46,103,101,116,72,101,105,103,104,116,40,41,47,50,45,40,115,101,99,111,110,100,115,77,111,100,101, -141,34,78,101,118,101,114,34,63,50,52,58,40,118,101,99,116,111,114,70,111,110,116,63,49,50,58,48,41,41,59,103, -46,114,101,115,101,116,40,41,59,103,46,99,108,101,97,114,82,101,99,116,40,48,44,50,52,44,103,46,103,101,116,87, -105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,45,50,52,41,59,172,100,97,116,101,61,184, -68,97,116,101,40,41,59,172,116,105,109,101,83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34, -41,46,116,105,109,101,40,100,97,116,101,44,49,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, -48,41,46,115,101,116,70,111,110,116,40,34,65,110,116,111,110,34,41,46,100,114,97,119,83,116,114,105,110,103,40,116, -105,109,101,83,116,114,44,120,44,121,41,59,163,40,115,101,99,111,110,100,115,83,99,114,101,101,110,41,123,121,150,54, -53,59,172,115,101,99,83,116,114,61,40,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,63,34,58,34,58, -34,34,41,43,40,34,48,34,43,100,97,116,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,46,115,108,105,99, -101,40,45,50,41,59,163,40,100,111,67,111,108,111,114,40,41,41,103,46,115,101,116,67,111,108,111,114,40,48,44,48, -44,49,41,59,103,46,115,101,116,70,111,110,116,40,34,65,110,116,111,110,83,109,97,108,108,34,41,59,163,40,100,97, -116,101,79,110,83,101,99,115,141,34,78,111,34,41,123,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,49,44, -48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101,99,83,116,114,44,103,46,103,101,116,87,105,100,116,104,40, -41,45,40,105,115,66,97,110,103,108,101,49,63,51,50,58,50,41,44,121,41,59,121,151,40,118,101,99,116,111,114,70, -111,110,116,63,49,53,58,49,51,41,59,120,61,103,46,103,101,116,87,105,100,116,104,40,41,47,52,43,40,105,115,66, -97,110,103,108,101,49,63,49,50,58,52,41,43,40,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,63,48, -58,103,46,115,116,114,105,110,103,87,105,100,116,104,40,34,58,34,41,47,50,41,59,172,100,97,116,101,83,116,114,50, -61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83,79,56,54,48,49,34,63,105,115,111,83,116,114,40,100,97, -116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,97,116,101,40,100,97,116,101,44, -49,41,41,59,172,121,101,97,114,59,172,109,100,59,172,121,101,97,114,102,105,114,115,116,59,163,40,100,97,116,101,83, -116,114,50,46,109,97,116,99,104,40,47,92,100,92,100,92,100,92,100,36,47,41,41,123,121,101,97,114,61,40,100,97, -116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,45, -52,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41, -41,59,109,100,61,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,48,44,45,52,41,59,163,40,33,109,100,46, -101,110,100,115,87,105,116,104,40,34,46,34,41,41,109,100,61,109,100,46,115,108,105,99,101,40,48,44,45,49,41,59, -121,101,97,114,102,105,114,115,116,61,181,59,125,164,123,163,40,33,100,97,116,101,83,116,114,50,46,109,97,116,99,104, -40,47,94,92,100,92,100,92,100,92,100,47,41,41,100,97,116,101,83,116,114,50,61,105,115,111,83,116,114,40,100,97, -116,101,41,59,121,101,97,114,61,40,100,97,116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63,100,97,116,101, -83,116,114,50,46,115,108,105,99,101,40,48,44,52,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34, -41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109,100,61,100,97,116,101,83,116,114,50,46,115,108,105,99,101, -40,53,41,59,121,101,97,114,102,105,114,115,116,61,180,59,125,163,40,100,97,116,101,79,110,83,101,99,115,139,34,87, -101,101,107,100,97,121,34,158,117,112,112,101,114,67,97,115,101,41,121,101,97,114,61,121,101,97,114,46,116,111,85,112, -112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,163,40, -118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,50,52, -41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,163,40,100,111,67,111,108,111,114,40, -41,41,103,46,115,101,116,67,111,108,111,114,40,49,44,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103, -40,109,100,44,120,44,40,121,101,97,114,102,105,114,115,116,63,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50, -54,58,49,54,41,58,121,41,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,121,101,97,114,44,120,44,40,121, -101,97,114,102,105,114,115,116,63,121,58,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,41, -41,59,125,164,123,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114, -105,110,103,40,115,101,99,83,116,114,44,120,44,121,41,59,125,125,164,123,121,150,40,118,101,99,116,111,114,70,111,110, -116,63,53,48,58,40,115,101,99,111,110,100,115,77,111,100,101,141,34,78,101,118,101,114,34,41,63,53,50,58,52,48, -41,59,172,100,97,116,101,83,116,114,61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83,79,56,54,48,49,34, -63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46, -100,97,116,101,40,100,97,116,101,44,40,100,97,116,101,79,110,77,97,105,110,139,34,76,111,110,103,34,63,48,58,49, -41,41,41,59,163,40,117,112,112,101,114,67,97,115,101,41,100,97,116,101,83,116,114,61,100,97,116,101,83,116,114,46, -116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, -41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114, -34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119, -83,116,114,105,110,103,40,100,97,116,101,83,116,114,44,120,44,121,41,59,163,40,99,97,108,87,101,101,107,160,119,101, -101,107,68,97,121,41,123,172,100,111,119,99,119,83,116,114,61,34,34,59,163,40,99,97,108,87,101,101,107,41,100,111, -119,99,119,83,116,114,61,34,32,35,34,43,40,34,48,34,43,73,83,79,56,54,48,49,99,97,108,87,101,101,107,40, -100,97,116,101,41,41,46,115,108,105,99,101,40,45,50,41,59,163,40,119,101,101,107,68,97,121,41,100,111,119,99,119, -83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,99, -97,108,87,101,101,107,63,49,58,48,41,43,100,111,119,99,119,83,116,114,59,164,100,111,119,99,119,83,116,114,61,34, -119,101,101,107,34,43,100,111,119,99,119,83,116,114,59,163,40,117,112,112,101,114,67,97,115,101,41,100,111,119,99,119, -83,116,114,61,100,111,119,99,119,83,116,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,100,114,97, -119,83,116,114,105,110,103,40,100,111,119,99,119,83,116,114,44,120,44,121,43,40,118,101,99,116,111,114,70,111,110,116, -63,50,54,58,49,54,41,41,59,125,125,113,117,101,117,101,68,114,97,119,40,41,59,125,10,108,111,97,100,83,101,116, -116,105,110,103,115,40,41,59,10,103,46,99,108,101,97,114,40,41,59,10,117,112,100,97,116,101,83,116,97,116,101,40, -41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,111,110,162,123,117,112,100,97, -116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,111,99,107,39,44,111, -110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97,110,103,108,101,46,115,101,116,85, -73,40,34,99,108,111,99,107,34,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41, -59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,255,176,6,0,0,97,110,116,111, -110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41, -123,172,70,73,76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,59,172,115,101,116,116,105,110,103,115, -61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,101,99,111,110,100,115,79,110,85,110,108,111,99,107,58, -181,44,125,44,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40, -70,73,76,69,44,180,41,160,123,125,41,59,170,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,123,114,101,113, -117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,74,83,79,78,40,70,73,76,69,44,115, -101,116,116,105,110,103,115,41,59,125,170,115,116,114,105,110,103,73,116,101,109,115,40,115,116,97,114,116,118,97,108,117, -101,44,119,114,105,116,101,114,44,118,97,108,117,101,115,41,123,171,123,118,97,108,117,101,58,40,115,116,97,114,116,118, -97,108,117,101,139,183,63,48,58,118,97,108,117,101,115,46,105,110,100,101,120,79,102,40,115,116,97,114,116,118,97,108, -117,101,41,41,44,102,111,114,109,97,116,58,118,162,118,97,108,117,101,115,91,118,93,44,109,105,110,58,48,44,109,97, -120,58,118,97,108,117,101,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,115,116,101,112,58,49,44, -111,110,99,104,97,110,103,101,58,118,162,123,119,114,105,116,101,114,40,118,97,108,117,101,115,91,118,93,41,59,119,114, -105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,170,115,116,114,105,110,103,73,110,83,101,116,116,105, -110,103,115,40,110,97,109,101,44,118,97,108,117,101,115,41,123,171,115,116,114,105,110,103,73,116,101,109,115,40,115,101, -116,116,105,110,103,115,91,110,97,109,101,93,44,118,162,115,101,116,116,105,110,103,115,91,110,97,109,101,93,61,118,44, -118,97,108,117,101,115,41,59,125,172,109,97,105,110,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58, -34,65,110,116,111,110,32,99,108,111,99,107,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,98,97,99,107,40, -41,44,34,83,101,99,111,110,100,115,46,46,46,34,58,40,41,162,69,46,115,104,111,119,77,101,110,117,40,115,101,99, -109,101,110,117,41,44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,100, -97,116,101,79,110,77,97,105,110,34,44,91,34,76,111,110,103,34,44,34,83,104,111,114,116,34,44,34,73,83,79,56, -54,48,49,34,93,41,44,34,83,104,111,119,32,87,101,101,107,100,97,121,34,58,123,118,97,108,117,101,58,40,115,101, -116,116,105,110,103,115,46,119,101,101,107,68,97,121,141,183,63,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97, -121,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97, -110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,61,118,59,119,114,105,116,101,83, -101,116,116,105,110,103,115,40,41,59,125,125,44,34,83,104,111,119,32,67,97,108,87,101,101,107,34,58,123,118,97,108, -117,101,58,40,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,141,183,63,115,101,116,116,105,110,103,115,46, -99,97,108,87,101,101,107,58,181,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34, -44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,61,118,59, -119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,85,112,112,101,114,99,97,115,101,34,58,123, -118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,141,183,63,115,101,116,116, -105,110,103,115,46,117,112,112,101,114,67,97,115,101,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110, -34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,117,112,112, -101,114,67,97,115,101,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,86,101,99, -116,111,114,32,102,111,110,116,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111, -114,70,111,110,116,141,183,63,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,58,181,41,44,102, -111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162, -123,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,61,118,59,119,114,105,116,101,83,101,116,116, -105,110,103,115,40,41,59,125,125,44,125,59,172,115,101,99,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101, -34,58,34,83,104,111,119,32,115,101,99,111,110,100,115,46,46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41, -162,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,44,34,83,104,111,119,34,58,115,116,114, -105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,115,101,99,111,110,100,115,77,111,100,101,34,44,91,34,78,101, -118,101,114,34,44,34,85,110,108,111,99,107,101,100,34,44,34,65,108,119,97,121,115,34,93,41,44,34,87,105,116,104, -32,92,34,58,92,34,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115, -87,105,116,104,67,111,108,111,110,141,183,63,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104, -67,111,108,111,110,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111, -110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67, -111,108,111,110,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,67,111,108,111,114, -34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114, -101,100,141,183,63,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,58,180,41, -44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58, -118,162,123,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,61,118,59,119,114, -105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110, -83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110,83,101,99,115,34,44,91,34,89,101,97,114,34,44,34,87, -101,101,107,100,97,121,34,44,34,78,111,34,93,41,125,59,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109, -101,110,117,41,59,125,41,59,67,2,0,0,97,110,116,111,110,99,108,107,46,105,109,103,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,48,48,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +65,65,65,72,47,47,103,65,102,103,65,65,65,47,47,47,56,65,47,56,65,65,66,47,47,47,43,65,47,47,65,65, +72,47,47,47,47,65,47,47,103,65,72,47,47,47,47,103,47,47,119,65,80,47,47,47,47,103,47,47,119,65,102,47, +47,47,47,119,47,47,52,65,102,47,47,47,47,119,47,47,52,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47, +47,119,47,47,56,65,47,47,47,47,47,119,47,47,56,65,47,47,103,80,47,119,65,47,56,65,47,56,65,68,47,119, +65,47,56,65,47,56,65,68,47,119,65,102,56,65,47,56,65,68,47,103,65,47,56,65,47,43,65,72,47,65,66,47, +56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, +102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,119,65,80,47, +47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,43,65,65,65,47,47,47, +47,47,47,52,65,65,65,80,47,47,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65, +65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65, +65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80, +43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,34,41,44,52,54,44,97,116,111,98,40,34,68,104, +103,101,70,66,52,101,72,104,52,101,72,104,52,101,68,119,61,61,34,41,44,54,48,43,40,115,99,97,108,101,143,56, +41,43,40,49,143,49,54,41,41,59,125,59,10,172,115,101,99,111,110,100,115,77,111,100,101,59,10,172,115,101,99,111, +110,100,115,67,111,108,111,117,114,101,100,59,10,172,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,59,10, +172,100,97,116,101,79,110,77,97,105,110,59,10,172,100,97,116,101,79,110,83,101,99,115,59,10,172,119,101,101,107,68, +97,121,59,10,172,99,97,108,87,101,101,107,59,10,172,117,112,112,101,114,67,97,115,101,59,10,172,118,101,99,116,111, +114,70,111,110,116,59,10,172,100,114,97,119,84,105,109,101,111,117,116,59,10,172,113,117,101,117,101,77,105,108,108,105, +115,61,49,48,48,48,59,10,172,115,101,99,111,110,100,115,83,99,114,101,101,110,61,180,59,10,172,105,115,66,97,110, +103,108,101,49,61,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,59,10, +170,108,111,97,100,83,101,116,116,105,110,103,115,40,41,123,170,100,101,102,40,118,97,108,117,101,44,100,101,102,41,123, +171,118,97,108,117,101,141,183,63,118,97,108,117,101,58,100,101,102,59,125,172,115,101,116,116,105,110,103,115,61,114,101, +113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,83,69,84,84,73,78, +71,83,70,73,76,69,44,180,41,160,123,125,59,115,101,99,111,110,100,115,77,111,100,101,61,100,101,102,40,115,101,116, +116,105,110,103,115,46,115,101,99,111,110,100,115,77,111,100,101,44,34,78,101,118,101,114,34,41,59,115,101,99,111,110, +100,115,67,111,108,111,117,114,101,100,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67, +111,108,111,117,114,101,100,44,180,41,59,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,100,101,102,40, +115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,44,180,41,59,100,97,116, +101,79,110,77,97,105,110,61,100,101,102,40,115,101,116,116,105,110,103,115,46,100,97,116,101,79,110,77,97,105,110,44, +34,76,111,110,103,34,41,59,100,97,116,101,79,110,83,101,99,115,61,100,101,102,40,115,101,116,116,105,110,103,115,46, +100,97,116,101,79,110,83,101,99,115,44,34,89,101,97,114,34,41,59,119,101,101,107,68,97,121,61,100,101,102,40,115, +101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,44,180,41,59,99,97,108,87,101,101,107,61,100,101,102,40,115, +101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,44,181,41,59,117,112,112,101,114,67,97,115,101,61,100,101,102, +40,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,44,180,41,59,118,101,99,116,111,114,70,111,110, +116,61,100,101,102,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,44,181,41,59,163,40,100, +97,116,101,79,110,83,101,99,115,139,180,41,100,97,116,101,79,110,83,101,99,115,61,34,89,101,97,114,34,59,163,40, +100,97,116,101,79,110,83,101,99,115,139,181,41,100,97,116,101,79,110,83,101,99,115,61,34,78,111,34,59,125,10,170, +113,117,101,117,101,68,114,97,119,40,41,123,163,40,100,114,97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84, +105,109,101,111,117,116,40,100,114,97,119,84,105,109,101,111,117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61, +115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,100,114,97,119,84,105,109,101,111,117,116,61,183,59,100,114,97, +119,40,41,59,125,44,113,117,101,117,101,77,105,108,108,105,115,45,40,68,97,116,101,46,110,111,119,40,41,37,113,117, +101,117,101,77,105,108,108,105,115,41,41,59,125,10,170,117,112,100,97,116,101,83,116,97,116,101,40,41,123,163,40,66, +97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,41,123,163,40,40,115,101,99,111,110,100,115,77,111,100,101,139, +34,85,110,108,111,99,107,101,100,34,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,41,160,115, +101,99,111,110,100,115,77,111,100,101,139,34,65,108,119,97,121,115,34,41,123,115,101,99,111,110,100,115,83,99,114,101, +101,110,61,180,59,113,117,101,117,101,77,105,108,108,105,115,61,49,48,48,48,59,125,164,123,115,101,99,111,110,100,115, +83,99,114,101,101,110,61,181,59,113,117,101,117,101,77,105,108,108,105,115,61,54,48,48,48,48,59,125,100,114,97,119, +40,41,59,125,164,123,163,40,100,114,97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116, +40,100,114,97,119,84,105,109,101,111,117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61,183,59,125,125,10,170, +105,115,111,83,116,114,40,100,97,116,101,41,123,171,100,97,116,101,46,103,101,116,70,117,108,108,89,101,97,114,40,41, +43,34,45,34,43,40,34,48,34,43,40,100,97,116,101,46,103,101,116,77,111,110,116,104,40,41,43,49,41,41,46,115, +108,105,99,101,40,45,50,41,43,34,45,34,43,40,34,48,34,43,100,97,116,101,46,103,101,116,68,97,116,101,40,41, +41,46,115,108,105,99,101,40,45,50,41,59,125,10,172,99,97,108,87,101,101,107,66,117,102,102,101,114,61,91,181,44, +181,44,181,93,59,10,170,73,83,79,56,54,48,49,99,97,108,87,101,101,107,40,100,97,116,101,41,123,100,97,116,101, +78,111,84,105,109,101,61,100,97,116,101,59,100,97,116,101,78,111,84,105,109,101,46,115,101,116,72,111,117,114,115,40, +48,44,48,44,48,44,48,41,59,163,40,99,97,108,87,101,101,107,66,117,102,102,101,114,91,48,93,139,100,97,116,101, +46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41,158,99,97,108,87,101,101,107,66,117,102,102, +101,114,91,49,93,139,100,97,116,101,78,111,84,105,109,101,41,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91, +50,93,59,99,97,108,87,101,101,107,66,117,102,102,101,114,91,48,93,61,100,97,116,101,46,103,101,116,84,105,109,101, +122,111,110,101,79,102,102,115,101,116,40,41,59,99,97,108,87,101,101,107,66,117,102,102,101,114,91,49,93,61,100,97, +116,101,78,111,84,105,109,101,59,172,116,100,116,61,184,68,97,116,101,40,100,97,116,101,46,118,97,108,117,101,79,102, +40,41,41,59,172,100,97,121,110,61,40,100,97,116,101,46,103,101,116,68,97,121,40,41,43,54,41,37,55,59,116,100, +116,46,115,101,116,68,97,116,101,40,116,100,116,46,103,101,116,68,97,116,101,40,41,45,100,97,121,110,43,51,41,59, +172,102,105,114,115,116,84,104,117,114,115,100,97,121,61,116,100,116,46,118,97,108,117,101,79,102,40,41,59,116,100,116, +46,115,101,116,77,111,110,116,104,40,48,44,49,41,59,163,40,116,100,116,46,103,101,116,68,97,121,40,41,141,52,41, +123,116,100,116,46,115,101,116,77,111,110,116,104,40,48,44,49,43,40,40,52,45,116,100,116,46,103,101,116,68,97,121, +40,41,41,43,55,41,37,55,41,59,125,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,61,49,43,77,97, +116,104,46,99,101,105,108,40,40,102,105,114,115,116,84,104,117,114,115,100,97,121,45,116,100,116,41,47,54,48,52,56, +48,48,48,48,48,41,59,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,59,125,10,170,100,111,67,111, +108,111,114,40,41,123,171,33,105,115,66,97,110,103,108,101,49,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107, +101,100,40,41,158,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,59,125,10,170,100,114,97,119,40,41,123,172, +120,61,103,46,103,101,116,87,105,100,116,104,40,41,47,50,59,172,121,61,103,46,103,101,116,72,101,105,103,104,116,40, +41,47,50,45,40,115,101,99,111,110,100,115,77,111,100,101,141,34,78,101,118,101,114,34,63,50,52,58,40,118,101,99, +116,111,114,70,111,110,116,63,49,50,58,48,41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,99,108,101,97,114, +82,101,99,116,40,48,44,50,52,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103, +104,116,40,41,45,50,52,41,59,172,100,97,116,101,61,184,68,97,116,101,40,41,59,172,116,105,109,101,83,116,114,61, +114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,116,105,109,101,40,100,97,116,101,44,49,41,59,103, +46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,65,110,116,111, +110,34,41,46,100,114,97,119,83,116,114,105,110,103,40,116,105,109,101,83,116,114,44,120,44,121,41,59,163,40,115,101, +99,111,110,100,115,83,99,114,101,101,110,41,123,121,150,54,53,59,172,115,101,99,83,116,114,61,40,115,101,99,111,110, +100,115,87,105,116,104,67,111,108,111,110,63,34,58,34,58,34,34,41,43,40,34,48,34,43,100,97,116,101,46,103,101, +116,83,101,99,111,110,100,115,40,41,41,46,115,108,105,99,101,40,45,50,41,59,163,40,100,111,67,111,108,111,114,40, +41,41,103,46,115,101,116,67,111,108,111,114,40,48,44,48,44,49,41,59,103,46,115,101,116,70,111,110,116,40,34,65, +110,116,111,110,83,109,97,108,108,34,41,59,163,40,100,97,116,101,79,110,83,101,99,115,141,34,78,111,34,41,123,103, +46,115,101,116,70,111,110,116,65,108,105,103,110,40,49,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101, +99,83,116,114,44,103,46,103,101,116,87,105,100,116,104,40,41,45,40,105,115,66,97,110,103,108,101,49,63,51,50,58, +50,41,44,121,41,59,121,151,40,118,101,99,116,111,114,70,111,110,116,63,49,53,58,49,51,41,59,120,61,103,46,103, +101,116,87,105,100,116,104,40,41,47,52,43,40,105,115,66,97,110,103,108,101,49,63,49,50,58,52,41,43,40,115,101, +99,111,110,100,115,87,105,116,104,67,111,108,111,110,63,48,58,103,46,115,116,114,105,110,103,87,105,100,116,104,40,34, +58,34,41,47,50,41,59,172,100,97,116,101,83,116,114,50,61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83, +79,56,54,48,49,34,63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,46,100,97,116,101,40,100,97,116,101,44,49,41,41,59,172,121,101,97,114,59,172,109,100,59,172,121, +101,97,114,102,105,114,115,116,59,163,40,100,97,116,101,83,116,114,50,46,109,97,116,99,104,40,47,92,100,92,100,92, +100,92,100,36,47,41,41,123,121,101,97,114,61,40,100,97,116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63, +100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,45,52,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97, +108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109,100,61,100,97,116,101,83,116,114,50,46,115,108, +105,99,101,40,48,44,45,52,41,59,163,40,33,109,100,46,101,110,100,115,87,105,116,104,40,34,46,34,41,41,109,100, +61,109,100,46,115,108,105,99,101,40,48,44,45,49,41,59,121,101,97,114,102,105,114,115,116,61,181,59,125,164,123,163, +40,33,100,97,116,101,83,116,114,50,46,109,97,116,99,104,40,47,94,92,100,92,100,92,100,92,100,47,41,41,100,97, +116,101,83,116,114,50,61,105,115,111,83,116,114,40,100,97,116,101,41,59,121,101,97,114,61,40,100,97,116,101,79,110, +83,101,99,115,139,34,89,101,97,114,34,63,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,48,44,52,41,58, +114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109, +100,61,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,53,41,59,121,101,97,114,102,105,114,115,116,61,180,59, +125,163,40,100,97,116,101,79,110,83,101,99,115,139,34,87,101,101,107,100,97,121,34,158,117,112,112,101,114,67,97,115, +101,41,121,101,97,114,61,121,101,97,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70, +111,110,116,65,108,105,103,110,40,48,44,48,41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116, +70,111,110,116,40,34,86,101,99,116,111,114,34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120, +56,34,44,50,41,59,163,40,100,111,67,111,108,111,114,40,41,41,103,46,115,101,116,67,111,108,111,114,40,49,44,48, +44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,109,100,44,120,44,40,121,101,97,114,102,105,114,115,116, +63,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,58,121,41,41,59,103,46,100,114,97,119, +83,116,114,105,110,103,40,121,101,97,114,44,120,44,40,121,101,97,114,102,105,114,115,116,63,121,58,121,43,40,118,101, +99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,41,41,59,125,164,123,103,46,115,101,116,70,111,110,116,65,108, +105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101,99,83,116,114,44,120,44,121,41,59, +125,125,164,123,121,150,40,118,101,99,116,111,114,70,111,110,116,63,53,48,58,40,115,101,99,111,110,100,115,77,111,100, +101,141,34,78,101,118,101,114,34,41,63,53,50,58,52,48,41,59,172,100,97,116,101,83,116,114,61,40,100,97,116,101, +79,110,77,97,105,110,139,34,73,83,79,56,54,48,49,34,63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101, +113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,97,116,101,40,100,97,116,101,44,40,100,97,116,101,79, +110,77,97,105,110,139,34,76,111,110,103,34,63,48,58,49,41,41,41,59,163,40,117,112,112,101,114,67,97,115,101,41, +100,97,116,101,83,116,114,61,100,97,116,101,83,116,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103, +46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116, +40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,97,116,101,83,116,114,44,120, +44,121,41,59,163,40,99,97,108,87,101,101,107,160,119,101,101,107,68,97,121,41,123,172,100,111,119,99,119,83,116,114, +61,34,34,59,163,40,99,97,108,87,101,101,107,41,100,111,119,99,119,83,116,114,61,34,32,35,34,43,40,34,48,34, +43,73,83,79,56,54,48,49,99,97,108,87,101,101,107,40,100,97,116,101,41,41,46,115,108,105,99,101,40,45,50,41, +59,163,40,119,101,101,107,68,97,121,41,100,111,119,99,119,83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,99,97,108,87,101,101,107,63,49,58,48,41,43,100,111,119,99, +119,83,116,114,59,164,100,111,119,99,119,83,116,114,61,34,119,101,101,107,34,43,100,111,119,99,119,83,116,114,59,163, +40,117,112,112,101,114,67,97,115,101,41,100,111,119,99,119,83,116,114,61,100,111,119,99,119,83,116,114,46,116,111,85, +112,112,101,114,67,97,115,101,40,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,111,119,99,119,83,116,114, +44,120,44,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,41,59,125,125,113,117,101,117,101, +68,114,97,119,40,41,59,125,10,108,111,97,100,83,101,116,116,105,110,103,115,40,41,59,10,103,46,99,108,101,97,114, +40,41,59,10,117,112,100,97,116,101,83,116,97,116,101,40,41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,99, +100,80,111,119,101,114,39,44,111,110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97, +110,103,108,101,46,111,110,40,39,108,111,99,107,39,44,111,110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41, +59,125,41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40,34,99,108,111,99,107,34,41,59,10,66,97,110,103, +108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100, +103,101,116,115,40,41,59,255,176,6,0,0,97,110,116,111,110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115, +0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,172,70,73,76,69,61,34,97,110,116,111,110,99,108,107, +46,106,115,111,110,34,59,172,115,101,116,116,105,110,103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123, +115,101,99,111,110,100,115,79,110,85,110,108,111,99,107,58,181,44,125,44,114,101,113,117,105,114,101,40,39,83,116,111, +114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,70,73,76,69,44,180,41,160,123,125,41,59,170,119,114,105, +116,101,83,101,116,116,105,110,103,115,40,41,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46, +119,114,105,116,101,74,83,79,78,40,70,73,76,69,44,115,101,116,116,105,110,103,115,41,59,125,170,115,116,114,105,110, +103,73,116,101,109,115,40,115,116,97,114,116,118,97,108,117,101,44,119,114,105,116,101,114,44,118,97,108,117,101,115,41, +123,171,123,118,97,108,117,101,58,40,115,116,97,114,116,118,97,108,117,101,139,183,63,48,58,118,97,108,117,101,115,46, +105,110,100,101,120,79,102,40,115,116,97,114,116,118,97,108,117,101,41,41,44,102,111,114,109,97,116,58,118,162,118,97, +108,117,101,115,91,118,93,44,109,105,110,58,48,44,109,97,120,58,118,97,108,117,101,115,46,108,101,110,103,116,104,45, +49,44,119,114,97,112,58,180,44,115,116,101,112,58,49,44,111,110,99,104,97,110,103,101,58,118,162,123,119,114,105,116, +101,114,40,118,97,108,117,101,115,91,118,93,41,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, +59,125,170,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,110,97,109,101,44,118,97,108,117,101,115,41, +123,171,115,116,114,105,110,103,73,116,101,109,115,40,115,101,116,116,105,110,103,115,91,110,97,109,101,93,44,118,162,115, +101,116,116,105,110,103,115,91,110,97,109,101,93,61,118,44,118,97,108,117,101,115,41,59,125,172,109,97,105,110,109,101, +110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,110,116,111,110,32,99,108,111,99,107,34,125,44,34, +60,32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41,44,34,83,101,99,111,110,100,115,46,46,46,34,58,40, +41,162,69,46,115,104,111,119,77,101,110,117,40,115,101,99,109,101,110,117,41,44,34,68,97,116,101,34,58,115,116,114, +105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110,77,97,105,110,34,44,91,34,76,111,110, +103,34,44,34,83,104,111,114,116,34,44,34,73,83,79,56,54,48,49,34,93,41,44,34,83,104,111,119,32,87,101,101, +107,100,97,121,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,141,183, +63,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63, +34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, +119,101,101,107,68,97,121,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,83,104, +111,119,32,67,97,108,87,101,101,107,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,99,97,108, +87,101,101,107,141,183,63,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,58,181,41,44,102,111,114,109,97, +116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, +116,105,110,103,115,46,99,97,108,87,101,101,107,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59, +125,125,44,34,85,112,112,101,114,99,97,115,101,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46, +117,112,112,101,114,67,97,115,101,141,183,63,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,58,180, +41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101, +58,118,162,123,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,61,118,59,119,114,105,116,101,83,101, +116,116,105,110,103,115,40,41,59,125,125,44,34,86,101,99,116,111,114,32,102,111,110,116,34,58,123,118,97,108,117,101, +58,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,141,183,63,115,101,116,116,105,110,103,115, +46,118,101,99,116,111,114,70,111,110,116,58,181,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34, +79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114, +70,111,110,116,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,125,59,172,115,101,99, +109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,83,104,111,119,32,115,101,99,111,110,100,115,46, +46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110, +109,101,110,117,41,44,34,83,104,111,119,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,115, +101,99,111,110,100,115,77,111,100,101,34,44,91,34,78,101,118,101,114,34,44,34,85,110,108,111,99,107,101,100,34,44, +34,65,108,119,97,121,115,34,93,41,44,34,87,105,116,104,32,92,34,58,92,34,34,58,123,118,97,108,117,101,58,40, +115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,141,183,63,115,101,116,116, +105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,58,180,41,44,102,111,114,109,97,116,58, +118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,118,59,119,114,105,116,101,83,101,116,116, +105,110,103,115,40,41,59,125,125,44,34,67,111,108,111,114,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110, +103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,141,183,63,115,101,116,116,105,110,103,115,46,115,101, +99,111,110,100,115,67,111,108,111,117,114,101,100,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34, +58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,115,101,99,111, +110,100,115,67,111,108,111,117,114,101,100,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, +44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110, +83,101,99,115,34,44,91,34,89,101,97,114,34,44,34,87,101,101,107,100,97,121,34,44,34,78,111,34,93,41,125,59, +69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,41,59,67,2,0,0,97,110,116,111, +110,99,108,107,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,2,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,175,254,175,255,255,234,250,170,170,255,255,240,15,244,11, -255,255,64,240,0,0,191,255,144,15,208,11,255,253,0,240,0,0,191,252,0,12,0,11,255,208,0,240,0,0,191,252, -0,12,0,11,85,208,0,245,85,0,255,252,16,12,16,10,0,208,0,255,253,0,255,254,240,14,240,11,0,239,0,255, -252,1,255,255,240,15,240,10,0,255,0,255,252,2,255,255,240,15,240,11,255,255,0,255,240,3,255,255,240,15,240,11, -255,255,0,255,240,11,255,255,240,15,240,11,255,255,0,255,208,15,255,255,240,15,240,11,255,255,0,255,192,15,255,255, -240,15,240,11,255,255,0,255,192,47,255,255,240,15,240,11,21,255,0,255,0,63,255,255,240,15,240,10,0,255,0,255, -0,127,255,255,240,15,240,11,0,255,0,255,0,191,255,255,240,15,240,10,0,255,0,254,0,191,255,255,240,15,240,11, -255,255,0,253,0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255, -240,15,240,11,255,255,0,252,2,255,255,255,240,15,240,15,255,255,0,248,2,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,173,173,175,254,186,191,250,249,234,251,255,255,173,189,239,255, -239,191,255,170,190,235,255,255,250,253,191,254,191,191,250,235,171,251,255,255,174,175,255,250,190,191,250,186,234,230,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +254,175,254,175,255,255,234,250,170,170,255,255,240,15,244,11,255,255,64,240,0,0,191,255,144,15,208,11,255,253,0,240, +0,0,191,252,0,12,0,11,255,208,0,240,0,0,191,252,0,12,0,11,85,208,0,245,85,0,255,252,16,12,16,10, +0,208,0,255,253,0,255,254,240,14,240,11,0,239,0,255,252,1,255,255,240,15,240,10,0,255,0,255,252,2,255,255, +240,15,240,11,255,255,0,255,240,3,255,255,240,15,240,11,255,255,0,255,240,11,255,255,240,15,240,11,255,255,0,255, +208,15,255,255,240,15,240,11,255,255,0,255,192,15,255,255,240,15,240,11,255,255,0,255,192,47,255,255,240,15,240,11, +21,255,0,255,0,63,255,255,240,15,240,10,0,255,0,255,0,127,255,255,240,15,240,11,0,255,0,255,0,191,255,255, +240,15,240,10,0,255,0,254,0,191,255,255,240,15,240,11,255,255,0,253,0,255,255,255,240,15,240,11,255,255,0,252, +0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255,240,15,240,11,255,255,0,252,2,255,255,255,240,15,240,15, +255,255,0,248,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +173,173,175,254,186,191,250,249,234,251,255,255,173,189,239,255,239,191,255,170,190,235,255,255,250,253,191,254,191,191,250,235, +171,251,255,255,174,175,255,250,190,191,250,186,234,230,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,228,0,0,0,97,110,116,111,110,99,108,107,46,105,110,102,111,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,110,116,111,110,99,108,107,34,44,34,110,97, -109,101,34,58,34,65,110,116,111,110,32,67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34, -44,34,115,114,99,34,58,34,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58, -34,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44, -34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,97,110,116,111,110,99,108,107, -46,105,110,102,111,44,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,44,97,110,116,111,110,99,108,107,46,115, -101,116,116,105,110,103,115,46,106,115,44,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34,100,97,116,97,34,58, -34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,125,180,47,0,0,115,101,116,116,105,110,103,46,97,112,112,46, -106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101, -116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,66,65,78, -71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,59,10, -174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,59,10,173,115,101, -116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,123,115,116,111,114,97,103, -101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,115,101,116,116,105,110,103,115,41, -59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,123,172,111,61,115,101,116,116,105,110,103,115,46, -111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50,41,123,163,40,33,40,111,46,119,97,107,101,79, -110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117, -99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123,111,46,119,97,107,101,79,110,66,84,78,49,61, -180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,66, -84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160, -111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,111,46,119, -97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97, -110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125,10,170,103,84,111,73,110,116,101,114,110,97,108, -40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101,114,110,97,108,84,111,71,40,117,41,123,171,117, -47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,123,115,101,116,116,105,110,103,115, -61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108,111,103,58,181,44,113,117,105,101,116,58,48,44, -116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58,180,44,98,101,101,112,58,66,65,78,71,76,69, -74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110,101,58,48,44,72,73,68,58,181,44,99,108,111, -99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44,98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116, -105,111,110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44, -119,97,107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101, -79,110,84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114, -101,115,104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115, -116,84,105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, -41,59,125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115, -101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115, -101,116,83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79, -110,34,58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109, -101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32, -66,97,99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112, -112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119, -83,121,115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119, -66,76,69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115, -77,101,110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41, -125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83, -121,115,116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108, -101,39,58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105, -110,77,101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117, -40,41,44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108, -101,39,58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67, -108,111,99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,44,39,83,101,116,32,84,105, -109,101,39,58,40,41,162,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104,111, -119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101,110, -117,40,41,123,172,98,101,101,112,77,101,110,117,73,116,101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123,98, -101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101,112, -140,181,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118,162, -123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, -41,59,163,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86, -73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111, -117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59,125, -164,123,172,98,101,101,112,86,61,91,181,44,180,44,34,118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79,102, -102,34,44,34,80,105,101,122,111,34,44,34,86,105,98,114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73,116, -101,109,61,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101,120, -79,102,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58,98, -101,101,112,86,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93,44, -111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86,91, -118,93,59,163,40,118,138,49,41,123,97,110,97,108,111,103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123,102, -114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101,115, -101,116,40,41,44,50,48,48,41,59,125,164,163,40,118,138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86, -73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111, -117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100,97, -116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123, -39,116,105,116,108,101,39,58,39,65,108,101,114,116,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104, -111,119,77,97,105,110,77,101,110,117,40,41,44,39,66,101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101,109, -44,39,86,105,98,114,97,116,105,111,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105,98, -114,97,116,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58, -40,41,162,123,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46,118, -105,98,114,97,116,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110, -103,115,46,118,105,98,114,97,116,101,41,123,86,73,66,82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101,116, -84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41,59, -125,125,125,44,34,81,117,105,101,116,32,77,111,100,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115, -46,113,117,105,101,116,124,48,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109,115, -34,44,34,83,105,108,101,110,116,34,93,91,118,37,51,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, -116,105,110,103,115,46,113,117,105,101,116,61,118,37,51,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, -59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73,68, -71,69,84,83,41,87,73,68,71,69,84,83,91,34,113,109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59,125, -44,125,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111, -119,66,76,69,77,101,110,117,40,41,123,172,104,105,100,86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34,107, -98,34,44,34,99,111,109,34,44,34,106,111,121,34,93,59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75,98, -114,100,32,38,32,77,101,100,105,97,34,44,34,75,98,114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115,101, -34,44,34,74,111,121,115,116,105,99,107,34,93,59,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116, -105,116,108,101,39,58,39,66,108,117,101,116,111,111,116,104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115, -104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101,39, -58,40,41,162,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97,108, -117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97, -116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101,116, -116,105,110,103,115,46,98,108,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80, -114,111,103,114,97,109,109,97,98,108,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101, -114,101,112,108,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58, -40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46,98, -108,101,114,101,112,108,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68,39, -58,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120,79, -102,40,115,101,116,116,105,110,103,115,46,72,73,68,41,41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78,46, -108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97,110, -103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97,116, -101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123,118, -97,108,117,101,58,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46,112, -97,115,115,107,101,121,58,34,110,111,110,101,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109, -101,111,117,116,40,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105,115, -116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115,101, -116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34,41, -58,34,111,102,102,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104, -111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109,101, -77,101,110,117,40,41,123,170,99,108,40,120,41,123,171,103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101,116, -67,111,108,111,114,40,41,59,125,170,117,112,100,40,116,104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101,116, -116,105,110,103,115,46,116,104,101,109,101,61,116,104,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, -190,103,46,114,101,115,101,116,59,103,46,95,114,101,115,101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115,101, -116,61,170,40,110,41,123,171,103,46,95,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46,102, -103,41,46,115,101,116,66,103,67,111,108,111,114,40,116,104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61,170, -40,110,41,123,163,40,110,41,103,46,114,101,115,101,116,40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40,48, -44,48,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59,125, -59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41, -59,109,46,100,114,97,119,40,41,59,125,172,109,61,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,116,105, -116,108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115, -116,101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58, -99,108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40, -34,35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35, -102,102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44, -39,76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34, -41,44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98, -103,50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72, -58,99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58,181,125,41,59,125,44,39,67,117,115,116,111,109,105,122, -101,39,58,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,44,125,41,59,170, -115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84,40,116,44,118,41, -123,173,116,104,61,103,46,116,104,101,109,101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98,103,34,41,123,116, -104,91,39,100,97,114,107,39,93,61,40,118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117,112,100,40,116,104, -41,59,125,174,114,103,98,61,123,98,108,97,99,107,58,34,35,48,48,48,34,44,119,104,105,116,101,58,34,35,102,102, -102,34,44,114,101,100,58,34,35,102,48,48,34,44,103,114,101,101,110,58,34,35,48,102,48,34,44,98,108,117,101,58, -34,35,48,48,102,34,44,99,121,97,110,58,34,35,48,102,102,34,44,109,97,103,101,110,116,97,58,34,35,102,48,102, -34,44,121,101,108,108,111,119,58,34,35,102,102,48,34,44,125,59,173,99,111,108,111,114,115,61,91,93,44,110,97,109, -101,115,61,91,93,59,167,40,174,99,185,114,103,98,41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59,99,111, -108,111,114,115,46,112,117,115,104,40,99,108,40,114,103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123,39,39, -58,123,116,105,116,108,101,58,39,67,117,115,116,111,109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99,107,34, -58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123,102,103, -58,39,70,111,114,101,103,114,111,117,110,100,39,44,98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44,102,103, -50,58,39,70,111,114,101,103,114,111,117,110,100,32,50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117,110,100, -32,50,39,44,102,103,72,58,39,72,105,103,104,108,105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105,103,104, -108,105,103,104,116,32,66,71,39,44,125,59,91,34,102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34,98,103, -50,34,44,34,102,103,72,34,44,34,98,103,72,34,93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110,117,91, -108,97,98,101,108,115,91,116,93,93,61,123,109,105,110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108,101,110, -103,116,104,45,49,44,119,114,97,112,58,180,44,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111,108,111, -114,115,46,105,110,100,101,120,79,102,40,103,46,116,104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109,97,116, -58,118,162,110,97,109,101,115,91,118,93,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99,111,108, -111,114,115,91,118,93,59,163,40,116,139,39,102,103,39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115,101,116, -84,40,39,98,103,39,44,103,46,116,104,101,109,101,46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46,116,104, -101,109,101,46,102,103,139,99,41,115,101,116,84,40,39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41,59,115, -101,116,84,40,116,44,99,41,59,125,44,125,59,125,41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93,61,40, -41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117,40,109, -101,110,117,41,59,125,125,10,170,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101,110,117, -61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115, -97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,163, -40,33,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97,115,115, -107,101,121,46,108,101,110,103,116,104,140,54,41,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,34, -49,50,51,52,53,54,34,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105,61,48, -59,105,60,54,59,105,152,41,40,170,40,105,41,123,109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43,49,125, -96,93,61,123,118,97,108,117,101,58,48,124,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105,93,44, -109,105,110,58,48,44,109,97,120,58,57,44,111,110,99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116,116,105, -110,103,115,46,112,97,115,115,107,101,121,46,115,112,108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115,101,116, -116,105,110,103,115,46,112,97,115,115,107,101,121,61,112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116,101,83, -101,116,116,105,110,103,115,40,41,59,125,125,59,125,41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109, -101,110,117,41,59,10,125,170,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172,109,101, -110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68, -105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,183, -59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59, -125,125,59,10,163,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103, -115,46,119,104,105,116,101,108,105,115,116,46,102,111,114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91,100,46, -115,117,98,115,116,114,40,48,44,49,55,41,93,61,170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39, -82,101,109,111,118,101,92,110,39,43,100,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101,116,116, -105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115,46,119, -104,105,116,101,108,105,115,116,46,105,110,100,101,120,79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83,101,116, -116,105,110,103,115,40,41,59,125,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115, -116,77,101,110,117,44,53,48,41,59,125,41,59,125,125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101,118,105, -99,101,39,93,61,170,40,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32,100,101, -118,105,99,101,92,110,116,111,32,97,100,100,32,116,111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87,104,105, -116,101,108,105,115,116,34,41,46,116,104,101,110,40,170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108,108,76, -105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115, -116,77,101,110,117,40,41,59,125,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114, -115,40,39,99,111,110,110,101,99,116,39,41,59,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,170,40, -97,100,100,114,41,123,163,40,33,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116, -105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105,116,101, -108,105,115,116,46,112,117,115,104,40,97,100,100,114,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, -59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116, -39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69,46,115, -104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41,123,10, -174,108,99,100,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39,60,32, -66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68,32,66, -114,105,103,104,116,110,101,115,115,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105,103,104, -116,110,101,115,115,44,109,105,110,58,48,46,49,44,109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111,110,99, -104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118,160,49, -59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,66, -114,105,103,104,116,110,101,115,115,40,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41,59,125, -125,44,39,76,67,68,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46, -116,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110,99,104, -97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111, -117,116,40,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32,111,110, -32,66,84,78,49,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119, -97,107,101,79,110,66,84,78,49,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104, -97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, -66,84,78,49,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78, -49,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71,76,69, -74,83,50,41,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107, -101,32,111,110,32,66,84,78,50,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111, -110,115,46,119,97,107,101,79,110,66,84,78,50,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44, -111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97, -107,101,79,110,66,84,78,50,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, -110,66,84,78,50,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111, -110,32,66,84,78,51,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, -119,97,107,101,79,110,66,84,78,51,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99, -104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, -110,66,84,78,51,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84, -78,51,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99,116,46, -97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85,112,39, -58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70, -97,99,101,85,112,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, -58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101, -85,112,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85, -112,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,111, -117,99,104,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, -101,79,110,84,111,117,99,104,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97, -110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84, -111,117,99,104,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117, -99,104,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84, -119,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97, -107,101,79,110,84,119,105,115,116,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104, -97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, -84,119,105,115,116,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119, -105,115,116,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,104, -114,101,115,104,111,108,100,39,58,123,118,97,108,117,101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101,116,116, -105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109,105,110, -58,45,48,46,53,44,109,97,120,58,48,46,53,44,115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110,103,101, -58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104, -111,108,100,61,103,84,111,73,110,116,101,114,110,97,108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79,112,116, -105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101,58,115, -101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58,45,49, -53,48,48,44,109,97,120,58,49,53,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118, -162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118,160,45, -56,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,105, -109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116, -119,105,115,116,84,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101,112,58, -49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, -46,116,119,105,115,116,84,105,109,101,111,117,116,61,118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116,105,111, -110,115,40,41,59,125,125,125,41,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117,41,10, -125,170,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110,117,61, -123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107,39,58, -40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101,39,58, -123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,44,109,105,110,58,45,49,49, -44,109,97,120,58,49,51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, -116,105,110,103,115,46,116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,125,125,44,39,67,108,111,99,107,32,83,116,121,108,101,39,58,123,118,97,108,117,101,58,33,33,115,101, -116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97,116,58,118,162,118,63,34,49,50,104, -114,34,58,34,50,52,104,114,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34, -49,50,104,111,117,114,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,125,59, -10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108,101,109,101,110,117,41,59,10,125,170,115,104,111,119, -85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, -85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110, -77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111,39,58,123,118,97,108,117,101,58,69,46,99,108,105, -112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48,44,50,41,44,109,105,110,58,48,44,109,97,120,58, -50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34,44,34,83,104,111,119,34,44,34,76,111,103,34,93, -91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, -116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, -44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115, -115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46,46,92,110,84,97,107,101,115,32,97,112,112,114,111, -120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108,101,58,34,83,116,111,114,97,103,101,34,125,41,59, -114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,99,111,109,112,97,99,116,40,41,59,115,104,111, -119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119,114,105,116,101,32,83,101,116,116,105,110,103,115,39, -58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,46, -98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46, -114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106,115,39,41,41,59,34,41,59,108,111,97,100,40,34, -115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125,44,39,70,108,97,116,116,101,110,32,66,97,116,116, -101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,70,108,97,116,116,101,110,105, -110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32,99,97,110,32,116,97,107,101,32,104,111,117,114,115, -46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116,111,110,32,116,111,32,99,97,110,99,101,108,46,39, -41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,66,97,110,103,108,101, -46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40,66,97,110,103,108,101,46,115,101,116,71,80,83,80, -111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34, -41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101, -116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116, -67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111, -119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101, -116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101, -114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114, -41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,115,101, -116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49,48,48,48,59,166,40,105,153,41,59,125,44,49,41, -59,125,44,39,82,101,115,101,116,32,83,101,116,116,105,110,103,115,39,58,40,41,162,123,69,46,115,104,111,119,80,114, -111,109,112,116,40,39,82,101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115,63,39,44,123,116,105,116,108,101, -58,34,83,101,116,116,105,110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115, -104,111,119,77,101,115,115,97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41,59,114,101,115,101,116,83,101,116, -116,105,110,103,115,40,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,77,97,105,110,77,101,110,117,44, -53,48,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,44,39,84,117,114,110,32, -79,102,102,39,58,40,41,162,123,163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102,41,66,97,110,103,108,101, -46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40,41,125,125,59,10,163,40,66,97, -110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123,109,101,110,117,91,39,70,97,99,116,111,114,121, -32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,84,104,105,115,32, -119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104,105,110,103,33,39,44,123,116,105,116,108,101,58, -34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41, -123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101,114,109,105,110,97,108,46,115,101,116,67,111,110, -115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,40,41,59,125,164,115, -104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125,10,171,69,46,115,104,111,119,77,101,110,117,40, -109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,123,10,177,123,78,82, -70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123,125,10,66,108,117,101,116,111,111,116,104,46,115, -101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101,61,34,66,97,110,103,108,101,46,106,115,32,34, -43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,45,53,41,46,114,101,112, -108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111,119,80,114,111,109,112,116,40,110,97,109,101,43, -34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101,63,34,44,123,116,105,116,108,101,58,34,67,111, -110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114,162,123,163,40,115,101,116,116,105,110,103,115,46, -98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101,61,114,59,117,112,100,97,116,101,83,101,116,116, -105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46,115,108,101,101,112,40,41,59,125,99,97,116,99, -104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,41,59,10,125,170,115,104,111,119,67, -108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65,112,112,115,61,114,101,113,117,105,114,101,40,34, -83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,10,46,109,97,112,40,97, -112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171, -40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63,97,58,183,125,41,10,46,102,105,108,116,101,114, -40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44,98,41,162,97,46,115,111,114,116,111,114,100,101, -114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108,111,99,107,77,101,110,117,61,123,39,39,58,123, -39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111,99,107,39,44,125,44,39,60,32,66,97,99,107, -39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,125,59,10,99,108,111,99,107,65,112, -112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,97, -112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103,115,46,99,108,111,99,107,158,105,110,100,101,120, -139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,139,97,112,112,46,115,114,99,41,41,123,108,97, -98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111,99,107,77,101,110,117,91,108,97,98,101,108,93, -61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,141,97,112,112,46,115,114,99,41,123,115, -101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115,114,99,59,117,112,100,97,116,101,83,101,116,116, -105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,125,59,125,41,59,10,163,40,99, -108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123,99,108,111,99,107,77,101,110,117,91,34,78,111, -32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162,123,125,59,125,10,171,69,46,115,104,111,119,77, -101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115,104,111,119,83,101,116,84,105,109,101,77,101,110, -117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105,109,101,109,101,110,117,61,123,39,39,58,123,39, -116,105,116,108,101,39,58,39,83,101,116,32,84,105,109,101,39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123, -115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109,101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121, -115,116,101,109,77,101,110,117,40,41,59,125,44,39,72,111,117,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116, -72,111,117,114,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118, -43,50,52,41,37,50,52,59,100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39, -77,105,110,117,116,101,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117,116,101,115,40,41,44,111,110, -99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46, -115,101,116,77,105,110,117,116,101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,83,101,99,111,110,100,39,58, -123,118,97,108,117,101,58,100,46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110,99,104,97,110,103,101,58,170, -40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,83,101,99,111,110, -100,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,68,97,116,101,39,58,123,118,97,108,117,101,58,100,46,103, -101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40, -40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68,97,116,101,40,175,46,118,97,108,117,101,41,59, -125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,111,110,116,104,40,41,43,49, -44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,49,49,41,37,49, -50,41,43,49,59,100,46,115,101,116,77,111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59,125,125,44,39,89, -101,97,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41,44,109,105,110,58, -50,48,49,57,44,109,97,120,58,50,49,48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,100,46,115,101, -116,70,117,108,108,89,101,97,114,40,118,41,59,125,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,116,105, -109,101,109,101,110,117,41,59,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41, -123,10,173,97,112,112,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,112,112,32,83,101,116, -116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117, -40,41,44,125,10,174,97,112,112,115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47,92,46,115,101,116,116,105, -110,103,115,92,46,106,115,36,47,41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116,114,40,48,44,115,46,108, -101,110,103,116,104,45,49,50,41,41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116,111,114,97,103,101,46,114, -101,97,100,74,83,79,78,40,105,100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97,109,101,58,105,100,125,59, -171,123,105,100,58,105,100,44,110,97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111,114,100,101,114,58,97,46, -115,111,114,116,111,114,100,101,114,125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41,162,123,174,110,61,40,48, -124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40, -110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109, -101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46,108,101,110,103,116,104,139, -48,41,123,97,112,112,109,101,110,117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101,116,116,105,110,103,115,39, -93,61,40,41,162,123,125,59,125,10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40,97,112,112,41,123,97,112, -112,109,101,110,117,91,97,112,112,46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65,112,112,83,101,116,116,105, -110,103,115,40,97,112,112,41,125,59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97,112,112,109,101,110,117,41, -10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10,174,115,104,111,119,69,114, -114,111,114,61,109,115,103,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36,123,97,112,112,46,110,97, -109,101,125,58,92,110,36,123,109,115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32,103,111,32,98,97,99,107, -96,41,59,115,101,116,87,97,116,99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,44, -66,84,78,49,44,123,114,101,112,101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116,116,105,110,103,115,61,115, -116,111,114,97,103,101,46,114,101,97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116,105,110,103,115,46,106,115, -39,41,59,177,123,97,112,112,83,101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112,83,101,116,116,105,110,103, -115,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46, -110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114, -114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,163,40,191,97,112,112, -83,101,116,116,105,110,103,115,141,34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111,119,69,114,114,111,114,40, -39,73,110,118,97,108,105,100,32,115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112,112,83,101,116,116,105,110, -103,115,40,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,41,59,125,99,97, -116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32, -115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69, -114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119,77,97,105,110,77,101,110, -117,40,41,59,76,2,0,0,115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,48,48,194,0,255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,80, -0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0, -5,85,85,80,0,0,0,0,0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0,85,85,85,85,0,85,0,0, -0,1,85,81,85,85,85,85,69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0,0,5,85,85,94,170,170,181, -85,85,80,0,0,21,85,85,234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170,213,85,84,0,0,85,85,94, -170,170,170,170,181,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122,170,170,170,170,173,85,85,0, -0,21,85,106,170,160,10,170,169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0,0,0,85,234,170,0,0,170, -171,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170, -168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234,170,0,0,170,171,85,0,0, -0,1,85,234,170,0,0,170,171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0,0,85,85,122,170,170,170,170, -173,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170,181,85,85,0,0,21,85,87, -170,170,170,170,213,85,84,0,0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85,94,170,170,181,85,85,80,0, -0,5,85,85,85,250,175,85,85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0,0,0,85,0,85,85,85,85, -0,85,0,0,0,0,80,0,5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0, -5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0, -0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116,105,110,103,46,106,115,111,110, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116,114,117,101,44,34,98,108,101, -114,101,112,108,34,58,116,114,117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34,116,105,109,101,111,117,116,34, -58,49,48,44,34,118,105,98,114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112,34,58,34,118,105,98,34,44, -34,116,105,109,101,122,111,110,101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101,44,34,99,108,111,99,107,34, -58,110,117,108,108,44,34,49,50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114,105,103,104,116,110,101,115,115, -34,58,49,44,34,111,112,116,105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84,78,49,34,58,116,114,117,101, -44,34,119,97,107,101,79,110,66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,51,34,58, -116,114,117,101,44,34,119,97,107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115,101,44,34,119,97,107,101,79, -110,84,111,117,99,104,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105,115,116,34,58,116,114,117,101, -44,34,116,119,105,115,116,84,104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44,34,116,119,105,115,116,77,97, -120,89,34,58,45,56,48,48,44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58,49,48,48,48,125,125,255,255, -203,0,0,0,115,101,116,116,105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,115,101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34,83,101,116,116,105,110,103,115, -34,44,34,115,114,99,34,58,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58, -34,115,101,116,116,105,110,103,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,53,44,34,118,101, -114,115,105,111,110,34,58,34,48,46,52,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101, -109,34,44,34,102,105,108,101,115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111,44,115,101,116,116,105,110,103, -46,97,112,112,46,106,115,44,115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97,116,97,34,58,34,115,101,116, -116,105,110,103,46,106,115,111,110,34,125,255,99,56,0,0,97,98,111,117,116,46,97,112,112,46,106,115,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41, -59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,172,87,61,103,46,103,101,116, -87,105,100,116,104,40,41,44,72,61,103,46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,69,78,86,61,112,114, -111,99,101,115,115,46,101,110,118,59,10,172,77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114,121,40,41, -59,10,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172,105,109,103,61,97,116, -111,98,40,34,115,73,119,68,107,109,50,83,54,54,68,89,119,65,50,65,65,65,65,65,72,65,72,71,83,82,120,74, -69,107,65,65,103,109,71,71,66,120,68,73,65,68,73,100,65,70,74,73,98,65,72,70,57,72,80,48,48,107,66,85, -67,54,68,116,122,68,103,65,105,87,79,120,119,107,103,65,71,98,65,56,54,67,87,50,50,50,50,107,107,103,66,52, -104,79,50,54,47,88,68,68,119,65,119,107,69,69,69,103,89,89,65,43,86,87,50,50,119,69,65,65,103,103,119,69, -109,50,65,90,90,90,84,70,111,116,77,73,68,65,65,57,118,66,53,50,48,65,74,85,110,88,65,116,119,65,103,65, -105,71,120,79,119,50,119,111,43,98,65,109,105,83,65,72,52,65,81,85,107,65,72,77,107,79,50,47,54,54,84,89, -50,71,119,103,103,103,103,104,66,53,47,43,83,82,120,74,65,69,65,65,108,109,50,69,104,120,83,84,76,75,89,70, -70,70,66,65,68,65,47,57,57,72,80,48,48,107,72,111,67,54,68,117,122,65,65,65,67,87,79,120,119,107,103,43, -117,122,71,56,54,67,81,72,55,98,83,85,103,65,66,43,105,83,81,65,65,65,68,68,65,65,116,69,107,69,107,65, -65,65,65,50,107,104,120,73,65,72,65,65,103,109,71,76,65,68,75,68,76,76,111,65,65,65,69,68,68,83,81,81, -67,65,65,65,65,65,72,65,52,65,65,117,119,65,65,65,65,81,68,68,68,68,68,65,119,65,73,73,65,65,77,103, -65,89,81,85,65,65,65,52,105,111,110,103,65,73,65,71,65,66,113,69,107,107,107,65,72,72,71,71,104,104,120,73, -72,72,88,97,54,54,65,68,89,98,83,83,67,99,69,72,122,85,66,68,98,81,67,83,83,81,65,65,65,65,72,65, -116,116,68,68,68,68,65,65,67,81,68,68,68,68,65,49,52,71,71,71,65,66,69,69,65,89,81,87,66,65,73,68, -105,81,56,52,65,65,111,119,120,73,89,81,107,107,105,83,52,103,52,50,107,104,120,73,65,52,105,110,78,80,65,65, -49,119,65,111,84,107,107,65,66,67,83,65,65,83,81,81,105,107,109,50,83,81,72,65,70,65,65,65,71,119,65,65, -65,65,111,116,111,111,117,74,119,65,73,73,65,66,69,103,89,89,65,65,74,73,73,111,67,73,56,52,65,70,116,50, -120,74,67,52,69,107,98,89,69,69,72,80,65,66,120,73,65,65,102,83,113,113,83,81,49,119,70,67,99,69,69,65, -65,67,83,65,65,65,65,65,103,103,109,65,67,116,118,47,57,49,103,71,103,69,119,72,47,65,116,111,70,70,71,50, -119,71,71,65,65,66,69,69,68,89,65,65,74,74,65,116,65,73,50,71,119,57,116,119,119,119,102,52,65,109,50,65, -72,47,53,53,65,82,48,107,48,82,65,72,78,80,75,116,50,49,111,84,52,65,65,111,70,67,83,104,89,67,83,65, -103,107,109,119,67,116,65,65,70,87,111,87,103,69,121,67,83,65,111,116,116,111,117,98,50,71,65,65,65,65,77,103, -65,65,65,65,74,74,65,70,67,65,119,119,119,57,70,65,71,49,116,52,57,116,104,53,65,103,47,80,69,82,50,50, -84,47,65,67,54,54,75,111,112,117,67,100,56,107,107,115,65,69,65,84,81,67,65,65,103,103,109,70,67,116,115,110, -70,97,119,71,103,69,119,69,107,65,65,65,68,98,117,116,119,71,65,73,66,73,65,65,65,65,65,74,109,104,73,89, -65,65,119,65,51,53,120,65,103,50,50,52,57,116,53,80,65,65,52,65,69,82,121,83,77,43,52,107,65,69,105,107, -70,111,122,111,43,50,50,118,74,80,65,90,103,67,67,69,65,103,109,50,67,116,103,65,116,116,71,118,71,119,66,74, -65,65,65,71,65,68,71,71,71,71,120,66,66,65,65,65,74,66,66,77,107,107,73,65,83,81,65,65,53,43,50,69, -69,48,122,98,57,116,110,47,65,72,52,117,65,82,49,116,111,47,65,110,52,107,107,107,103,67,101,65,57,116,116,115, -65,69,65,65,65,67,83,65,65,65,65,65,65,116,103,65,111,111,65,71,65,65,66,65,65,120,119,71,65,68,71,71, -71,65,65,73,66,73,65,65,73,66,66,77,107,107,80,47,81,85,107,65,72,53,120,65,110,71,76,68,52,65,65,69, -107,65,81,117,81,82,116,83,86,52,65,69,65,69,107,107,65,84,111,119,52,65,65,65,65,65,83,106,68,70,67,83, -65,65,65,65,81,65,103,65,116,111,65,111,65,65,66,73,65,118,103,71,68,68,71,50,71,65,65,65,65,65,71,119, -74,66,65,74,107,104,80,74,83,71,50,67,83,119,65,65,67,84,122,98,52,69,69,65,103,71,67,117,81,81,116,121, -49,52,72,107,65,119,107,103,103,100,65,71,52,65,81,65,65,65,48,122,68,70,67,65,67,50,119,68,68,65,69,110, -116,111,72,49,57,65,116,50,65,121,119,71,65,89,71,71,65,65,65,65,65,65,119,65,65,65,65,66,77,74,72,47, -81,81,65,65,67,71,65,65,83,70,89,65,52,68,106,65,103,119,67,117,67,65,116,83,49,111,65,65,66,74,69,69, -68,98,98,98,98,98,98,89,65,65,105,84,98,116,113,86,67,98,89,81,81,81,65,65,116,116,65,98,114,70,65,71, -65,81,65,71,50,71,71,71,71,119,65,65,65,81,119,119,65,65,65,107,104,73,71,109,76,84,73,107,67,119,68,65, -67,52,80,73,65,65,65,65,103,65,81,117,81,65,116,74,78,111,65,65,66,65,77,110,47,74,73,65,73,77,65,69, -69,65,65,68,68,70,67,50,49,65,111,68,68,65,65,65,65,65,65,98,114,65,117,50,83,82,74,65,65,73,65,65, -65,65,65,65,65,65,119,71,65,65,65,107,103,65,69,107,78,75,54,105,67,68,68,65,65,65,43,80,65,68,98,65, -71,50,65,117,67,65,116,74,86,111,73,111,112,83,69,122,55,74,65,65,66,69,103,69,103,65,65,68,68,70,67,119, -119,65,65,65,81,67,67,65,65,65,65,98,114,65,70,65,81,81,73,65,74,73,65,75,99,117,52,65,65,67,71,119, -65,72,47,107,110,47,71,109,106,97,83,107,83,65,90,66,89,65,74,52,65,68,114,65,71,70,65,117,65,81,70,75, -78,65,65,116,112,74,109,88,118,66,78,66,73,77,107,69,69,65,65,68,68,70,67,50,119,74,74,73,65,85,85,81, -65,65,65,65,70,70,111,65,83,81,77,103,104,73,65,65,65,65,65,65,65,67,65,65,65,47,72,52,47,72,65,65, -90,75,54,69,72,65,52,73,65,65,65,65,65,68,98,68,89,70,65,117,65,67,70,114,116,111,119,70,66,77,121,100, -73,66,65,65,66,69,103,71,50,50,65,65,65,69,115,51,119,65,76,98,65,85,85,81,65,65,66,74,65,67,81,83, -65,70,73,103,103,56,107,56,47,107,110,56,65,65,67,97,65,65,74,47,52,65,71,111,81,82,89,107,69,47,66,66, -47,43,65,71,65,65,65,89,65,65,116,65,119,65,86,118,100,117,50,65,74,109,84,111,65,66,73,65,73,77,65,119, -65,65,119,65,65,103,103,110,47,52,76,65,65,69,85,65,65,65,66,65,73,81,67,65,86,108,119,72,65,43,50,50, -43,43,43,51,65,65,119,72,47,66,120,74,65,89,69,65,103,72,72,65,72,72,65,65,100,50,119,50,50,69,65,68, -65,65,65,65,65,65,113,111,55,111,119,66,75,83,100,73,65,65,52,52,65,65,65,71,71,50,65,65,65,69,107,65, -47,47,76,65,65,65,103,65,65,52,66,65,73,83,83,65,86,117,50,65,65,54,113,54,54,54,54,88,69,107,119,72, -47,66,73,73,68,98,68,103,103,110,52,70,111,109,119,65,77,87,71,71,71,69,65,65,89,65,65,65,65,69,116,115, -72,100,111,65,106,84,112,119,65,65,69,65,65,65,65,71,65,65,65,98,98,89,103,72,73,52,76,70,100,72,72,67, -50,65,66,66,65,81,67,83,108,111,119,107,65,55,98,55,55,55,55,102,69,65,119,72,47,73,73,65,98,98,97,65, -107,65,65,49,115,71,71,65,83,87,69,109,119,69,103,98,69,72,69,65,65,65,120,79,116,70,112,74,122,100,80,65, -65,65,52,52,65,65,65,65,50,119,65,65,89,65,65,66,74,76,98,68,68,72,52,67,71,65,66,74,65,81,67,107, -108,65,72,99,65,47,57,57,57,57,118,57,69,107,67,97,65,74,73,65,68,98,66,111,103,108,117,50,65,109,119,71, -83,87,103,109,71,69,56,52,72,47,47,65,65,65,67,81,65,65,73,104,82,112,52,111,67,65,56,52,65,67,83,83, -119,65,65,89,89,111,65,72,73,52,65,70,100,65,65,67,83,74,74,74,74,74,74,107,108,65,119,107,65,68,65,65, -89,65,71,65,69,65,65,98,89,77,73,65,65,89,65,65,103,108,50,49,65,71,71,71,83,81,107,103,65,69,109,103, -65,52,52,83,83,83,83,73,69,66,71,97,100,80,65,103,107,103,47,105,83,83,74,75,71,65,65,68,89,72,72,67, -81,65,65,72,88,65,65,65,89,65,65,65,65,66,77,107,111,65,119,107,65,68,65,68,65,81,49,119,69,65,68,70, -65,103,103,65,65,65,65,68,76,50,50,116,65,50,65,119,67,65,103,103,73,69,56,52,67,72,65,87,121,50,83,76, -111,73,109,98,112,103,103,89,103,103,107,105,116,116,74,75,65,89,65,65,65,72,72,86,113,66,103,83,83,83,47,107, -73,71,65,119,119,120,74,107,111,65,65,65,65,68,65,89,65,81,71,65,72,47,68,117,111,107,103,69,69,103,50,65, -97,117,50,116,111,65,65,65,105,103,119,66,66,65,65,65,66,47,52,83,83,83,81,74,66,69,121,100,56,52,89,81, -107,103,65,67,83,83,74,75,74,74,74,107,107,72,72,81,67,65,110,83,54,83,47,107,89,119,119,119,119,120,53,107, -111,65,119,89,89,68,68,50,81,81,65,71,72,88,68,70,68,108,103,69,65,103,119,120,86,108,50,116,65,107,103,69, -107,107,74,65,73,119,65,65,66,107,103,83,83,83,81,76,111,109,84,53,47,103,67,73,68,65,68,65,65,67,83,83, -81,81,81,47,47,72,47,67,81,65,103,87,65,83,47,107,73,50,119,50,119,120,74,107,111,65,119,89,65,68,101,50, -67,65,65,103,103,47,68,65,68,70,65,69,65,103,50,67,76,77,56,108,111,66,103,65,110,103,66,65,65,103,103,81, -65,65,65,83,83,83,81,74,69,121,100,80,56,52,73,65,68,68,68,72,88,65,65,65,65,65,65,83,83,65,65,65, -68,98,65,65,65,83,47,107,89,119,119,119,119,66,53,107,78,65,65,89,89,68,101,50,65,65,69,71,69,72,65,98, -89,108,65,65,107,65,119,122,90,102,47,57,66,66,103,69,47,56,71,71,65,98,89,65,65,65,71,65,69,98,65,73, -109,84,115,69,103,66,74,65,68,89,89,72,54,65,65,68,98,65,65,65,65,65,65,77,73,89,50,119,50,119,50,107, -73,119,119,119,119,119,74,74,78,65,65,65,65,68,68,119,65,65,103,71,65,103,65,65,69,70,89,65,65,65,65,69, -76,77,56,108,112,66,103,65,110,103,66,74,65,103,103,65,67,65,65,65,69,89,90,69,121,100,73,103,73,69,107,72, -110,65,65,67,83,81,71,50,122,66,83,74,108,108,73,74,76,81,71,65,119,65,50,107,65,65,65,65,65,65,75,83, -73,65,72,47,65,68,65,89,65,83,72,77,98,116,98,104,52,107,65,65,65,65,119,70,74,89,65,65,66,66,103,71, -87,87,87,87,65,65,119,65,65,65,65,69,69,98,65,109,84,112,119,104,79,69,69,69,107,71,74,119,65,65,65,50, -89,98,65,65,108,65,73,77,76,98,48,119,50,119,69,107,69,65,103,110,74,74,75,83,73,65,52,65,52,68,65,68, -65,67,72,77,107,107,107,104,52,72,65,65,65,65,83,71,84,74,74,73,103,73,103,65,65,65,65,65,69,56,56,56, -56,71,50,65,103,89,99,121,100,69,50,109,74,65,66,72,110,71,107,119,81,67,65,50,89,89,65,65,65,74,120,73, -65,65,65,65,119,65,69,107,69,103,103,47,79,50,76,74,73,65,111,65,111,65,65,65,70,107,115,65,107,67,83,83, -72,65,72,65,65,66,74,80,89,79,101,73,69,107,65,65,65,71,79,69,107,81,65,65,65,71,50,65,69,107,109,107, -104,66,107,50,120,65,65,67,83,66,107,73,65,65,65,119,65,69,103,103,65,65,73,65,72,47,107,104,74,65,69,107, -69,69,103,74,79,49,78,65,65,70,106,68,108,65,65,71,65,115,103,65,103,71,50,87,65,65,65,65,119,120,74,79, -103,76,76,73,65,65,68,98,52,66,120,65,103,81,69,65,107,71,50,65,69,69,105,99,73,65,69,65,65,65,65,107, -105,48,65,65,67,65,65,65,65,69,69,103,65,65,73,65,72,47,107,104,74,65,52,52,69,65,103,65,50,70,116,65, -65,70,107,99,108,65,71,71,71,69,65,65,107,71,121,50,52,72,74,52,65,65,74,70,111,68,98,65,65,47,65,68, -52,71,79,65,105,81,69,69,65,109,50,65,77,109,106,107,107,74,48,119,47,52,65,67,105,103,119,67,65,65,85,107, -107,107,107,103,65,65,65,65,72,47,107,104,74,65,72,65,65,65,65,71,119,65,68,65,65,65,99,107,101,65,71,71, -71,65,65,65,69,71,87,50,65,73,65,65,67,65,66,74,119,70,89,65,65,65,68,68,65,65,67,81,65,90,89,107, -69,109,81,81,69,121,108,73,66,78,48,49,47,52,65,65,103,119,68,65,83,83,72,47,47,56,107,103,65,65,65,65, -65,52,69,65,73,67,88,107,71,52,69,56,50,65,98,65,103,107,106,106,71,119,65,119,119,65,65,72,107,67,83,83, -72,65,72,69,107,107,66,74,73,70,119,89,65,72,65,89,107,107,103,101,89,76,73,65,65,87,83,81,107,69,104,65, -66,74,65,69,103,65,65,71,65,103,89,89,69,103,66,74,74,73,107,65,65,65,65,111,65,65,65,65,65,65,88,103, -72,79,80,47,65,119,65,65,47,47,52,89,50,65,65,65,52,52,52,52,52,65,116,111,83,88,65,69,69,69,66,74, -81,69,71,89,65,72,65,65,65,103,81,89,89,90,89,65,65,88,82,85,69,100,103,65,65,73,103,103,106,65,65,65, -109,65,98,89,69,65,65,65,65,65,65,50,98,107,57,111,70,52,69,72,78,116,72,65,109,48,48,56,65,73,65,65, -74,74,73,65,71,121,83,81,52,52,52,72,65,65,65,111,81,65,103,65,65,65,65,99,103,69,65,119,65,72,65,65, -65,103,67,107,103,65,65,65,65,83,81,109,85,112,103,65,65,73,69,106,98,98,65,65,65,65,89,90,69,103,69,56, -72,47,65,71,65,119,70,113,86,111,65,72,72,66,65,50,72,79,73,69,87,65,65,65,80,107,107,107,103,81,69,81, -69,65,110,72,72,65,70,65,83,65,98,50,81,81,65,106,89,89,89,98,102,72,65,65,65,103,65,69,71,119,65,65, -119,66,69,121,99,73,103,65,65,65,103,106,67,68,65,69,83,81,65,81,65,103,69,56,69,107,65,71,71,69,77,86, -113,65,65,88,57,112,73,119,71,52,67,81,105,65,65,65,80,110,47,47,52,65,107,81,103,103,103,52,72,87,86,65, -81,65,102,50,65,65,65,99,65,69,107,65,65,54,83,83,81,103,65,69,71,66,74,72,65,65,109,107,104,65,65,65, -65,69,103,103,55,52,56,56,54,65,72,88,69,103,56,107,65,47,52,71,119,66,70,86,111,65,65,88,72,66,65,50, -83,83,81,83,69,65,65,65,80,104,74,74,73,81,105,65,107,103,104,53,68,65,68,65,83,87,53,57,81,81,65,106, -83,81,105,65,65,67,81,67,88,47,65,69,65,120,65,65,66,65,120,107,77,100,71,65,50,65,71,65,68,65,110,47, -105,65,119,81,119,65,65,65,72,47,47,71,71,66,70,86,83,65,65,88,70,65,65,65,111,111,65,73,65,65,65,65, -107,107,103,65,107,107,103,65,103,103,110,72,111,50,119,111,65,119,119,65,65,65,65,99,81,65,105,65,65,97,86,97, -82,74,65,107,109,120,73,65,66,104,82,104,84,114,50,119,119,119,119,119,73,73,56,56,54,72,65,65,72,65,65,65, -65,107,103,71,65,48,77,86,113,65,65,81,65,65,65,65,116,111,111,65,65,65,105,65,47,47,52,65,52,65,65,65, -65,65,66,53,103,119,119,103,69,71,69,65,70,65,103,106,83,65,67,81,65,113,84,67,88,80,65,65,65,66,65,65, -66,82,100,73,85,100,50,119,119,119,50,119,67,65,72,110,83,67,67,67,65,65,65,65,69,69,69,65,65,65,66,113, -81,66,74,117,50,65,65,89,111,111,111,81,65,69,65,81,74,74,73,83,83,81,65,65,52,52,52,65,65,119,119,74, -73,107,103,65,98,89,119,99,81,68,98,65,70,89,100,65,72,80,65,65,65,66,65,65,104,74,112,65,83,119,49,78, -50,65,119,119,65,65,122,98,65,65,69,85,81,119,65,65,57,103,103,52,65,65,69,116,111,65,66,111,66,65,68,68, -65,65,72,72,65,65,105,65,65,88,110,47,65,116,111,65,65,65,65,65,65,71,65,66,65,69,65,65,68,65,81,106, -81,103,89,65,65,69,69,69,65,65,65,65,65,72,65,98,97,102,73,74,73,119,65,73,65,65,116,111,65,71,50,89, -66,74,77,107,81,47,52,72,52,69,65,47,65,69,73,65,65,66,74,111,104,67,68,98,65,72,65,119,65,65,103,81, -65,52,53,74,65,50,119,65,65,65,98,89,65,65,65,74,67,69,67,65,89,89,65,99,65,89,90,66,74,65,50,119, -65,119,65,65,65,54,52,98,98,54,52,73,119,119,65,119,65,65,111,111,67,67,111,83,81,74,77,85,81,107,103,116, -118,65,72,65,98,89,65,65,71,120,65,111,65,67,68,65,65,65,47,52,65,65,67,73,73,110,85,107,98,98,89,65, -65,68,68,68,98,98,98,89,65,85,81,65,65,65,104,65,65,98,102,66,53,69,69,69,71,71,79,79,54,52,65,98, -100,65,65,74,71,83,81,111,65,65,116,111,67,83,111,83,82,73,65,65,65,119,65,116,111,47,52,65,65,52,65,65, -71,71,74,98,98,97,65,98,65,65,52,52,65,73,73,73,73,81,66,73,98,65,65,89,65,68,68,68,116,116,116,118, -72,69,65,65,71,65,43,81,107,83,118,66,53,65,65,65,65,120,120,120,83,81,116,98,100,111,65,73,65,83,81,119, -65,65,111,65,105,67,116,81,81,80,47,47,52,119,65,116,118,103,110,65,119,52,83,65,71,71,65,65,65,47,72,65, -65,73,65,65,65,66,65,73,73,52,107,107,65,65,65,68,52,65,98,89,47,47,47,55,55,69,88,78,107,103,79,56, -103,83,73,65,65,116,111,65,67,65,79,48,54,52,114,98,98,117,65,73,65,83,81,65,65,65,111,119,103,65,69,48, -66,80,74,74,52,68,89,102,56,69,69,47,98,89,83,81,71,71,65,65,72,65,53,65,65,73,103,103,103,81,81,74, -73,66,74,74,73,65,65,65,89,65,80,73,116,116,116,118,47,69,122,106,69,65,65,85,107,82,76,65,68,114,111,107, -105,81,77,65,65,98,98,98,98,98,89,73,119,65,65,72,103,68,65,109,103,65,71,79,65,68,65,65,89,68,98,89, -52,103,103,52,65,65,81,65,71,119,67,56,65,47,72,65,47,74,69,69,65,67,65,69,69,83,65,65,116,116,65,65, -68,65,47,52,98,98,98,89,52,65,73,65,103,103,73,66,107,74,76,116,114,116,111,50,119,81,79,109,65,99,106,106, -106,107,89,65,65,65,65,72,107,74,89,48,119,68,69,48,65,66,47,47,73,65,98,65,65,69,109,82,65,67,83,65, -65,65,67,56,65,103,103,65,47,67,113,113,65,103,103,71,109,83,65,70,65,65,111,70,111,89,80,73,65,65,65,72, -47,72,75,88,73,65,52,65,107,65,76,109,68,103,65,65,107,73,73,107,109,99,107,116,115,107,101,119,119,65,65,72, -56,74,68,65,65,98,65,65,65,65,65,65,65,65,65,65,65,107,121,78,103,65,83,70,111,47,54,56,69,115,115,65, -84,65,86,87,71,69,119,66,120,83,65,111,50,119,70,68,100,111,65,65,65,65,65,72,72,52,82,52,70,116,107,77, -47,50,73,103,119,108,108,108,104,106,98,69,121,98,98,98,98,98,101,65,119,65,103,103,106,89,65,98,68,65,89,65, -65,65,65,65,65,65,65,67,67,87,82,116,119,111,81,81,116,52,67,69,69,115,115,65,47,65,75,71,50,71,65,65, -73,83,119,111,119,71,70,73,76,100,67,67,81,65,65,72,72,65,65,103,65,111,85,107,65,47,77,109,50,107,69,65, -107,73,52,65,68,112,65,65,65,65,50,67,83,119,103,103,106,68,69,65,89,65,65,65,65,65,65,81,65,81,98,97, -83,81,65,73,73,111,67,65,111,47,67,69,65,106,103,65,47,65,65,66,120,65,119,65,65,83,65,111,119,71,72,72, -72,65,67,67,65,65,83,56,65,68,65,103,65,111,77,77,47,116,65,119,119,119,70,65,65,65,56,65,70,73,68,118, -114,65,65,67,67,65,69,77,68,89,120,119,65,119,68,68,65,65,65,83,67,81,116,113,67,70,116,74,73,65,89,89, -89,52,67,69,65,106,103,66,74,66,72,65,119,72,71,65,65,83,65,111,50,119,66,65,66,65,83,67,81,65,88,52, -65,89,69,56,111,111,82,74,107,65,71,119,119,50,69,65,65,65,65,65,66,65,68,118,114,65,65,67,83,65,66,104, -68,69,73,77,65,65,76,74,66,65,65,81,81,81,50,119,65,67,83,73,76,68,68,68,68,47,52,65,65,98,89,66, -74,65,65,111,65,111,119,65,65,83,65,111,119,65,118,72,72,65,65,65,65,65,47,103,109,119,65,47,111,111,74,65, -81,65,87,71,50,71,70,65,65,65,65,65,73,73,68,118,114,65,108,75,67,65,100,57,98,65,120,119,65,65,76,73, -89,68,65,65,65,47,65,65,65,70,116,73,73,89,65,65,65,65,65,65,65,65,65,71,50,86,82,80,118,52,65,65, -65,83,89,70,119,70,65,81,65,65,65,65,65,65,103,69,65,119,65,110,116,111,82,73,83,67,87,119,65,50,72,52, -52,65,65,65,68,65,68,118,114,103,108,76,65,112,115,99,112,65,69,65,104,103,76,74,66,65,65,65,72,72,66,74, -74,77,107,65,72,80,65,65,65,72,110,83,81,65,89,101,50,86,82,112,118,118,65,65,65,83,79,71,116,111,65,65, -65,52,72,65,72,66,73,65,65,81,65,110,47,52,74,65,81,81,81,50,50,119,72,72,71,71,71,71,65,89,68,72, -114,110,108,73,111,111,115,107,111,65,65,65,73,65,65,65,65,65,65,89,72,47,65,65,65,72,47,107,104,53,67,66, -69,66,74,83,67,65,98,69,107,83,82,78,118,57,72,119,65,65,73,65,69,65,56,52,72,72,65,65,65,119,66,65, -65,67,67,83,72,103,82,47,81,65,81,65,65,65,72,47,43,119,65,119,67,65,65,65,69,107,108,76,70,111,70,108, -65,119,65,65,103,65,68,67,65,65,68,55,72,72,72,47,47,56,107,50,51,80,65,65,65,72,110,81,83,65,98,69, -107,86,82,112,118,118,65,43,103,103,87,50,107,103,107,103,72,47,65,69,65,50,73,65,65,65,65,69,69,65,74,65, -47,47,110,65,65,72,70,116,117,71,65,119,73,81,111,65,69,52,108,76,65,115,69,111,106,119,69,65,73,65,68,85, -81,65,68,65,65,65,65,103,103,103,65,65,65,65,65,65,65,65,65,67,83,65,89,89,65,86,82,78,118,52,72,119, -103,103,81,69,69,69,56,52,72,72,72,65,72,119,66,65,65,65,65,65,103,65,111,74,53,102,72,119,69,52,57,65, -65,65,65,65,101,65,111,65,69,49,116,65,65,103,103,103,103,119,103,103,104,103,98,83,81,83,81,89,65,49,66,52, -52,52,65,47,52,68,47,47,47,55,65,65,65,81,65,82,65,73,65,83,65,65,65,65,69,65,65,80,77,65,65,65, -65,65,65,47,56,104,73,65,72,47,65,107,107,103,71,65,55,80,65,119,67,52,52,116,65,65,65,65,73,119,111,65, -69,57,116,69,103,69,48,65,47,119,69,65,65,65,98,81,81,65,81,68,71,49,111,107,48,50,119,56,107,65,69,107, -107,65,65,67,81,71,107,120,76,73,67,81,65,80,103,65,65,69,107,53,56,65,83,121,98,98,89,65,109,48,65,65, -54,83,52,103,103,103,50,50,47,55,65,50,50,52,57,65,65,103,107,65,89,89,117,65,69,70,116,109,48,65,103,119, -119,69,105,107,72,47,107,110,47,65,84,55,65,83,71,71,119,119,50,56,56,65,65,69,65,65,107,81,67,65,109,104, -90,73,67,81,107,107,107,107,107,71,50,80,73,65,67,83,89,89,89,69,71,119,103,72,121,83,88,65,65,65,71,65, -53,53,65,50,75,72,68,114,89,119,119,119,73,119,111,65,72,107,103,109,48,65,71,71,71,65,67,65,71,74,48,51, -110,81,81,89,65,81,65,50,50,50,50,47,56,65,65,69,89,89,107,103,65,84,69,48,107,107,65,77,107,107,107,107, -107,72,71,119,69,105,83,67,98,98,56,56,50,50,107,43,83,67,83,52,65,103,65,65,55,80,72,119,67,65,65,89, -71,119,65,65,68,65,111,66,68,87,81,69,103,65,71,71,71,65,67,65,69,107,48,51,47,67,68,65,65,65,65,65, -65,65,65,56,107,68,69,69,98,89,116,103,107,75,73,65,103,103,66,66,107,107,107,107,107,72,43,119,69,116,86,65, -99,48,102,47,122,101,47,43,81,67,83,52,69,65,69,107,65,65,69,81,71,103,68,98,89,65,50,51,65,72,111,65, -72,81,81,67,65,107,107,109,65,67,67,67,119,65,65,65,70,116,101,89,71,119,111,65,65,65,65,81,65,98,99,107, -89,89,74,103,69,82,65,65,103,69,80,72,73,65,65,69,107,72,71,65,69,116,86,65,47,72,56,56,68,68,107,43, -81,83,83,52,69,103,69,107,47,52,65,65,65,65,65,66,49,73,107,119,65,65,111,66,89,69,65,83,65,67,67,65, -65,65,83,81,65,65,73,65,78,86,98,89,119,65,116,98,65,65,67,54,68,89,98,65,65,65,74,69,103,65,65,65, -65,65,73,65,73,65,65,69,107,65,65,65,69,105,81,65,47,47,52,65,69,119,65,43,83,83,83,52,69,65,69,107, -52,52,73,66,66,73,74,71,116,103,65,51,72,72,111,65,52,65,98,97,81,67,67,65,67,65,65,65,72,83,82,66, -70,116,89,89,119,65,116,98,65,72,88,88,88,98,89,111,65,111,65,65,65,65,65,65,65,65,66,74,119,65,65,69, -107,65,65,65,65,65,65,65,47,47,52,65,69,71,68,102,83,83,88,69,107,103,65,65,47,52,65,65,65,73,76,66, -115,73,119,119,65,119,65,116,111,72,98,97,65,65,65,81,83,81,81,68,65,52,84,76,65,81,65,65,119,65,98,100, -111,65,67,54,65,68,65,111,65,111,65,65,65,65,66,83,73,65,65,65,119,65,65,69,107,65,66,73,65,67,67,83, -80,47,73,65,69,71,98,98,47,47,52,65,117,111,68,89,65,52,73,66,66,73,73,90,103,73,50,119,65,73,65,111, -52,65,66,65,65,69,56,81,67,65,81,114,65,67,84,68,67,83,107,65,71,119,98,105,73,65,65,81,47,52,71,70, -70,66,74,65,65,65,66,47,73,52,65,52,119,65,65,107,107,65,66,66,50,121,67,65,74,74,73,65,69,71,98,98, -52,47,52,65,121,119,99,106,107,103,73,66,65,65,65,68,74,65,107,103,65,81,65,116,65,65,66,111,65,103,103,105, -83,83,65,84,65,52,81,65,67,67,65,65,65,65,98,49,103,65,65,52,56,52,119,49,70,66,66,65,65,65,66,83, -73,65,65,65,50,50,50,69,107,65,66,73,74,75,67,81,53,74,52,65,65,65,89,98,47,65,52,65,76,73,99,106, -48,119,73,66,65,65,65,65,89,52,65,65,81,119,103,118,65,65,66,65,69,65,65,69,83,81,65,84,72,83,88,47, -67,83,103,48,65,65,98,75,89,66,65,65,47,52,47,119,111,66,66,65,65,65,65,65,65,65,119,65,68,77,81,83, -107,81,66,66,107,105,83,65,52,65,52,65,65,65,65,98,72,47,65,65,65,65,99,106,107,103,66,73,65,65,69,65, -68,65,65,65,72,80,65,116,111,65,81,65,103,65,65,65,103,65,65,116,65,65,71,65,67,67,65,48,68,52,98,98, -65,66,114,119,65,71,47,51,72,73,73,65,65,65,67,65,65,103,65,103,90,105,67,67,67,65,66,73,65,65,65,65, -47,47,52,65,73,73,109,84,65,52,65,65,65,65,68,89,65,65,67,52,65,65,107,103,65,89,103,69,65,65,65,65, -67,67,88,118,65,65,65,47,110,56,47,107,56,81,50,119,67,67,107,48,72,89,98,98,65,66,114,89,65,119,50,67, -83,65,65,65,119,81,68,65,81,69,107,68,77,67,67,67,81,65,65,83,68,65,89,65,68,101,119,65,74,77,121,89, -65,65,65,65,69,65,68,89,47,47,72,67,65,69,107,107,65,68,69,103,65,73,73,66,67,67,114,114,111,65,65,72, -110,56,110,110,56,87,50,119,65,65,65,65,65,65,65,65,66,66,116,89,103,103,65,107,107,103,52,52,65,68,70,68, -65,65,103,65,65,72,68,65,65,65,67,65,68,68,98,65,89,101,71,71,79,73,65,65,65,65,65,65,107,103,70,116, -65,52,54,72,65,107,107,103,103,68,99,103,65,73,73,73,75,67,65,65,65,65,65,72,107,56,56,110,47,87,120,50, -65,98,107,107,107,107,107,107,104,74,66,65,103,103,65,110,47,103,47,56,103,65,117,111,65,47,52,65,65,72,89,89, -119,70,67,65,68,65,89,65,89,101,71,71,79,73,65,74,97,81,119,69,69,69,70,65,65,47,72,81,69,107,107,72, -69,65,65,65,65,119,119,50,119,81,65,65,65,65,65,72,110,56,56,107,56,87,50,50,65,101,101,50,50,50,50,50, -119,65,65,52,71,70,100,110,118,103,47,56,105,100,51,49,97,107,103,67,65,72,89,89,119,70,65,83,98,65,65,65, -68,101,71,109,71,69,65,65,89,81,119,65,107,103,70,116,119,52,119,119,65,107,107,103,65,65,50,50,50,50,119,119, -119,65,65,65,65,65,65,47,69,65,65,65,65,87,50,50,65,98,69,65,80,73,72,47,65,110,103,65,103,106,114,110, -47,103,47,47,52,65,117,111,65,83,81,65,65,47,68,71,65,70,116,65,65,65,65,69,65,71,48,53,48,107,65,73, -97,81,65,69,69,69,70,65,50,50,119,111,119,69,107,107,72,65,50,65,65,65,65,65,65,71,65,65,65,65,65,50, -69,47,56,114,111,50,119,50,65,89,100,89,47,52,52,65,52,47,52,65,103,108,100,107,107,103,47,53,73,68,70,68, -65,111,69,107,107,65,111,70,69,69,107,107,69,84,65,50,68,65,110,79,103,103,103,74,89,81,119,65,65,65,70,65, -119,119,119,119,65,65,107,103,65,65,65,72,47,52,119,119,119,71,101,98,98,65,65,50,69,56,56,100,89,50,65,71, -65,68,71,67,80,73,52,72,52,110,109,119,65,66,74,65,65,65,47,53,73,81,68,65,81,111,65,65,65,70,65,107, -69,107,107,107,107,106,69,107,89,65,53,65,69,107,65,65,65,72,47,65,65,71,109,65,65,65,65,117,111,65,69,65, -65,72,47,52,52,72,119,119,65,71,50,50,50,65,65,47,69,47,56,114,111,119,109,108,70,116,118,108,73,65,52,52, -52,65,71,66,66,66,72,65,65,65,73,65,81,65,67,65,65,111,98,89,65,113,86,70,69,48,107,107,48,84,71,122, -65,65,65,65,65,70,116,67,83,65,72,65,65,69,48,52,67,67,65,65,65,65,47,65,65,72,65,72,52,72,50,119, -119,87,101,98,98,65,65,43,107,108,86,71,103,109,50,49,116,70,69,107,65,65,72,47,65,65,71,120,73,66,66,65, -65,107,77,103,67,65,66,47,47,111,101,89,70,65,103,70,69,71,107,109,99,106,69,97,66,74,103,65,65,70,116,67, -83,65,52,65,65,71,109,70,81,81,81,119,105,103,52,107,50,72,67,65,52,72,119,119,119,81,65,103,65,65,70,43, -107,105,75,71,69,71,109,108,70,70,65,81,81,83,68,98,65,65,71,66,66,66,74,65,65,103,73,105,83,74,74,74, -74,111,98,89,113,86,65,69,69,65,48,122,99,84,68,121,66,69,69,65,65,68,98,67,83,72,50,83,81,69,69,67, -67,67,65,65,82,81,47,103,89,89,86,81,47,52,119,65,65,87,65,103,103,65,65,50,107,108,86,71,69,71,107,107, -54,52,65,83,65,81,84,65,65,65,65,65,65,72,65,114,114,65,65,65,65,65,65,107,107,111,89,70,65,104,116,116, -69,68,101,98,99,106,102,121,66,73,119,103,65,116,116,111,65,52,65,81,65,119,119,119,65,81,65,65,105,103,65,69, -98,67,65,67,71,50,120,65,83,83,81,107,65,72,47,51,107,103,107,71,47,43,65,103,105,103,65,81,65,83,68,98, -70,116,65,65,65,65,52,116,114,65,65,119,65,119,65,65,65,111,89,113,86,90,117,115,69,68,101,98,99,84,68,121, -66,71,69,65,65,66,74,56,53,74,71,83,65,81,65,88,83,50,107,70,65,72,89,107,65,65,72,47,47,47,47,65, -65,86,116,103,103,72,102,107,107,107,107,107,56,103,103,103,54,52,69,103,89,81,84,81,65,114,65,54,52,47,52,114, -116,65,65,66,66,65,119,69,103,111,70,65,111,90,116,116,56,68,101,65,99,106,65,97,66,65,103,65,69,66,74,56, -53,74,65,81,65,68,68,66,83,50,107,70,111,118,68,52,72,111,115,107,107,107,107,69,65,86,65,103,69,72,47,65, -65,65,65,65,47,52,107,103,68,89,89,65,65,65,68,65,65,114,89,85,82,120,73,65,65,65,65,66,104,71,71,69, -65,111,113,85,65,90,117,115,56,89,65,68,69,84,81,84,66,69,69,50,103,104,53,56,53,53,65,81,65,65,111,71, -83,50,107,70,70,72,89,52,72,111,118,47,47,47,47,69,65,86,70,65,65,107,65,98,65,81,65,81,66,73,107,65, -89,68,65,65,47,47,65,74,73,114,89,54,43,50,119,69,107,103,65,66,66,65,119,72,52,116,65,111,65,90,116,116, -56,89,65,68,69,106,67,67,97,65,109,109,48,66,47,56,47,53,65,65,65,65,65,68,65,65,65,70,65,72,68,70, -73,116,111,65,65,65,69,107,65,86,116,65,65,103,103,89,89,81,81,81,73,65,103,103,68,89,89,65,56,110,65,73, -70,116,65,65,66,120,75,83,107,106,89,65,65,81,66,66,65,111,69,65,65,98,89,69,56,68,89,65,99,84,67,67, -68,116,115,117,65,65,65,65,65,83,83,65,65,65,65,65,47,51,47,70,65,72,89,66,111,111,111,65,65,65,69,82, -74,73,65,65,65,107,65,98,71,121,67,71,120,73,107,120,74,103,65,65,56,110,103,74,73,65,65,98,89,65,65,81, -107,103,68,65,107,103,65,66,73,65,65,72,73,65,65,66,74,65,65,65,65,65,67,67,81,111,67,111,89,89,89,50, -119,47,47,65,65,65,65,65,43,51,72,65,65,65,71,117,65,65,121,119,65,70,69,104,65,65,65,65,65,103,65,65, -71,50,50,50,119,65,65,120,73,67,65,52,47,56,103,65,73,52,52,65,97,56,81,81,103,65,65,107,111,110,65,111, -72,72,72,47,80,47,47,47,51,47,72,47,72,47,72,47,72,70,83,111,98,89,89,119,65,74,74,74,74,73,65,65, -47,51,47,65,71,119,70,116,65,73,87,81,65,65,65,104,65,72,47,57,65,103,103,65,65,71,50,119,65,65,74,105, -67,67,65,65,65,65,116,74,73,65,65,89,89,65,83,85,103,65,65,89,67,65,68,65,65,65,65,74,74,74,73,65, -119,65,65,65,65,65,65,65,65,111,67,111,89,89,89,50,50,65,65,65,65,65,65,65,55,51,102,65,122,71,71,117, -72,71,121,119,65,65,65,104,74,65,52,65,70,107,65,65,65,65,50,116,111,65,74,66,74,74,65,65,65,57,65,111, -69,65,69,98,101,107,68,89,98,65,98,89,65,71,71,50,119,68,68,47,80,47,52,65,65,68,68,65,89,89,67,83, -65,116,111,116,115,107,107,103,119,47,47,47,47,52,65,65,55,122,102,65,119,71,65,65,81,103,81,65,65,65,65,104, -65,65,47,70,111,103,65,65,65,65,50,111,70,68,98,70,65,70,50,50,119,111,116,116,69,69,69,65,71,48,71,71, -71,65,65,89,107,103,71,65,71,68,89,98,107,103,67,65,73,89,65,76,52,55,65,65,65,117,119,117,69,69,65,103, -119,65,98,98,98,89,65,65,98,122,98,89,71,119,65,65,71,72,65,65,70,65,65,104,65,65,52,83,87,71,73,74, -65,65,50,111,70,89,65,70,111,116,65,119,70,65,111,65,65,103,103,65,65,65,116,116,116,111,65,89,52,107,71,65, -65,68,68,68,109,103,81,81,65,65,111,65,98,89,119,81,65,117,49,119,69,107,103,103,116,116,116,116,116,116,112,74, -47,65,65,65,79,73,65,114,68,73,65,65,70,116,65,104,65,89,52,67,71,50,66,66,83,81,50,111,111,89,65,70, -70,70,65,49,111,72,70,116,116,65,65,65,65,70,69,107,107,70,65,89,69,103,72,51,43,52,65,65,107,103,71,65, -65,89,65,73,65,65,119,81,65,117,117,71,89,65,70,111,50,50,51,47,47,47,53,74,57,52,65,65,50,119,70,111, -89,80,73,72,70,70,70,109,115,65,52,83,87,71,65,66,82,73,50,65,65,68,98,70,70,70,65,119,71,103,65,52, -52,65,65,65,70,65,109,50,50,103,111,69,69,103,47,47,47,47,66,74,66,73,119,122,68,66,66,65,65,65,48,81, -65,111,65,65,89,68,65,65,98,98,100,116,116,116,112,74,47,116,111,50,79,74,50,114,68,80,73,72,65,70,116,105, -70,65,89,68,65,65,65,65,83,81,69,107,107,65,65,100,70,70,65,119,71,103,72,72,72,72,88,65,116,69,121,97, -97,48,70,65,107,65,47,47,47,47,65,52,77,104,119,119,103,65,65,66,98,90,119,81,65,111,65,65,89,68,111,70, -65,65,98,98,98,98,97,83,57,52,65,120,119,66,50,81,65,74,73,65,50,49,70,104,87,68,65,89,71,50,50,119, -74,73,69,69,69,68,98,70,65,70,68,119,71,103,65,52,52,52,54,65,65,109,55,114,114,43,103,111,65,65,47,72, -52,47,72,72,66,73,71,111,65,114,98,68,65,68,70,43,65,116,111,68,89,98,70,111,65,65,65,65,47,107,105,67, -72,69,47,50,47,53,75,83,107,47,73,65,50,71,65,103,65,65,89,89,65,65,65,120,97,119,69,103,107,65,47,52, -65,65,89,89,65,89,72,72,72,72,88,89,52,110,100,108,108,102,103,111,65,119,47,52,72,47,65,65,71,50,65,70, -116,65,89,68,71,68,70,43,83,81,81,65,65,65,65,65,72,73,80,72,72,50,105,81,65,69,110,51,47,47,47,52, -65,74,73,65,117,119,65,103,74,65,65,67,65,71,50,120,87,52,65,50,119,65,88,81,65,65,89,65,69,69,65,52, -52,54,54,89,65,109,100,107,108,101,103,111,65,71,72,47,47,52,65,65,119,65,119,65,52,65,89,68,65,68,65,71, -83,81,69,69,65,65,103,65,65,65,65,65,72,48,105,67,69,69,107,51,47,47,47,52,71,53,52,65,117,71,65,98, -90,65,65,65,81,71,71,120,97,119,65,67,65,65,47,81,65,65,68,65,73,89,80,72,72,72,88,89,111,109,84,115, -114,87,103,117,119,71,65,47,47,68,84,71,83,114,101,65,65,107,103,66,98,90,69,107,83,81,69,107,65,65,103,65, -69,65,69,65,72,50,105,83,110,107,110,47,47,47,116,50,119,74,73,65,109,119,65,89,90,81,83,83,81,65,89,119, -74,73,65,67,65,69,65,65,65,71,65,90,65,103,66,52,52,54,52,89,111,103,121,100,97,119,103,111,71,50,119,65, -65,67,113,71,65,111,71,72,72,107,103,65,65,65,47,110,52,65,69,69,65,65,103,65,65,50,119,69,72,107,103,65, -69,69,47,47,110,47,57,116,65,65,65,65,103,65,65,98,89,81,81,65,103,68,98,65,65,65,52,67,66,87,50,71, -65,71,89,89,65,122,51,72,72,72,88,89,70,69,71,84,87,69,70,71,122,98,89,65,65,68,84,65,83,114,89,65, -103,72,68,68,65,51,47,47,47,119,69,69,65,65,103,65,65,65,65,65,65,68,98,89,89,84,47,56,107,47,47,52, -65,65,65,65,100,111,65,74,75,81,83,65,65,65,65,66,74,73,65,73,79,79,87,71,65,71,68,65,65,98,89,52, -52,54,52,89,111,111,103,122,119,107,115,65,68,98,89,65,65,65,71,50,81,65,89,72,72,72,108,116,65,47,107,56, -110,52,66,56,65,103,103,65,65,67,81,67,65,68,65,65,89,88,102,47,110,47,50,48,107,107,107,103,82,65,81,73, -73,71,119,71,66,74,65,66,65,73,65,73,82,117,48,119,50,119,68,65,65,122,51,72,72,72,98,89,65,70,69,71, -69,66,66,65,68,98,102,74,73,73,79,117,83,114,89,65,65,72,103,111,71,47,107,107,110,43,66,56,65,107,103,65, -74,81,67,67,65,122,98,89,97,72,102,47,110,47,107,109,50,50,50,120,65,75,81,73,77,119,65,71,66,104,65,66, -73,73,66,77,72,51,71,101,119,107,81,103,65,65,65,52,52,52,52,70,65,70,111,103,109,111,73,119,68,98,102,80, -74,73,79,50,65,65,65,65,119,65,103,111,65,51,56,107,47,119,65,70,108,108,108,108,74,73,67,67,71,71,65,65, -65,72,47,47,110,47,50,119,65,65,65,66,66,67,81,65,69,71,69,109,66,74,70,111,65,65,66,73,111,111,111,120, -119,103,80,111,65,100,100,111,67,69,107,70,70,70,65,69,119,119,65,71,119,65,72,74,73,73,74,66,65,65,65,71, -50,65,106,68,65,71,47,110,43,65,65,66,66,66,66,65,103,103,88,105,51,47,120,73,49,51,47,47,47,47,47,52, -65,65,65,66,73,67,81,68,69,107,48,109,66,65,70,113,65,66,73,72,67,83,72,50,119,107,103,119,52,70,68,67, -67,72,110,65,111,111,65,111,71,65,65,65,65,65,119,70,116,116,71,65,65,65,65,71,71,65,107,107,107,107,110,47, -116,116,114,65,68,65,65,65,65,65,88,54,110,80,104,83,116,118,47,47,47,47,43,109,109,98,89,66,66,67,81,90, -89,50,65,71,65,65,65,67,65,66,73,111,113,83,111,111,107,69,65,65,65,68,70,67,83,69,110,98,98,98,65,70, -105,103,65,65,65,77,69,65,70,65,50,119,65,65,65,47,113,54,103,69,107,65,65,52,65,65,70,66,66,69,65,107, -103,69,72,103,104,74,105,82,49,51,47,47,47,47,56,56,48,99,89,66,65,73,68,76,76,65,65,65,65,65,107,67, -65,66,65,72,67,83,72,67,65,107,66,66,72,65,74,75,67,68,98,70,65,114,65,65,69,69,103,107,73,77,107,65, -70,65,71,65,65,65,65,118,113,54,68,69,56,65,89,71,80,79,70,65,65,69,65,103,103,69,85,105,79,79,73,74, -98,102,47,47,47,47,43,109,109,98,89,65,65,65,66,90,90,65,50,119,69,103,103,105,81,81,81,65,111,119,111,65, -81,67,66,73,72,66,73,67,73,68,65,70,70,89,65,50,71,69,69,69,78,77,69,65,70,65,71,65,81,81,89,116, -113,83,119,48,107,68,68,65,72,65,70,67,67,69,89,103,103,99,72,103,74,120,73,65,102,98,47,47,47,47,56,52, -48,66,74,65,57,70,65,76,73,65,65,65,103,103,107,65,67,67,107,69,110,65,72,65,67,111,112,66,47,74,74,74, -74,68,98,70,114,68,83,119,119,48,65,69,65,73,119,65,70,65,107,103,83,84,90,74,109,66,119,119,103,106,98,71, -73,79,70,66,74,69,89,107,103,99,65,65,72,47,66,112,98,98,65,65,65,68,65,65,109,73,81,72,70,111,65,66, -72,77,107,107,69,65,103,103,65,65,103,107,103,103,103,69,103,69,68,98,71,50,50,50,80,118,118,70,100,67,65,119, -119,119,66,74,74,73,65,65,65,65,65,65,81,81,90,66,103,66,50,119,103,106,98,65,65,65,65,68,65,65,98,65, -68,89,65,85,103,52,70,70,107,106,65,65,72,68,103,69,48,73,81,65,57,70,65,65,66,77,107,103,65,65,103,69, -65,65,107,69,69,65,66,74,74,74,68,114,50,71,71,50,80,118,118,70,65,111,83,68,65,68,66,74,74,65,65,71, -87,65,65,65,111,65,66,74,103,66,119,119,65,65,65,65,65,65,82,80,56,103,89,89,89,89,65,87,103,52,70,73, -105,106,98,68,68,98,107,69,109,81,83,81,65,65,65,65,69,107,107,103,65,65,65,65,103,65,65,65,65,103,103,65, -65,103,106,98,50,50,50,50,80,118,118,98,68,98,65,68,89,98,66,74,74,65,65,67,105,65,65,65,111,111,66,104, -107,53,89,68,72,47,67,65,67,67,66,80,56,103,98,65,68,89,65,85,103,52,66,70,107,106,68,65,68,68,103,107, -48,103,81,81,107,103,65,65,71,65,65,65,71,65,66,74,103,50,65,65,72,69,72,65,65,69,65,70,50,65,65,49, -80,118,118,68,98,65,89,68,68,68,89,66,65,89,65,71,87,65,65,65,111,69,107,65,47,65,68,89,47,47,54,67, -67,65,82,80,56,103,83,81,65,65,65,98,98,89,65,65,116,114,65,68,68,68,119,65,109,103,83,81,65,107,107,107, -65,89,68,65,70,71,83,73,107,71,65,65,65,83,107,107,65,103,103,65,43,50,50,56,78,47,47,65,89,68,68,68, -65,65,98,66,65,89,65,98,89,65,65,65,111,118,47,103,65,47,68,89,52,52,54,72,67,67,65,74,74,70,81,70, -65,69,107,65,89,65,77,103,83,114,68,68,68,68,83,81,77,69,107,66,52,65,65,119,71,65,68,65,111,117,87,73, -73,71,65,65,65,87,48,107,65,52,52,65,70,111,116,66,74,65,83,98,97,81,89,68,65,65,71,120,89,89,89,89, -89,65,65,111,115,47,47,56,72,65,89,68,52,52,54,65,54,65,81,65,66,70,81,70,65,69,65,103,98,89,73,69, -83,114,68,68,65,98,81,66,73,111,81,89,69,103,71,65,65,89,65,89,70,67,87,74,66,119,65,65,65,83,107,107, -65,73,73,107,81,68,65,65,68,98,97,98,97,65,65,50,65,65,65,66,98,98,89,98,89,103,65,116,116,55,55,56, -65,65,65,65,47,47,54,47,54,67,65,65,66,70,81,70,65,69,65,103,89,89,73,69,116,111,98,65,65,103,83,73, -73,71,65,66,65,65,65,65,71,65,68,68,68,72,47,74,66,65,65,65,65,52,65,52,65,66,65,105,103,70,65,65, -83,84,105,97,97,104,65,66,103,100,111,66,65,65,65,65,70,116,65,65,65,110,47,103,65,65,116,111,72,47,67,81, -83,65,81,73,66,70,83,86,65,69,107,65,98,74,77,103,74,73,66,74,69,103,82,65,73,113,83,65,52,103,65,65, -65,89,68,89,89,102,110,65,65,65,72,72,65,65,72,47,65,73,73,107,81,66,81,65,65,84,106,84,84,104,65,66, -103,89,113,66,65,65,65,50,116,116,111,65,65,100,56,89,74,65,65,111,65,43,50,83,87,121,119,66,73,70,116,70, -116,69,65,103,89,89,65,65,53,52,66,65,103,103,65,65,69,67,65,66,107,103,65,65,71,65,68,65,68,72,47,65, -65,65,72,72,65,65,65,65,65,65,65,105,103,111,68,65,65,84,99,99,99,90,104,104,103,100,113,67,72,47,65,119, -115,115,111,65,65,98,122,89,73,65,70,65,65,71,65,67,71,65,81,52,119,52,119,52,119,52,119,52,98,89,65,65, -74,73,66,66,107,107,65,65,65,67,83,80,47,52,65,65,65,89,65,100,118,81,81,65,65,65,65,65,71,65,65,65, -65,47,65,72,43,65,69,65,65,84,98,106,106,89,103,103,103,97,67,83,74,74,65,50,116,116,111,65,65,89,89,89, -73,65,65,65,65,43,71,65,71,65,119,98,98,103,69,74,77,77,65,65,65,65,65,65,50,119,66,74,65,103,65,103, -53,47,47,74,47,52,65,65,71,65,65,70,47,67,65,65,65,65,71,87,87,87,87,76,73,47,71,72,52,65,111,65, -81,81,98,98,98,65,69,65,107,105,83,65,47,47,65,119,108,108,103,65,65,89,82,89,74,65,65,51,65,72,50,65, -65,71,119,98,98,65,65,71,50,119,65,71,50,119,65,65,79,73,65,65,65,65,69,69,80,74,74,74,80,56,107,107, -65,69,85,108,118,67,74,73,65,65,65,119,119,119,119,76,73,65,71,74,74,71,65,65,67,74,65,83,81,89,65,65, -65,65,67,65,73,65,65,50,69,107,65,65,65,97,73,89,66,65,65,47,65,72,70,65,65,65,65,68,65,65,65,119, -65,71,50,119,110,79,65,65,69,65,65,65,65,88,52,69,53,47,74,74,74,56,110,107,70,69,105,103,65,67,47,52, -65,65,65,119,120,119,119,76,73,65,71,74,66,52,65,65,65,73,73,65,81,98,55,65,119,65,83,81,89,65,65,65, -103,65,107,103,65,82,73,69,66,65,65,65,47,52,65,65,65,65,72,72,72,69,110,56,103,65,50,65,73,103,65,65, -103,103,65,81,65,72,52,103,65,65,65,74,74,77,47,56,116,69,107,83,65,65,116,113,83,74,65,71,65,71,65,65, -65,103,65,73,104,73,69,65,65,73,79,67,71,52,71,65,65,71,70,122,98,89,117,65,103,65,103,65,67,73,66,116, -74,65,65,65,52,52,69,65,65,53,73,103,103,69,110,56,103,71,65,119,103,73,77,51,69,65,67,81,65,65,69,107, -65,65,98,101,50,48,110,107,70,69,65,81,81,49,119,65,81,73,73,119,120,119,119,107,103,107,107,107,65,67,89,65, -65,73,73,81,65,89,65,119,119,119,65,81,89,71,65,73,103,65,107,103,82,65,66,111,65,65,65,65,65,111,109,103, -111,120,103,107,103,69,110,56,103,65,68,89,53,104,103,43,69,65,65,65,70,116,65,65,72,52,89,71,83,107,107,107, -65,73,67,67,67,71,117,67,81,73,73,65,65,65,65,111,65,50,50,50,65,65,65,65,65,74,65,83,81,52,65,71, -50,65,65,111,122,65,71,65,103,65,65,103,73,74,73,116,65,65,65,65,65,65,69,67,65,56,103,69,65,65,65,65, -65,65,111,70,81,68,80,99,103,103,65,81,70,70,65,81,65,65,68,69,107,107,110,103,66,120,65,81,81,65,49,119, -65,74,65,50,51,103,74,70,65,107,107,107,65,70,119,81,65,81,65,71,65,68,55,65,119,65,81,85,69,65,111,65, -107,103,107,103,70,69,107,111,71,68,116,111,111,111,65,87,83,65,67,65,81,65,65,65,65,65,72,65,81,89,65,120, -103,103,71,119,70,116,68,98,98,65,65,89,65,69,47,47,65,73,65,67,65,65,65,65,65,74,73,79,107,47,74,65, -111,65,65,103,65,72,73,85,107,81,65,65,65,66,74,65,65,65,71,69,103,71,77,73,65,65,65,65,114,115,74,116, -119,122,116,70,70,70,70,83,83,81,83,81,81,65,107,81,47,57,65,111,69,65,71,71,86,81,107,49,65,65,70,114, -111,65,98,89,65,69,110,103,66,120,70,116,65,65,47,72,65,66,66,71,52,107,73,83,81,52,69,65,65,65,65,81, -81,81,67,67,70,70,111,116,65,70,70,115,69,116,65,65,65,65,65,70,100,69,77,65,119,68,100,111,111,111,65,81, -83,67,67,67,81,65,109,103,74,73,98,65,107,107,71,50,113,111,71,50,119,65,68,114,116,111,113,83,74,69,65,67, -65,73,70,107,111,65,65,72,65,66,71,79,69,52,73,65,65,65,107,107,65,65,65,105,83,103,67,67,65,73,65,73, -65,65,65,65,65,65,65,65,72,47,47,70,111,70,70,65,71,98,98,89,65,65,65,65,67,65,67,65,81,65,85,103, -83,81,83,88,52,65,71,71,113,115,69,50,65,83,68,98,118,111,111,65,66,69,65,84,81,98,100,107,111,73,47,72, -81,65,65,65,67,81,65,107,107,103,65,65,65,65,65,107,69,103,65,65,70,74,65,78,71,71,50,71,65,89,65,65, -89,72,65,81,81,70,70,65,65,119,90,74,65,65,69,103,107,66,73,65,65,52,52,52,81,81,81,88,54,83,83,83, -86,85,107,120,119,88,85,103,116,116,113,83,66,69,65,81,81,89,100,116,66,73,47,65,65,65,65,65,81,67,119,47, -88,52,119,56,52,65,65,103,103,103,65,81,70,73,73,78,71,71,65,71,65,68,65,68,107,110,65,69,65,89,65,89, -119,119,90,65,72,47,69,69,69,73,65,65,65,66,74,65,83,81,83,65,66,65,105,66,113,115,69,50,73,83,85,56, -111,111,111,66,66,69,67,65,67,98,100,65,79,120,73,67,83,65,65,65,87,121,65,54,83,52,65,105,103,65,65,103, -65,103,65,81,70,73,66,78,71,65,71,71,65,68,68,68,50,110,71,69,71,68,55,65,71,65,90,66,72,80,69,69, -69,73,65,65,65,65,103,65,81,65,81,81,66,107,69,66,86,85,69,120,119,81,85,103,111,111,113,83,74,77,103,70, -65,89,70,70,104,74,74,83,83,81,65,65,81,67,65,107,107,103,65,56,52,65,65,103,65,103,67,67,70,73,65,78, -50,71,50,71,119,65,89,89,48,51,65,50,119,88,65,72,47,54,90,74,72,47,69,65,69,66,73,65,65,72,72,65, -81,65,83,65,66,103,107,66,34,41,59,10,172,105,109,103,72,101,105,103,104,116,61,103,46,105,109,97,103,101,77,101, -116,114,105,99,115,40,105,109,103,41,46,104,101,105,103,104,116,59,10,172,105,109,103,83,99,114,111,108,108,61,77,97, -116,104,46,102,108,111,111,114,40,77,97,116,104,46,114,97,110,100,111,109,40,41,42,105,109,103,72,101,105,103,104,116, -41,59,10,103,46,114,101,115,101,116,40,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116, -70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,69,78,86, -46,86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103, -46,103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40, -105,109,103,44,48,44,50,52,41,59,10,170,103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44,102,105,108,101, -41,123,172,106,61,115,46,114,101,97,100,74,83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40,34,111,98,106, -101,99,116,34,138,191,106,41,63,106,46,118,101,114,115,105,111,110,58,181,59,171,118,63,40,110,97,109,101,43,34,32, -34,43,40,118,63,34,118,34,43,118,58,34,85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34,43,110,97,109, -101,59,125,10,172,118,101,114,115,105,111,110,115,61,91,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108, -111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105,111,110,40,34, -76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,44,103,101,116,86,101,114,115, -105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,93,59, -10,172,108,111,103,111,61,69,46,116,111,65,114,114,97,121,66,117,102,102,101,114,40,97,116,111,98,40,34,80,66,119, -66,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,228,0,0,0, +97,110,116,111,110,99,108,107,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100, +34,58,34,97,110,116,111,110,99,108,107,34,44,34,110,97,109,101,34,58,34,65,110,116,111,110,32,67,108,111,99,107, +34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34,44,34,115,114,99,34,58,34,97,110,116,111,110,99,108,107, +46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34, +118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34, +102,105,108,101,115,34,58,34,97,110,116,111,110,99,108,107,46,105,110,102,111,44,97,110,116,111,110,99,108,107,46,97, +112,112,46,106,115,44,97,110,116,111,110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115,44,97,110,116,111,110, +99,108,107,46,105,109,103,34,44,34,100,97,116,97,34,58,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,125, +99,56,0,0,97,98,111,117,116,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97, +119,87,105,100,103,101,116,115,40,41,59,10,172,87,61,103,46,103,101,116,87,105,100,116,104,40,41,44,72,61,103,46, +103,101,116,72,101,105,103,104,116,40,41,59,10,172,69,78,86,61,112,114,111,99,101,115,115,46,101,110,118,59,10,172, +77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114,121,40,41,59,10,172,115,61,114,101,113,117,105,114,101, +40,34,83,116,111,114,97,103,101,34,41,59,10,172,105,109,103,61,97,116,111,98,40,34,115,73,119,68,107,109,50,83, +54,54,68,89,119,65,50,65,65,65,65,65,72,65,72,71,83,82,120,74,69,107,65,65,103,109,71,71,66,120,68,73, +65,68,73,100,65,70,74,73,98,65,72,70,57,72,80,48,48,107,66,85,67,54,68,116,122,68,103,65,105,87,79,120, +119,107,103,65,71,98,65,56,54,67,87,50,50,50,50,107,107,103,66,52,104,79,50,54,47,88,68,68,119,65,119,107, +69,69,69,103,89,89,65,43,86,87,50,50,119,69,65,65,103,103,119,69,109,50,65,90,90,90,84,70,111,116,77,73, +68,65,65,57,118,66,53,50,48,65,74,85,110,88,65,116,119,65,103,65,105,71,120,79,119,50,119,111,43,98,65,109, +105,83,65,72,52,65,81,85,107,65,72,77,107,79,50,47,54,54,84,89,50,71,119,103,103,103,103,104,66,53,47,43, +83,82,120,74,65,69,65,65,108,109,50,69,104,120,83,84,76,75,89,70,70,70,66,65,68,65,47,57,57,72,80,48, +48,107,72,111,67,54,68,117,122,65,65,65,67,87,79,120,119,107,103,43,117,122,71,56,54,67,81,72,55,98,83,85, +103,65,66,43,105,83,81,65,65,65,68,68,65,65,116,69,107,69,107,65,65,65,65,50,107,104,120,73,65,72,65,65, +103,109,71,76,65,68,75,68,76,76,111,65,65,65,69,68,68,83,81,81,67,65,65,65,65,65,72,65,52,65,65,117, +119,65,65,65,65,81,68,68,68,68,68,65,119,65,73,73,65,65,77,103,65,89,81,85,65,65,65,52,105,111,110,103, +65,73,65,71,65,66,113,69,107,107,107,65,72,72,71,71,104,104,120,73,72,72,88,97,54,54,65,68,89,98,83,83, +67,99,69,72,122,85,66,68,98,81,67,83,83,81,65,65,65,65,72,65,116,116,68,68,68,68,65,65,67,81,68,68, +68,68,65,49,52,71,71,71,65,66,69,69,65,89,81,87,66,65,73,68,105,81,56,52,65,65,111,119,120,73,89,81, +107,107,105,83,52,103,52,50,107,104,120,73,65,52,105,110,78,80,65,65,49,119,65,111,84,107,107,65,66,67,83,65, +65,83,81,81,105,107,109,50,83,81,72,65,70,65,65,65,71,119,65,65,65,65,111,116,111,111,117,74,119,65,73,73, +65,66,69,103,89,89,65,65,74,73,73,111,67,73,56,52,65,70,116,50,120,74,67,52,69,107,98,89,69,69,72,80, +65,66,120,73,65,65,102,83,113,113,83,81,49,119,70,67,99,69,69,65,65,67,83,65,65,65,65,65,103,103,109,65, +67,116,118,47,57,49,103,71,103,69,119,72,47,65,116,111,70,70,71,50,119,71,71,65,65,66,69,69,68,89,65,65, +74,74,65,116,65,73,50,71,119,57,116,119,119,119,102,52,65,109,50,65,72,47,53,53,65,82,48,107,48,82,65,72, +78,80,75,116,50,49,111,84,52,65,65,111,70,67,83,104,89,67,83,65,103,107,109,119,67,116,65,65,70,87,111,87, +103,69,121,67,83,65,111,116,116,111,117,98,50,71,65,65,65,65,77,103,65,65,65,65,74,74,65,70,67,65,119,119, +119,57,70,65,71,49,116,52,57,116,104,53,65,103,47,80,69,82,50,50,84,47,65,67,54,54,75,111,112,117,67,100, +56,107,107,115,65,69,65,84,81,67,65,65,103,103,109,70,67,116,115,110,70,97,119,71,103,69,119,69,107,65,65,65, +68,98,117,116,119,71,65,73,66,73,65,65,65,65,65,74,109,104,73,89,65,65,119,65,51,53,120,65,103,50,50,52, +57,116,53,80,65,65,52,65,69,82,121,83,77,43,52,107,65,69,105,107,70,111,122,111,43,50,50,118,74,80,65,90, +103,67,67,69,65,103,109,50,67,116,103,65,116,116,71,118,71,119,66,74,65,65,65,71,65,68,71,71,71,71,120,66, +66,65,65,65,74,66,66,77,107,107,73,65,83,81,65,65,53,43,50,69,69,48,122,98,57,116,110,47,65,72,52,117, +65,82,49,116,111,47,65,110,52,107,107,107,103,67,101,65,57,116,116,115,65,69,65,65,65,67,83,65,65,65,65,65, +65,116,103,65,111,111,65,71,65,65,66,65,65,120,119,71,65,68,71,71,71,65,65,73,66,73,65,65,73,66,66,77, +107,107,80,47,81,85,107,65,72,53,120,65,110,71,76,68,52,65,65,69,107,65,81,117,81,82,116,83,86,52,65,69, +65,69,107,107,65,84,111,119,52,65,65,65,65,65,83,106,68,70,67,83,65,65,65,65,81,65,103,65,116,111,65,111, +65,65,66,73,65,118,103,71,68,68,71,50,71,65,65,65,65,65,71,119,74,66,65,74,107,104,80,74,83,71,50,67, +83,119,65,65,67,84,122,98,52,69,69,65,103,71,67,117,81,81,116,121,49,52,72,107,65,119,107,103,103,100,65,71, +52,65,81,65,65,65,48,122,68,70,67,65,67,50,119,68,68,65,69,110,116,111,72,49,57,65,116,50,65,121,119,71, +65,89,71,71,65,65,65,65,65,65,119,65,65,65,65,66,77,74,72,47,81,81,65,65,67,71,65,65,83,70,89,65, +52,68,106,65,103,119,67,117,67,65,116,83,49,111,65,65,66,74,69,69,68,98,98,98,98,98,98,89,65,65,105,84, +98,116,113,86,67,98,89,81,81,81,65,65,116,116,65,98,114,70,65,71,65,81,65,71,50,71,71,71,71,119,65,65, +65,81,119,119,65,65,65,107,104,73,71,109,76,84,73,107,67,119,68,65,67,52,80,73,65,65,65,65,103,65,81,117, +81,65,116,74,78,111,65,65,66,65,77,110,47,74,73,65,73,77,65,69,69,65,65,68,68,70,67,50,49,65,111,68, +68,65,65,65,65,65,65,98,114,65,117,50,83,82,74,65,65,73,65,65,65,65,65,65,65,65,119,71,65,65,65,107, +103,65,69,107,78,75,54,105,67,68,68,65,65,65,43,80,65,68,98,65,71,50,65,117,67,65,116,74,86,111,73,111, +112,83,69,122,55,74,65,65,66,69,103,69,103,65,65,68,68,70,67,119,119,65,65,65,81,67,67,65,65,65,65,98, +114,65,70,65,81,81,73,65,74,73,65,75,99,117,52,65,65,67,71,119,65,72,47,107,110,47,71,109,106,97,83,107, +83,65,90,66,89,65,74,52,65,68,114,65,71,70,65,117,65,81,70,75,78,65,65,116,112,74,109,88,118,66,78,66, +73,77,107,69,69,65,65,68,68,70,67,50,119,74,74,73,65,85,85,81,65,65,65,65,70,70,111,65,83,81,77,103, +104,73,65,65,65,65,65,65,65,67,65,65,65,47,72,52,47,72,65,65,90,75,54,69,72,65,52,73,65,65,65,65, +65,68,98,68,89,70,65,117,65,67,70,114,116,111,119,70,66,77,121,100,73,66,65,65,66,69,103,71,50,50,65,65, +65,69,115,51,119,65,76,98,65,85,85,81,65,65,66,74,65,67,81,83,65,70,73,103,103,56,107,56,47,107,110,56, +65,65,67,97,65,65,74,47,52,65,71,111,81,82,89,107,69,47,66,66,47,43,65,71,65,65,65,89,65,65,116,65, +119,65,86,118,100,117,50,65,74,109,84,111,65,66,73,65,73,77,65,119,65,65,119,65,65,103,103,110,47,52,76,65, +65,69,85,65,65,65,66,65,73,81,67,65,86,108,119,72,65,43,50,50,43,43,43,51,65,65,119,72,47,66,120,74, +65,89,69,65,103,72,72,65,72,72,65,65,100,50,119,50,50,69,65,68,65,65,65,65,65,65,113,111,55,111,119,66, +75,83,100,73,65,65,52,52,65,65,65,71,71,50,65,65,65,69,107,65,47,47,76,65,65,65,103,65,65,52,66,65, +73,83,83,65,86,117,50,65,65,54,113,54,54,54,54,88,69,107,119,72,47,66,73,73,68,98,68,103,103,110,52,70, +111,109,119,65,77,87,71,71,71,69,65,65,89,65,65,65,65,69,116,115,72,100,111,65,106,84,112,119,65,65,69,65, +65,65,65,71,65,65,65,98,98,89,103,72,73,52,76,70,100,72,72,67,50,65,66,66,65,81,67,83,108,111,119,107, +65,55,98,55,55,55,55,102,69,65,119,72,47,73,73,65,98,98,97,65,107,65,65,49,115,71,71,65,83,87,69,109, +119,69,103,98,69,72,69,65,65,65,120,79,116,70,112,74,122,100,80,65,65,65,52,52,65,65,65,65,50,119,65,65, +89,65,65,66,74,76,98,68,68,72,52,67,71,65,66,74,65,81,67,107,108,65,72,99,65,47,57,57,57,57,118,57, +69,107,67,97,65,74,73,65,68,98,66,111,103,108,117,50,65,109,119,71,83,87,103,109,71,69,56,52,72,47,47,65, +65,65,67,81,65,65,73,104,82,112,52,111,67,65,56,52,65,67,83,83,119,65,65,89,89,111,65,72,73,52,65,70, +100,65,65,67,83,74,74,74,74,74,74,107,108,65,119,107,65,68,65,65,89,65,71,65,69,65,65,98,89,77,73,65, +65,89,65,65,103,108,50,49,65,71,71,71,83,81,107,103,65,69,109,103,65,52,52,83,83,83,83,73,69,66,71,97, +100,80,65,103,107,103,47,105,83,83,74,75,71,65,65,68,89,72,72,67,81,65,65,72,88,65,65,65,89,65,65,65, +65,66,77,107,111,65,119,107,65,68,65,68,65,81,49,119,69,65,68,70,65,103,103,65,65,65,65,68,76,50,50,116, +65,50,65,119,67,65,103,103,73,69,56,52,67,72,65,87,121,50,83,76,111,73,109,98,112,103,103,89,103,103,107,105, +116,116,74,75,65,89,65,65,65,72,72,86,113,66,103,83,83,83,47,107,73,71,65,119,119,120,74,107,111,65,65,65, +65,68,65,89,65,81,71,65,72,47,68,117,111,107,103,69,69,103,50,65,97,117,50,116,111,65,65,65,105,103,119,66, +66,65,65,65,66,47,52,83,83,83,81,74,66,69,121,100,56,52,89,81,107,103,65,67,83,83,74,75,74,74,74,107, +107,72,72,81,67,65,110,83,54,83,47,107,89,119,119,119,119,120,53,107,111,65,119,89,89,68,68,50,81,81,65,71, +72,88,68,70,68,108,103,69,65,103,119,120,86,108,50,116,65,107,103,69,107,107,74,65,73,119,65,65,66,107,103,83, +83,83,81,76,111,109,84,53,47,103,67,73,68,65,68,65,65,67,83,83,81,81,81,47,47,72,47,67,81,65,103,87, +65,83,47,107,73,50,119,50,119,120,74,107,111,65,119,89,65,68,101,50,67,65,65,103,103,47,68,65,68,70,65,69, +65,103,50,67,76,77,56,108,111,66,103,65,110,103,66,65,65,103,103,81,65,65,65,83,83,83,81,74,69,121,100,80, +56,52,73,65,68,68,68,72,88,65,65,65,65,65,65,83,83,65,65,65,68,98,65,65,65,83,47,107,89,119,119,119, +119,66,53,107,78,65,65,89,89,68,101,50,65,65,69,71,69,72,65,98,89,108,65,65,107,65,119,122,90,102,47,57, +66,66,103,69,47,56,71,71,65,98,89,65,65,65,71,65,69,98,65,73,109,84,115,69,103,66,74,65,68,89,89,72, +54,65,65,68,98,65,65,65,65,65,65,77,73,89,50,119,50,119,50,107,73,119,119,119,119,119,74,74,78,65,65,65, +65,68,68,119,65,65,103,71,65,103,65,65,69,70,89,65,65,65,65,69,76,77,56,108,112,66,103,65,110,103,66,74, +65,103,103,65,67,65,65,65,69,89,90,69,121,100,73,103,73,69,107,72,110,65,65,67,83,81,71,50,122,66,83,74, +108,108,73,74,76,81,71,65,119,65,50,107,65,65,65,65,65,65,75,83,73,65,72,47,65,68,65,89,65,83,72,77, +98,116,98,104,52,107,65,65,65,65,119,70,74,89,65,65,66,66,103,71,87,87,87,87,65,65,119,65,65,65,65,69, +69,98,65,109,84,112,119,104,79,69,69,69,107,71,74,119,65,65,65,50,89,98,65,65,108,65,73,77,76,98,48,119, +50,119,69,107,69,65,103,110,74,74,75,83,73,65,52,65,52,68,65,68,65,67,72,77,107,107,107,104,52,72,65,65, +65,65,83,71,84,74,74,73,103,73,103,65,65,65,65,65,69,56,56,56,56,71,50,65,103,89,99,121,100,69,50,109, +74,65,66,72,110,71,107,119,81,67,65,50,89,89,65,65,65,74,120,73,65,65,65,65,119,65,69,107,69,103,103,47, +79,50,76,74,73,65,111,65,111,65,65,65,70,107,115,65,107,67,83,83,72,65,72,65,65,66,74,80,89,79,101,73, +69,107,65,65,65,71,79,69,107,81,65,65,65,71,50,65,69,107,109,107,104,66,107,50,120,65,65,67,83,66,107,73, +65,65,65,119,65,69,103,103,65,65,73,65,72,47,107,104,74,65,69,107,69,69,103,74,79,49,78,65,65,70,106,68, +108,65,65,71,65,115,103,65,103,71,50,87,65,65,65,65,119,120,74,79,103,76,76,73,65,65,68,98,52,66,120,65, +103,81,69,65,107,71,50,65,69,69,105,99,73,65,69,65,65,65,65,107,105,48,65,65,67,65,65,65,65,69,69,103, +65,65,73,65,72,47,107,104,74,65,52,52,69,65,103,65,50,70,116,65,65,70,107,99,108,65,71,71,71,69,65,65, +107,71,121,50,52,72,74,52,65,65,74,70,111,68,98,65,65,47,65,68,52,71,79,65,105,81,69,69,65,109,50,65, +77,109,106,107,107,74,48,119,47,52,65,67,105,103,119,67,65,65,85,107,107,107,107,103,65,65,65,65,72,47,107,104, +74,65,72,65,65,65,65,71,119,65,68,65,65,65,99,107,101,65,71,71,71,65,65,65,69,71,87,50,65,73,65,65, +67,65,66,74,119,70,89,65,65,65,68,68,65,65,67,81,65,90,89,107,69,109,81,81,69,121,108,73,66,78,48,49, +47,52,65,65,103,119,68,65,83,83,72,47,47,56,107,103,65,65,65,65,65,52,69,65,73,67,88,107,71,52,69,56, +50,65,98,65,103,107,106,106,71,119,65,119,119,65,65,72,107,67,83,83,72,65,72,69,107,107,66,74,73,70,119,89, +65,72,65,89,107,107,103,101,89,76,73,65,65,87,83,81,107,69,104,65,66,74,65,69,103,65,65,71,65,103,89,89, +69,103,66,74,74,73,107,65,65,65,65,111,65,65,65,65,65,65,88,103,72,79,80,47,65,119,65,65,47,47,52,89, +50,65,65,65,52,52,52,52,52,65,116,111,83,88,65,69,69,69,66,74,81,69,71,89,65,72,65,65,65,103,81,89, +89,90,89,65,65,88,82,85,69,100,103,65,65,73,103,103,106,65,65,65,109,65,98,89,69,65,65,65,65,65,65,50, +98,107,57,111,70,52,69,72,78,116,72,65,109,48,48,56,65,73,65,65,74,74,73,65,71,121,83,81,52,52,52,72, +65,65,65,111,81,65,103,65,65,65,65,99,103,69,65,119,65,72,65,65,65,103,67,107,103,65,65,65,65,83,81,109, +85,112,103,65,65,73,69,106,98,98,65,65,65,65,89,90,69,103,69,56,72,47,65,71,65,119,70,113,86,111,65,72, +72,66,65,50,72,79,73,69,87,65,65,65,80,107,107,107,103,81,69,81,69,65,110,72,72,65,70,65,83,65,98,50, +81,81,65,106,89,89,89,98,102,72,65,65,65,103,65,69,71,119,65,65,119,66,69,121,99,73,103,65,65,65,103,106, +67,68,65,69,83,81,65,81,65,103,69,56,69,107,65,71,71,69,77,86,113,65,65,88,57,112,73,119,71,52,67,81, +105,65,65,65,80,110,47,47,52,65,107,81,103,103,103,52,72,87,86,65,81,65,102,50,65,65,65,99,65,69,107,65, +65,54,83,83,81,103,65,69,71,66,74,72,65,65,109,107,104,65,65,65,65,69,103,103,55,52,56,56,54,65,72,88, +69,103,56,107,65,47,52,71,119,66,70,86,111,65,65,88,72,66,65,50,83,83,81,83,69,65,65,65,80,104,74,74, +73,81,105,65,107,103,104,53,68,65,68,65,83,87,53,57,81,81,65,106,83,81,105,65,65,67,81,67,88,47,65,69, +65,120,65,65,66,65,120,107,77,100,71,65,50,65,71,65,68,65,110,47,105,65,119,81,119,65,65,65,72,47,47,71, +71,66,70,86,83,65,65,88,70,65,65,65,111,111,65,73,65,65,65,65,107,107,103,65,107,107,103,65,103,103,110,72, +111,50,119,111,65,119,119,65,65,65,65,99,81,65,105,65,65,97,86,97,82,74,65,107,109,120,73,65,66,104,82,104, +84,114,50,119,119,119,119,119,73,73,56,56,54,72,65,65,72,65,65,65,65,107,103,71,65,48,77,86,113,65,65,81, +65,65,65,65,116,111,111,65,65,65,105,65,47,47,52,65,52,65,65,65,65,65,66,53,103,119,119,103,69,71,69,65, +70,65,103,106,83,65,67,81,65,113,84,67,88,80,65,65,65,66,65,65,66,82,100,73,85,100,50,119,119,119,50,119, +67,65,72,110,83,67,67,67,65,65,65,65,69,69,69,65,65,65,66,113,81,66,74,117,50,65,65,89,111,111,111,81, +65,69,65,81,74,74,73,83,83,81,65,65,52,52,52,65,65,119,119,74,73,107,103,65,98,89,119,99,81,68,98,65, +70,89,100,65,72,80,65,65,65,66,65,65,104,74,112,65,83,119,49,78,50,65,119,119,65,65,122,98,65,65,69,85, +81,119,65,65,57,103,103,52,65,65,69,116,111,65,66,111,66,65,68,68,65,65,72,72,65,65,105,65,65,88,110,47, +65,116,111,65,65,65,65,65,65,71,65,66,65,69,65,65,68,65,81,106,81,103,89,65,65,69,69,69,65,65,65,65, +65,72,65,98,97,102,73,74,73,119,65,73,65,65,116,111,65,71,50,89,66,74,77,107,81,47,52,72,52,69,65,47, +65,69,73,65,65,66,74,111,104,67,68,98,65,72,65,119,65,65,103,81,65,52,53,74,65,50,119,65,65,65,98,89, +65,65,65,74,67,69,67,65,89,89,65,99,65,89,90,66,74,65,50,119,65,119,65,65,65,54,52,98,98,54,52,73, +119,119,65,119,65,65,111,111,67,67,111,83,81,74,77,85,81,107,103,116,118,65,72,65,98,89,65,65,71,120,65,111, +65,67,68,65,65,65,47,52,65,65,67,73,73,110,85,107,98,98,89,65,65,68,68,68,98,98,98,89,65,85,81,65, +65,65,104,65,65,98,102,66,53,69,69,69,71,71,79,79,54,52,65,98,100,65,65,74,71,83,81,111,65,65,116,111, +67,83,111,83,82,73,65,65,65,119,65,116,111,47,52,65,65,52,65,65,71,71,74,98,98,97,65,98,65,65,52,52, +65,73,73,73,73,81,66,73,98,65,65,89,65,68,68,68,116,116,116,118,72,69,65,65,71,65,43,81,107,83,118,66, +53,65,65,65,65,120,120,120,83,81,116,98,100,111,65,73,65,83,81,119,65,65,111,65,105,67,116,81,81,80,47,47, +52,119,65,116,118,103,110,65,119,52,83,65,71,71,65,65,65,47,72,65,65,73,65,65,65,66,65,73,73,52,107,107, +65,65,65,68,52,65,98,89,47,47,47,55,55,69,88,78,107,103,79,56,103,83,73,65,65,116,111,65,67,65,79,48, +54,52,114,98,98,117,65,73,65,83,81,65,65,65,111,119,103,65,69,48,66,80,74,74,52,68,89,102,56,69,69,47, +98,89,83,81,71,71,65,65,72,65,53,65,65,73,103,103,103,81,81,74,73,66,74,74,73,65,65,65,89,65,80,73, +116,116,116,118,47,69,122,106,69,65,65,85,107,82,76,65,68,114,111,107,105,81,77,65,65,98,98,98,98,98,89,73, +119,65,65,72,103,68,65,109,103,65,71,79,65,68,65,65,89,68,98,89,52,103,103,52,65,65,81,65,71,119,67,56, +65,47,72,65,47,74,69,69,65,67,65,69,69,83,65,65,116,116,65,65,68,65,47,52,98,98,98,89,52,65,73,65, +103,103,73,66,107,74,76,116,114,116,111,50,119,81,79,109,65,99,106,106,106,107,89,65,65,65,65,72,107,74,89,48, +119,68,69,48,65,66,47,47,73,65,98,65,65,69,109,82,65,67,83,65,65,65,67,56,65,103,103,65,47,67,113,113, +65,103,103,71,109,83,65,70,65,65,111,70,111,89,80,73,65,65,65,72,47,72,75,88,73,65,52,65,107,65,76,109, +68,103,65,65,107,73,73,107,109,99,107,116,115,107,101,119,119,65,65,72,56,74,68,65,65,98,65,65,65,65,65,65, +65,65,65,65,65,107,121,78,103,65,83,70,111,47,54,56,69,115,115,65,84,65,86,87,71,69,119,66,120,83,65,111, +50,119,70,68,100,111,65,65,65,65,65,72,72,52,82,52,70,116,107,77,47,50,73,103,119,108,108,108,104,106,98,69, +121,98,98,98,98,98,101,65,119,65,103,103,106,89,65,98,68,65,89,65,65,65,65,65,65,65,65,67,67,87,82,116, +119,111,81,81,116,52,67,69,69,115,115,65,47,65,75,71,50,71,65,65,73,83,119,111,119,71,70,73,76,100,67,67, +81,65,65,72,72,65,65,103,65,111,85,107,65,47,77,109,50,107,69,65,107,73,52,65,68,112,65,65,65,65,50,67, +83,119,103,103,106,68,69,65,89,65,65,65,65,65,65,81,65,81,98,97,83,81,65,73,73,111,67,65,111,47,67,69, +65,106,103,65,47,65,65,66,120,65,119,65,65,83,65,111,119,71,72,72,72,65,67,67,65,65,83,56,65,68,65,103, +65,111,77,77,47,116,65,119,119,119,70,65,65,65,56,65,70,73,68,118,114,65,65,67,67,65,69,77,68,89,120,119, +65,119,68,68,65,65,65,83,67,81,116,113,67,70,116,74,73,65,89,89,89,52,67,69,65,106,103,66,74,66,72,65, +119,72,71,65,65,83,65,111,50,119,66,65,66,65,83,67,81,65,88,52,65,89,69,56,111,111,82,74,107,65,71,119, +119,50,69,65,65,65,65,65,66,65,68,118,114,65,65,67,83,65,66,104,68,69,73,77,65,65,76,74,66,65,65,81, +81,81,50,119,65,67,83,73,76,68,68,68,68,47,52,65,65,98,89,66,74,65,65,111,65,111,119,65,65,83,65,111, +119,65,118,72,72,65,65,65,65,65,47,103,109,119,65,47,111,111,74,65,81,65,87,71,50,71,70,65,65,65,65,65, +73,73,68,118,114,65,108,75,67,65,100,57,98,65,120,119,65,65,76,73,89,68,65,65,65,47,65,65,65,70,116,73, +73,89,65,65,65,65,65,65,65,65,65,71,50,86,82,80,118,52,65,65,65,83,89,70,119,70,65,81,65,65,65,65, +65,65,103,69,65,119,65,110,116,111,82,73,83,67,87,119,65,50,72,52,52,65,65,65,68,65,68,118,114,103,108,76, +65,112,115,99,112,65,69,65,104,103,76,74,66,65,65,65,72,72,66,74,74,77,107,65,72,80,65,65,65,72,110,83, +81,65,89,101,50,86,82,112,118,118,65,65,65,83,79,71,116,111,65,65,65,52,72,65,72,66,73,65,65,81,65,110, +47,52,74,65,81,81,81,50,50,119,72,72,71,71,71,71,65,89,68,72,114,110,108,73,111,111,115,107,111,65,65,65, +73,65,65,65,65,65,65,89,72,47,65,65,65,72,47,107,104,53,67,66,69,66,74,83,67,65,98,69,107,83,82,78, +118,57,72,119,65,65,73,65,69,65,56,52,72,72,65,65,65,119,66,65,65,67,67,83,72,103,82,47,81,65,81,65, +65,65,72,47,43,119,65,119,67,65,65,65,69,107,108,76,70,111,70,108,65,119,65,65,103,65,68,67,65,65,68,55, +72,72,72,47,47,56,107,50,51,80,65,65,65,72,110,81,83,65,98,69,107,86,82,112,118,118,65,43,103,103,87,50, +107,103,107,103,72,47,65,69,65,50,73,65,65,65,65,69,69,65,74,65,47,47,110,65,65,72,70,116,117,71,65,119, +73,81,111,65,69,52,108,76,65,115,69,111,106,119,69,65,73,65,68,85,81,65,68,65,65,65,65,103,103,103,65,65, +65,65,65,65,65,65,65,67,83,65,89,89,65,86,82,78,118,52,72,119,103,103,81,69,69,69,56,52,72,72,72,65, +72,119,66,65,65,65,65,65,103,65,111,74,53,102,72,119,69,52,57,65,65,65,65,65,101,65,111,65,69,49,116,65, +65,103,103,103,103,119,103,103,104,103,98,83,81,83,81,89,65,49,66,52,52,52,65,47,52,68,47,47,47,55,65,65, +65,81,65,82,65,73,65,83,65,65,65,65,69,65,65,80,77,65,65,65,65,65,65,47,56,104,73,65,72,47,65,107, +107,103,71,65,55,80,65,119,67,52,52,116,65,65,65,65,73,119,111,65,69,57,116,69,103,69,48,65,47,119,69,65, +65,65,98,81,81,65,81,68,71,49,111,107,48,50,119,56,107,65,69,107,107,65,65,67,81,71,107,120,76,73,67,81, +65,80,103,65,65,69,107,53,56,65,83,121,98,98,89,65,109,48,65,65,54,83,52,103,103,103,50,50,47,55,65,50, +50,52,57,65,65,103,107,65,89,89,117,65,69,70,116,109,48,65,103,119,119,69,105,107,72,47,107,110,47,65,84,55, +65,83,71,71,119,119,50,56,56,65,65,69,65,65,107,81,67,65,109,104,90,73,67,81,107,107,107,107,107,71,50,80, +73,65,67,83,89,89,89,69,71,119,103,72,121,83,88,65,65,65,71,65,53,53,65,50,75,72,68,114,89,119,119,119, +73,119,111,65,72,107,103,109,48,65,71,71,71,65,67,65,71,74,48,51,110,81,81,89,65,81,65,50,50,50,50,47, +56,65,65,69,89,89,107,103,65,84,69,48,107,107,65,77,107,107,107,107,107,72,71,119,69,105,83,67,98,98,56,56, +50,50,107,43,83,67,83,52,65,103,65,65,55,80,72,119,67,65,65,89,71,119,65,65,68,65,111,66,68,87,81,69, +103,65,71,71,71,65,67,65,69,107,48,51,47,67,68,65,65,65,65,65,65,65,65,56,107,68,69,69,98,89,116,103, +107,75,73,65,103,103,66,66,107,107,107,107,107,72,43,119,69,116,86,65,99,48,102,47,122,101,47,43,81,67,83,52, +69,65,69,107,65,65,69,81,71,103,68,98,89,65,50,51,65,72,111,65,72,81,81,67,65,107,107,109,65,67,67,67, +119,65,65,65,70,116,101,89,71,119,111,65,65,65,65,81,65,98,99,107,89,89,74,103,69,82,65,65,103,69,80,72, +73,65,65,69,107,72,71,65,69,116,86,65,47,72,56,56,68,68,107,43,81,83,83,52,69,103,69,107,47,52,65,65, +65,65,65,66,49,73,107,119,65,65,111,66,89,69,65,83,65,67,67,65,65,65,83,81,65,65,73,65,78,86,98,89, +119,65,116,98,65,65,67,54,68,89,98,65,65,65,74,69,103,65,65,65,65,65,73,65,73,65,65,69,107,65,65,65, +69,105,81,65,47,47,52,65,69,119,65,43,83,83,83,52,69,65,69,107,52,52,73,66,66,73,74,71,116,103,65,51, +72,72,111,65,52,65,98,97,81,67,67,65,67,65,65,65,72,83,82,66,70,116,89,89,119,65,116,98,65,72,88,88, +88,98,89,111,65,111,65,65,65,65,65,65,65,65,66,74,119,65,65,69,107,65,65,65,65,65,65,65,47,47,52,65, +69,71,68,102,83,83,88,69,107,103,65,65,47,52,65,65,65,73,76,66,115,73,119,119,65,119,65,116,111,72,98,97, +65,65,65,81,83,81,81,68,65,52,84,76,65,81,65,65,119,65,98,100,111,65,67,54,65,68,65,111,65,111,65,65, +65,65,66,83,73,65,65,65,119,65,65,69,107,65,66,73,65,67,67,83,80,47,73,65,69,71,98,98,47,47,52,65, +117,111,68,89,65,52,73,66,66,73,73,90,103,73,50,119,65,73,65,111,52,65,66,65,65,69,56,81,67,65,81,114, +65,67,84,68,67,83,107,65,71,119,98,105,73,65,65,81,47,52,71,70,70,66,74,65,65,65,66,47,73,52,65,52, +119,65,65,107,107,65,66,66,50,121,67,65,74,74,73,65,69,71,98,98,52,47,52,65,121,119,99,106,107,103,73,66, +65,65,65,68,74,65,107,103,65,81,65,116,65,65,66,111,65,103,103,105,83,83,65,84,65,52,81,65,67,67,65,65, +65,65,98,49,103,65,65,52,56,52,119,49,70,66,66,65,65,65,66,83,73,65,65,65,50,50,50,69,107,65,66,73, +74,75,67,81,53,74,52,65,65,65,89,98,47,65,52,65,76,73,99,106,48,119,73,66,65,65,65,65,89,52,65,65, +81,119,103,118,65,65,66,65,69,65,65,69,83,81,65,84,72,83,88,47,67,83,103,48,65,65,98,75,89,66,65,65, +47,52,47,119,111,66,66,65,65,65,65,65,65,65,119,65,68,77,81,83,107,81,66,66,107,105,83,65,52,65,52,65, +65,65,65,98,72,47,65,65,65,65,99,106,107,103,66,73,65,65,69,65,68,65,65,65,72,80,65,116,111,65,81,65, +103,65,65,65,103,65,65,116,65,65,71,65,67,67,65,48,68,52,98,98,65,66,114,119,65,71,47,51,72,73,73,65, +65,65,67,65,65,103,65,103,90,105,67,67,67,65,66,73,65,65,65,65,47,47,52,65,73,73,109,84,65,52,65,65, +65,65,68,89,65,65,67,52,65,65,107,103,65,89,103,69,65,65,65,65,67,67,88,118,65,65,65,47,110,56,47,107, +56,81,50,119,67,67,107,48,72,89,98,98,65,66,114,89,65,119,50,67,83,65,65,65,119,81,68,65,81,69,107,68, +77,67,67,67,81,65,65,83,68,65,89,65,68,101,119,65,74,77,121,89,65,65,65,65,69,65,68,89,47,47,72,67, +65,69,107,107,65,68,69,103,65,73,73,66,67,67,114,114,111,65,65,72,110,56,110,110,56,87,50,119,65,65,65,65, +65,65,65,65,66,66,116,89,103,103,65,107,107,103,52,52,65,68,70,68,65,65,103,65,65,72,68,65,65,65,67,65, +68,68,98,65,89,101,71,71,79,73,65,65,65,65,65,65,107,103,70,116,65,52,54,72,65,107,107,103,103,68,99,103, +65,73,73,73,75,67,65,65,65,65,65,72,107,56,56,110,47,87,120,50,65,98,107,107,107,107,107,107,104,74,66,65, +103,103,65,110,47,103,47,56,103,65,117,111,65,47,52,65,65,72,89,89,119,70,67,65,68,65,89,65,89,101,71,71, +79,73,65,74,97,81,119,69,69,69,70,65,65,47,72,81,69,107,107,72,69,65,65,65,65,119,119,50,119,81,65,65, +65,65,65,72,110,56,56,107,56,87,50,50,65,101,101,50,50,50,50,50,119,65,65,52,71,70,100,110,118,103,47,56, +105,100,51,49,97,107,103,67,65,72,89,89,119,70,65,83,98,65,65,65,68,101,71,109,71,69,65,65,89,81,119,65, +107,103,70,116,119,52,119,119,65,107,107,103,65,65,50,50,50,50,119,119,119,65,65,65,65,65,65,47,69,65,65,65, +65,87,50,50,65,98,69,65,80,73,72,47,65,110,103,65,103,106,114,110,47,103,47,47,52,65,117,111,65,83,81,65, +65,47,68,71,65,70,116,65,65,65,65,69,65,71,48,53,48,107,65,73,97,81,65,69,69,69,70,65,50,50,119,111, +119,69,107,107,72,65,50,65,65,65,65,65,65,71,65,65,65,65,65,50,69,47,56,114,111,50,119,50,65,89,100,89, +47,52,52,65,52,47,52,65,103,108,100,107,107,103,47,53,73,68,70,68,65,111,69,107,107,65,111,70,69,69,107,107, +69,84,65,50,68,65,110,79,103,103,103,74,89,81,119,65,65,65,70,65,119,119,119,119,65,65,107,103,65,65,65,72, +47,52,119,119,119,71,101,98,98,65,65,50,69,56,56,100,89,50,65,71,65,68,71,67,80,73,52,72,52,110,109,119, +65,66,74,65,65,65,47,53,73,81,68,65,81,111,65,65,65,70,65,107,69,107,107,107,107,106,69,107,89,65,53,65, +69,107,65,65,65,72,47,65,65,71,109,65,65,65,65,117,111,65,69,65,65,72,47,52,52,72,119,119,65,71,50,50, +50,65,65,47,69,47,56,114,111,119,109,108,70,116,118,108,73,65,52,52,52,65,71,66,66,66,72,65,65,65,73,65, +81,65,67,65,65,111,98,89,65,113,86,70,69,48,107,107,48,84,71,122,65,65,65,65,65,70,116,67,83,65,72,65, +65,69,48,52,67,67,65,65,65,65,47,65,65,72,65,72,52,72,50,119,119,87,101,98,98,65,65,43,107,108,86,71, +103,109,50,49,116,70,69,107,65,65,72,47,65,65,71,120,73,66,66,65,65,107,77,103,67,65,66,47,47,111,101,89, +70,65,103,70,69,71,107,109,99,106,69,97,66,74,103,65,65,70,116,67,83,65,52,65,65,71,109,70,81,81,81,119, +105,103,52,107,50,72,67,65,52,72,119,119,119,81,65,103,65,65,70,43,107,105,75,71,69,71,109,108,70,70,65,81, +81,83,68,98,65,65,71,66,66,66,74,65,65,103,73,105,83,74,74,74,74,111,98,89,113,86,65,69,69,65,48,122, +99,84,68,121,66,69,69,65,65,68,98,67,83,72,50,83,81,69,69,67,67,67,65,65,82,81,47,103,89,89,86,81, +47,52,119,65,65,87,65,103,103,65,65,50,107,108,86,71,69,71,107,107,54,52,65,83,65,81,84,65,65,65,65,65, +65,72,65,114,114,65,65,65,65,65,65,107,107,111,89,70,65,104,116,116,69,68,101,98,99,106,102,121,66,73,119,103, +65,116,116,111,65,52,65,81,65,119,119,119,65,81,65,65,105,103,65,69,98,67,65,67,71,50,120,65,83,83,81,107, +65,72,47,51,107,103,107,71,47,43,65,103,105,103,65,81,65,83,68,98,70,116,65,65,65,65,52,116,114,65,65,119, +65,119,65,65,65,111,89,113,86,90,117,115,69,68,101,98,99,84,68,121,66,71,69,65,65,66,74,56,53,74,71,83, +65,81,65,88,83,50,107,70,65,72,89,107,65,65,72,47,47,47,47,65,65,86,116,103,103,72,102,107,107,107,107,107, +56,103,103,103,54,52,69,103,89,81,84,81,65,114,65,54,52,47,52,114,116,65,65,66,66,65,119,69,103,111,70,65, +111,90,116,116,56,68,101,65,99,106,65,97,66,65,103,65,69,66,74,56,53,74,65,81,65,68,68,66,83,50,107,70, +111,118,68,52,72,111,115,107,107,107,107,69,65,86,65,103,69,72,47,65,65,65,65,65,47,52,107,103,68,89,89,65, +65,65,68,65,65,114,89,85,82,120,73,65,65,65,65,66,104,71,71,69,65,111,113,85,65,90,117,115,56,89,65,68, +69,84,81,84,66,69,69,50,103,104,53,56,53,53,65,81,65,65,111,71,83,50,107,70,70,72,89,52,72,111,118,47, +47,47,47,69,65,86,70,65,65,107,65,98,65,81,65,81,66,73,107,65,89,68,65,65,47,47,65,74,73,114,89,54, +43,50,119,69,107,103,65,66,66,65,119,72,52,116,65,111,65,90,116,116,56,89,65,68,69,106,67,67,97,65,109,109, +48,66,47,56,47,53,65,65,65,65,65,68,65,65,65,70,65,72,68,70,73,116,111,65,65,65,69,107,65,86,116,65, +65,103,103,89,89,81,81,81,73,65,103,103,68,89,89,65,56,110,65,73,70,116,65,65,66,120,75,83,107,106,89,65, +65,81,66,66,65,111,69,65,65,98,89,69,56,68,89,65,99,84,67,67,68,116,115,117,65,65,65,65,65,83,83,65, +65,65,65,65,47,51,47,70,65,72,89,66,111,111,111,65,65,65,69,82,74,73,65,65,65,107,65,98,71,121,67,71, +120,73,107,120,74,103,65,65,56,110,103,74,73,65,65,98,89,65,65,81,107,103,68,65,107,103,65,66,73,65,65,72, +73,65,65,66,74,65,65,65,65,65,67,67,81,111,67,111,89,89,89,50,119,47,47,65,65,65,65,65,43,51,72,65, +65,65,71,117,65,65,121,119,65,70,69,104,65,65,65,65,65,103,65,65,71,50,50,50,119,65,65,120,73,67,65,52, +47,56,103,65,73,52,52,65,97,56,81,81,103,65,65,107,111,110,65,111,72,72,72,47,80,47,47,47,51,47,72,47, +72,47,72,47,72,70,83,111,98,89,89,119,65,74,74,74,74,73,65,65,47,51,47,65,71,119,70,116,65,73,87,81, +65,65,65,104,65,72,47,57,65,103,103,65,65,71,50,119,65,65,74,105,67,67,65,65,65,65,116,74,73,65,65,89, +89,65,83,85,103,65,65,89,67,65,68,65,65,65,65,74,74,74,73,65,119,65,65,65,65,65,65,65,65,111,67,111, +89,89,89,50,50,65,65,65,65,65,65,65,55,51,102,65,122,71,71,117,72,71,121,119,65,65,65,104,74,65,52,65, +70,107,65,65,65,65,50,116,111,65,74,66,74,74,65,65,65,57,65,111,69,65,69,98,101,107,68,89,98,65,98,89, +65,71,71,50,119,68,68,47,80,47,52,65,65,68,68,65,89,89,67,83,65,116,111,116,115,107,107,103,119,47,47,47, +47,52,65,65,55,122,102,65,119,71,65,65,81,103,81,65,65,65,65,104,65,65,47,70,111,103,65,65,65,65,50,111, +70,68,98,70,65,70,50,50,119,111,116,116,69,69,69,65,71,48,71,71,71,65,65,89,107,103,71,65,71,68,89,98, +107,103,67,65,73,89,65,76,52,55,65,65,65,117,119,117,69,69,65,103,119,65,98,98,98,89,65,65,98,122,98,89, +71,119,65,65,71,72,65,65,70,65,65,104,65,65,52,83,87,71,73,74,65,65,50,111,70,89,65,70,111,116,65,119, +70,65,111,65,65,103,103,65,65,65,116,116,116,111,65,89,52,107,71,65,65,68,68,68,109,103,81,81,65,65,111,65, +98,89,119,81,65,117,49,119,69,107,103,103,116,116,116,116,116,116,112,74,47,65,65,65,79,73,65,114,68,73,65,65, +70,116,65,104,65,89,52,67,71,50,66,66,83,81,50,111,111,89,65,70,70,70,65,49,111,72,70,116,116,65,65,65, +65,70,69,107,107,70,65,89,69,103,72,51,43,52,65,65,107,103,71,65,65,89,65,73,65,65,119,81,65,117,117,71, +89,65,70,111,50,50,51,47,47,47,53,74,57,52,65,65,50,119,70,111,89,80,73,72,70,70,70,109,115,65,52,83, +87,71,65,66,82,73,50,65,65,68,98,70,70,70,65,119,71,103,65,52,52,65,65,65,70,65,109,50,50,103,111,69, +69,103,47,47,47,47,66,74,66,73,119,122,68,66,66,65,65,65,48,81,65,111,65,65,89,68,65,65,98,98,100,116, +116,116,112,74,47,116,111,50,79,74,50,114,68,80,73,72,65,70,116,105,70,65,89,68,65,65,65,65,83,81,69,107, +107,65,65,100,70,70,65,119,71,103,72,72,72,72,88,65,116,69,121,97,97,48,70,65,107,65,47,47,47,47,65,52, +77,104,119,119,103,65,65,66,98,90,119,81,65,111,65,65,89,68,111,70,65,65,98,98,98,98,97,83,57,52,65,120, +119,66,50,81,65,74,73,65,50,49,70,104,87,68,65,89,71,50,50,119,74,73,69,69,69,68,98,70,65,70,68,119, +71,103,65,52,52,52,54,65,65,109,55,114,114,43,103,111,65,65,47,72,52,47,72,72,66,73,71,111,65,114,98,68, +65,68,70,43,65,116,111,68,89,98,70,111,65,65,65,65,47,107,105,67,72,69,47,50,47,53,75,83,107,47,73,65, +50,71,65,103,65,65,89,89,65,65,65,120,97,119,69,103,107,65,47,52,65,65,89,89,65,89,72,72,72,72,88,89, +52,110,100,108,108,102,103,111,65,119,47,52,72,47,65,65,71,50,65,70,116,65,89,68,71,68,70,43,83,81,81,65, +65,65,65,65,72,73,80,72,72,50,105,81,65,69,110,51,47,47,47,52,65,74,73,65,117,119,65,103,74,65,65,67, +65,71,50,120,87,52,65,50,119,65,88,81,65,65,89,65,69,69,65,52,52,54,54,89,65,109,100,107,108,101,103,111, +65,71,72,47,47,52,65,65,119,65,119,65,52,65,89,68,65,68,65,71,83,81,69,69,65,65,103,65,65,65,65,65, +72,48,105,67,69,69,107,51,47,47,47,52,71,53,52,65,117,71,65,98,90,65,65,65,81,71,71,120,97,119,65,67, +65,65,47,81,65,65,68,65,73,89,80,72,72,72,88,89,111,109,84,115,114,87,103,117,119,71,65,47,47,68,84,71, +83,114,101,65,65,107,103,66,98,90,69,107,83,81,69,107,65,65,103,65,69,65,69,65,72,50,105,83,110,107,110,47, +47,47,116,50,119,74,73,65,109,119,65,89,90,81,83,83,81,65,89,119,74,73,65,67,65,69,65,65,65,71,65,90, +65,103,66,52,52,54,52,89,111,103,121,100,97,119,103,111,71,50,119,65,65,67,113,71,65,111,71,72,72,107,103,65, +65,65,47,110,52,65,69,69,65,65,103,65,65,50,119,69,72,107,103,65,69,69,47,47,110,47,57,116,65,65,65,65, +103,65,65,98,89,81,81,65,103,68,98,65,65,65,52,67,66,87,50,71,65,71,89,89,65,122,51,72,72,72,88,89, +70,69,71,84,87,69,70,71,122,98,89,65,65,68,84,65,83,114,89,65,103,72,68,68,65,51,47,47,47,119,69,69, +65,65,103,65,65,65,65,65,65,68,98,89,89,84,47,56,107,47,47,52,65,65,65,65,100,111,65,74,75,81,83,65, +65,65,65,66,74,73,65,73,79,79,87,71,65,71,68,65,65,98,89,52,52,54,52,89,111,111,103,122,119,107,115,65, +68,98,89,65,65,65,71,50,81,65,89,72,72,72,108,116,65,47,107,56,110,52,66,56,65,103,103,65,65,67,81,67, +65,68,65,65,89,88,102,47,110,47,50,48,107,107,107,103,82,65,81,73,73,71,119,71,66,74,65,66,65,73,65,73, +82,117,48,119,50,119,68,65,65,122,51,72,72,72,98,89,65,70,69,71,69,66,66,65,68,98,102,74,73,73,79,117, +83,114,89,65,65,72,103,111,71,47,107,107,110,43,66,56,65,107,103,65,74,81,67,67,65,122,98,89,97,72,102,47, +110,47,107,109,50,50,50,120,65,75,81,73,77,119,65,71,66,104,65,66,73,73,66,77,72,51,71,101,119,107,81,103, +65,65,65,52,52,52,52,70,65,70,111,103,109,111,73,119,68,98,102,80,74,73,79,50,65,65,65,65,119,65,103,111, +65,51,56,107,47,119,65,70,108,108,108,108,74,73,67,67,71,71,65,65,65,72,47,47,110,47,50,119,65,65,65,66, +66,67,81,65,69,71,69,109,66,74,70,111,65,65,66,73,111,111,111,120,119,103,80,111,65,100,100,111,67,69,107,70, +70,70,65,69,119,119,65,71,119,65,72,74,73,73,74,66,65,65,65,71,50,65,106,68,65,71,47,110,43,65,65,66, +66,66,66,65,103,103,88,105,51,47,120,73,49,51,47,47,47,47,47,52,65,65,65,66,73,67,81,68,69,107,48,109, +66,65,70,113,65,66,73,72,67,83,72,50,119,107,103,119,52,70,68,67,67,72,110,65,111,111,65,111,71,65,65,65, +65,65,119,70,116,116,71,65,65,65,65,71,71,65,107,107,107,107,110,47,116,116,114,65,68,65,65,65,65,65,88,54, +110,80,104,83,116,118,47,47,47,47,43,109,109,98,89,66,66,67,81,90,89,50,65,71,65,65,65,67,65,66,73,111, +113,83,111,111,107,69,65,65,65,68,70,67,83,69,110,98,98,98,65,70,105,103,65,65,65,77,69,65,70,65,50,119, +65,65,65,47,113,54,103,69,107,65,65,52,65,65,70,66,66,69,65,107,103,69,72,103,104,74,105,82,49,51,47,47, +47,47,56,56,48,99,89,66,65,73,68,76,76,65,65,65,65,65,107,67,65,66,65,72,67,83,72,67,65,107,66,66, +72,65,74,75,67,68,98,70,65,114,65,65,69,69,103,107,73,77,107,65,70,65,71,65,65,65,65,118,113,54,68,69, +56,65,89,71,80,79,70,65,65,69,65,103,103,69,85,105,79,79,73,74,98,102,47,47,47,47,43,109,109,98,89,65, +65,65,66,90,90,65,50,119,69,103,103,105,81,81,81,65,111,119,111,65,81,67,66,73,72,66,73,67,73,68,65,70, +70,89,65,50,71,69,69,69,78,77,69,65,70,65,71,65,81,81,89,116,113,83,119,48,107,68,68,65,72,65,70,67, +67,69,89,103,103,99,72,103,74,120,73,65,102,98,47,47,47,47,56,52,48,66,74,65,57,70,65,76,73,65,65,65, +103,103,107,65,67,67,107,69,110,65,72,65,67,111,112,66,47,74,74,74,74,68,98,70,114,68,83,119,119,48,65,69, +65,73,119,65,70,65,107,103,83,84,90,74,109,66,119,119,103,106,98,71,73,79,70,66,74,69,89,107,103,99,65,65, +72,47,66,112,98,98,65,65,65,68,65,65,109,73,81,72,70,111,65,66,72,77,107,107,69,65,103,103,65,65,103,107, +103,103,103,69,103,69,68,98,71,50,50,50,80,118,118,70,100,67,65,119,119,119,66,74,74,73,65,65,65,65,65,65, +81,81,90,66,103,66,50,119,103,106,98,65,65,65,65,68,65,65,98,65,68,89,65,85,103,52,70,70,107,106,65,65, +72,68,103,69,48,73,81,65,57,70,65,65,66,77,107,103,65,65,103,69,65,65,107,69,69,65,66,74,74,74,68,114, +50,71,71,50,80,118,118,70,65,111,83,68,65,68,66,74,74,65,65,71,87,65,65,65,111,65,66,74,103,66,119,119, +65,65,65,65,65,65,82,80,56,103,89,89,89,89,65,87,103,52,70,73,105,106,98,68,68,98,107,69,109,81,83,81, +65,65,65,65,69,107,107,103,65,65,65,65,103,65,65,65,65,103,103,65,65,103,106,98,50,50,50,50,80,118,118,98, +68,98,65,68,89,98,66,74,74,65,65,67,105,65,65,65,111,111,66,104,107,53,89,68,72,47,67,65,67,67,66,80, +56,103,98,65,68,89,65,85,103,52,66,70,107,106,68,65,68,68,103,107,48,103,81,81,107,103,65,65,71,65,65,65, +71,65,66,74,103,50,65,65,72,69,72,65,65,69,65,70,50,65,65,49,80,118,118,68,98,65,89,68,68,68,89,66, +65,89,65,71,87,65,65,65,111,69,107,65,47,65,68,89,47,47,54,67,67,65,82,80,56,103,83,81,65,65,65,98, +98,89,65,65,116,114,65,68,68,68,119,65,109,103,83,81,65,107,107,107,65,89,68,65,70,71,83,73,107,71,65,65, +65,83,107,107,65,103,103,65,43,50,50,56,78,47,47,65,89,68,68,68,65,65,98,66,65,89,65,98,89,65,65,65, +111,118,47,103,65,47,68,89,52,52,54,72,67,67,65,74,74,70,81,70,65,69,107,65,89,65,77,103,83,114,68,68, +68,68,83,81,77,69,107,66,52,65,65,119,71,65,68,65,111,117,87,73,73,71,65,65,65,87,48,107,65,52,52,65, +70,111,116,66,74,65,83,98,97,81,89,68,65,65,71,120,89,89,89,89,89,65,65,111,115,47,47,56,72,65,89,68, +52,52,54,65,54,65,81,65,66,70,81,70,65,69,65,103,98,89,73,69,83,114,68,68,65,98,81,66,73,111,81,89, +69,103,71,65,65,89,65,89,70,67,87,74,66,119,65,65,65,83,107,107,65,73,73,107,81,68,65,65,68,98,97,98, +97,65,65,50,65,65,65,66,98,98,89,98,89,103,65,116,116,55,55,56,65,65,65,65,47,47,54,47,54,67,65,65, +66,70,81,70,65,69,65,103,89,89,73,69,116,111,98,65,65,103,83,73,73,71,65,66,65,65,65,65,71,65,68,68, +68,72,47,74,66,65,65,65,65,52,65,52,65,66,65,105,103,70,65,65,83,84,105,97,97,104,65,66,103,100,111,66, +65,65,65,65,70,116,65,65,65,110,47,103,65,65,116,111,72,47,67,81,83,65,81,73,66,70,83,86,65,69,107,65, +98,74,77,103,74,73,66,74,69,103,82,65,73,113,83,65,52,103,65,65,65,89,68,89,89,102,110,65,65,65,72,72, +65,65,72,47,65,73,73,107,81,66,81,65,65,84,106,84,84,104,65,66,103,89,113,66,65,65,65,50,116,116,111,65, +65,100,56,89,74,65,65,111,65,43,50,83,87,121,119,66,73,70,116,70,116,69,65,103,89,89,65,65,53,52,66,65, +103,103,65,65,69,67,65,66,107,103,65,65,71,65,68,65,68,72,47,65,65,65,72,72,65,65,65,65,65,65,65,105, +103,111,68,65,65,84,99,99,99,90,104,104,103,100,113,67,72,47,65,119,115,115,111,65,65,98,122,89,73,65,70,65, +65,71,65,67,71,65,81,52,119,52,119,52,119,52,119,52,98,89,65,65,74,73,66,66,107,107,65,65,65,67,83,80, +47,52,65,65,65,89,65,100,118,81,81,65,65,65,65,65,71,65,65,65,65,47,65,72,43,65,69,65,65,84,98,106, +106,89,103,103,103,97,67,83,74,74,65,50,116,116,111,65,65,89,89,89,73,65,65,65,65,43,71,65,71,65,119,98, +98,103,69,74,77,77,65,65,65,65,65,65,50,119,66,74,65,103,65,103,53,47,47,74,47,52,65,65,71,65,65,70, +47,67,65,65,65,65,71,87,87,87,87,76,73,47,71,72,52,65,111,65,81,81,98,98,98,65,69,65,107,105,83,65, +47,47,65,119,108,108,103,65,65,89,82,89,74,65,65,51,65,72,50,65,65,71,119,98,98,65,65,71,50,119,65,71, +50,119,65,65,79,73,65,65,65,65,69,69,80,74,74,74,80,56,107,107,65,69,85,108,118,67,74,73,65,65,65,119, +119,119,119,76,73,65,71,74,74,71,65,65,67,74,65,83,81,89,65,65,65,65,67,65,73,65,65,50,69,107,65,65, +65,97,73,89,66,65,65,47,65,72,70,65,65,65,65,68,65,65,65,119,65,71,50,119,110,79,65,65,69,65,65,65, +65,88,52,69,53,47,74,74,74,56,110,107,70,69,105,103,65,67,47,52,65,65,65,119,120,119,119,76,73,65,71,74, +66,52,65,65,65,73,73,65,81,98,55,65,119,65,83,81,89,65,65,65,103,65,107,103,65,82,73,69,66,65,65,65, +47,52,65,65,65,65,72,72,72,69,110,56,103,65,50,65,73,103,65,65,103,103,65,81,65,72,52,103,65,65,65,74, +74,77,47,56,116,69,107,83,65,65,116,113,83,74,65,71,65,71,65,65,65,103,65,73,104,73,69,65,65,73,79,67, +71,52,71,65,65,71,70,122,98,89,117,65,103,65,103,65,67,73,66,116,74,65,65,65,52,52,69,65,65,53,73,103, +103,69,110,56,103,71,65,119,103,73,77,51,69,65,67,81,65,65,69,107,65,65,98,101,50,48,110,107,70,69,65,81, +81,49,119,65,81,73,73,119,120,119,119,107,103,107,107,107,65,67,89,65,65,73,73,81,65,89,65,119,119,119,65,81, +89,71,65,73,103,65,107,103,82,65,66,111,65,65,65,65,65,111,109,103,111,120,103,107,103,69,110,56,103,65,68,89, +53,104,103,43,69,65,65,65,70,116,65,65,72,52,89,71,83,107,107,107,65,73,67,67,67,71,117,67,81,73,73,65, +65,65,65,111,65,50,50,50,65,65,65,65,65,74,65,83,81,52,65,71,50,65,65,111,122,65,71,65,103,65,65,103, +73,74,73,116,65,65,65,65,65,65,69,67,65,56,103,69,65,65,65,65,65,65,111,70,81,68,80,99,103,103,65,81, +70,70,65,81,65,65,68,69,107,107,110,103,66,120,65,81,81,65,49,119,65,74,65,50,51,103,74,70,65,107,107,107, +65,70,119,81,65,81,65,71,65,68,55,65,119,65,81,85,69,65,111,65,107,103,107,103,70,69,107,111,71,68,116,111, +111,111,65,87,83,65,67,65,81,65,65,65,65,65,72,65,81,89,65,120,103,103,71,119,70,116,68,98,98,65,65,89, +65,69,47,47,65,73,65,67,65,65,65,65,65,74,73,79,107,47,74,65,111,65,65,103,65,72,73,85,107,81,65,65, +65,66,74,65,65,65,71,69,103,71,77,73,65,65,65,65,114,115,74,116,119,122,116,70,70,70,70,83,83,81,83,81, +81,65,107,81,47,57,65,111,69,65,71,71,86,81,107,49,65,65,70,114,111,65,98,89,65,69,110,103,66,120,70,116, +65,65,47,72,65,66,66,71,52,107,73,83,81,52,69,65,65,65,65,81,81,81,67,67,70,70,111,116,65,70,70,115, +69,116,65,65,65,65,65,70,100,69,77,65,119,68,100,111,111,111,65,81,83,67,67,67,81,65,109,103,74,73,98,65, +107,107,71,50,113,111,71,50,119,65,68,114,116,111,113,83,74,69,65,67,65,73,70,107,111,65,65,72,65,66,71,79, +69,52,73,65,65,65,107,107,65,65,65,105,83,103,67,67,65,73,65,73,65,65,65,65,65,65,65,65,72,47,47,70, +111,70,70,65,71,98,98,89,65,65,65,65,67,65,67,65,81,65,85,103,83,81,83,88,52,65,71,71,113,115,69,50, +65,83,68,98,118,111,111,65,66,69,65,84,81,98,100,107,111,73,47,72,81,65,65,65,67,81,65,107,107,103,65,65, +65,65,65,107,69,103,65,65,70,74,65,78,71,71,50,71,65,89,65,65,89,72,65,81,81,70,70,65,65,119,90,74, +65,65,69,103,107,66,73,65,65,52,52,52,81,81,81,88,54,83,83,83,86,85,107,120,119,88,85,103,116,116,113,83, +66,69,65,81,81,89,100,116,66,73,47,65,65,65,65,65,81,67,119,47,88,52,119,56,52,65,65,103,103,103,65,81, +70,73,73,78,71,71,65,71,65,68,65,68,107,110,65,69,65,89,65,89,119,119,90,65,72,47,69,69,69,73,65,65, +65,66,74,65,83,81,83,65,66,65,105,66,113,115,69,50,73,83,85,56,111,111,111,66,66,69,67,65,67,98,100,65, +79,120,73,67,83,65,65,65,87,121,65,54,83,52,65,105,103,65,65,103,65,103,65,81,70,73,66,78,71,65,71,71, +65,68,68,68,50,110,71,69,71,68,55,65,71,65,90,66,72,80,69,69,69,73,65,65,65,65,103,65,81,65,81,81, +66,107,69,66,86,85,69,120,119,81,85,103,111,111,113,83,74,77,103,70,65,89,70,70,104,74,74,83,83,81,65,65, +81,67,65,107,107,103,65,56,52,65,65,103,65,103,67,67,70,73,65,78,50,71,50,71,119,65,89,89,48,51,65,50, +119,88,65,72,47,54,90,74,72,47,69,65,69,66,73,65,65,72,72,65,81,65,83,65,66,103,107,66,34,41,59,10, +172,105,109,103,72,101,105,103,104,116,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,46,104, +101,105,103,104,116,59,10,172,105,109,103,83,99,114,111,108,108,61,77,97,116,104,46,102,108,111,111,114,40,77,97,116, +104,46,114,97,110,100,111,109,40,41,42,105,109,103,72,101,105,103,104,116,41,59,10,103,46,114,101,115,101,116,40,41, +46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, +48,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,69,78,86,46,86,69,82,83,73,79,78,43,34,32,32, +34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47, +50,44,49,55,49,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,50,52,41,59,10,170, +103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44,102,105,108,101,41,123,172,106,61,115,46,114,101,97,100,74, +83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40,34,111,98,106,101,99,116,34,138,191,106,41,63,106,46,118, +101,114,115,105,111,110,58,181,59,171,118,63,40,110,97,109,101,43,34,32,34,43,40,118,63,34,118,34,43,118,58,34, +85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34,43,110,97,109,101,59,125,10,172,118,101,114,115,105,111,110, +115,61,91,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111,111,116, +46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44,34,108, +97,117,110,99,104,46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103, +115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,93,59,10,172,108,111,103,111,61,69,46,116,111,65, +114,114,97,121,66,117,102,102,101,114,40,97,116,111,98,40,34,80,66,119,66,65,65,65,65,65,65,65,66,47,103,65, 65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65, -65,65,65,65,68,47,119,43,65,65,65,65,81,65,72,65,52,104,65,65,65,65,81,65,77,65,77,104,65,65,65,65, -81,65,89,66,109,104,65,65,65,65,81,65,89,66,71,105,65,65,65,65,81,65,81,67,68,47,72,55,52,43,82,52, -119,71,68,104,111,75,74,67,83,69,119,69,68,103,111,75,74,67,84,56,119,70,68,103,111,75,74,67,83,65,119,72, -68,104,111,75,74,67,83,69,81,72,106,47,72,54,73,43,82,52,89,72,109,65,65,65,65,67,65,65,89,69,71,65, -65,65,66,67,65,65,77,69,77,65,65,65,65,56,65,65,72,65,52,65,65,65,65,65,65,65,68,47,119,65,65,65, -65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65, -65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,34,41,41,59,10,172,105, -109,97,103,101,84,111,112,61,50,52,59,10,170,100,114,97,119,73,110,102,111,40,41,123,103,46,114,101,115,101,116,40, -41,46,99,108,101,97,114,82,101,99,116,40,66,97,110,103,108,101,46,97,112,112,82,101,99,116,41,59,103,46,100,114, -97,119,73,109,97,103,101,40,108,111,103,111,44,87,45,54,48,44,50,52,41,59,103,46,115,101,116,70,111,110,116,40, -34,52,120,54,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114, -105,110,103,40,34,66,65,78,71,76,69,74,83,46,67,79,77,34,44,87,45,51,48,44,53,54,41,59,172,104,61,56, -44,121,61,50,52,45,104,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,41,46,115,101,116,70,111,110,116, -65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,111,119,101,114, -101,100,32,98,121,32,69,115,112,114,117,105,110,111,34,44,48,44,121,150,52,43,104,41,59,103,46,100,114,97,119,83, -116,114,105,110,103,40,34,86,101,114,115,105,111,110,32,34,43,69,78,86,46,86,69,82,83,73,79,78,44,48,44,121, -150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,111,109,109,105,116,32,34,43,69,78,86,46,71, -73,84,95,67,79,77,77,73,84,44,48,44,121,150,104,41,59,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111, -116,108,111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,59,103,101,116,86,101,114,115,105,111,110, -40,34,76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,103,101,116,86,101, -114,115,105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41, -59,103,46,100,114,97,119,83,116,114,105,110,103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114, -115,34,44,48,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114,97,103,101,58, -32,34,43,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114,101,101,40,41, -146,49,48,41,43,34,107,32,102,114,101,101,34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83,84,79,82,65, -71,69,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43,40,69,78,86, -46,83,84,79,82,65,71,69,146,49,48,41,43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104,41,59,163,40, -69,78,86,46,83,80,73,70,76,65,83,72,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,80,73,32,70, -108,97,115,104,58,32,34,43,40,69,78,86,46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107,34,44,48,44, -121,150,104,41,59,105,109,97,103,101,84,111,112,61,121,43,104,59,105,109,103,83,99,114,111,108,108,61,105,109,103,72, -101,105,103,104,116,45,105,109,97,103,101,84,111,112,59,103,46,114,101,115,101,116,40,41,46,115,101,116,70,111,110,116, -40,34,54,120,49,53,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97, -119,83,116,114,105,110,103,40,69,78,86,46,86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70,46,103,101,116, -65,100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49,41,59,100,114, -97,119,73,109,97,103,101,40,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,100,114,97,119,73,109, -97,103,101,40,41,59,103,46,102,108,105,112,40,41,59,105,109,103,83,99,114,111,108,108,61,40,105,109,103,83,99,114, -111,108,108,43,49,41,37,105,109,103,72,101,105,103,104,116,59,125,44,50,48,41,59,125,10,170,100,114,97,119,73,109, -97,103,101,40,41,123,103,46,115,101,116,67,108,105,112,82,101,99,116,40,48,44,105,109,97,103,101,84,111,112,44,87, -45,49,44,72,45,49,52,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105,109,97,103,101, -84,111,112,45,105,109,103,83,99,114,111,108,108,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48, -44,105,109,97,103,101,84,111,112,43,105,109,103,72,101,105,103,104,116,45,105,109,103,83,99,114,111,108,108,41,59,103, -46,115,101,116,67,108,105,112,82,101,99,116,40,48,44,48,44,87,45,49,44,72,45,49,41,59,125,10,115,101,116,84, -105,109,101,111,117,116,40,100,114,97,119,73,110,102,111,44,49,48,48,48,41,59,10,115,101,116,87,97,116,99,104,40, -95,162,108,111,97,100,40,41,44,66,84,78,49,41,59,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,68,47,119,43,65,65,65,65, +81,65,72,65,52,104,65,65,65,65,81,65,77,65,77,104,65,65,65,65,81,65,89,66,109,104,65,65,65,65,81,65, +89,66,71,105,65,65,65,65,81,65,81,67,68,47,72,55,52,43,82,52,119,71,68,104,111,75,74,67,83,69,119,69, +68,103,111,75,74,67,84,56,119,70,68,103,111,75,74,67,83,65,119,72,68,104,111,75,74,67,83,69,81,72,106,47, +72,54,73,43,82,52,89,72,109,65,65,65,65,67,65,65,89,69,71,65,65,65,66,67,65,65,77,69,77,65,65,65, +65,56,65,65,72,65,52,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65, +65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65, +66,47,103,65,65,65,65,65,65,65,66,47,103,34,41,41,59,10,172,105,109,97,103,101,84,111,112,61,50,52,59,10, +170,100,114,97,119,73,110,102,111,40,41,123,103,46,114,101,115,101,116,40,41,46,99,108,101,97,114,82,101,99,116,40, +66,97,110,103,108,101,46,97,112,112,82,101,99,116,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,111,103,111, +44,87,45,54,48,44,50,52,41,59,103,46,115,101,116,70,111,110,116,40,34,52,120,54,34,41,46,115,101,116,70,111, +110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74, +83,46,67,79,77,34,44,87,45,51,48,44,53,54,41,59,172,104,61,56,44,121,61,50,52,45,104,59,103,46,115,101, +116,70,111,110,116,40,34,54,120,56,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41, +59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105, +110,111,34,44,48,44,121,150,52,43,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105, +111,110,32,34,43,69,78,86,46,86,69,82,83,73,79,78,44,48,44,121,150,104,41,59,103,46,100,114,97,119,83,116, +114,105,110,103,40,34,67,111,109,109,105,116,32,34,43,69,78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44, +121,150,104,41,59,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111, +111,116,46,105,110,102,111,34,41,59,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44, +34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105, +110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,59,103,46,100,114,97,119,83,116,114,105,110, +103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114,115,34,44,48,44,121,150,104,41,59,103,46, +100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114,97,103,101,58,32,34,43,40,114,101,113,117,105,114,101,40, +34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114,101,101,40,41,146,49,48,41,43,34,107,32,102,114,101,101, +34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83,84,79,82,65,71,69,41,103,46,100,114,97,119,83,116,114, +105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43,40,69,78,86,46,83,84,79,82,65,71,69,146,49,48,41, +43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83,80,73,70,76,65,83,72, +41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,80,73,32,70,108,97,115,104,58,32,34,43,40,69,78,86, +46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107,34,44,48,44,121,150,104,41,59,105,109,97,103,101,84,111, +112,61,121,43,104,59,105,109,103,83,99,114,111,108,108,61,105,109,103,72,101,105,103,104,116,45,105,109,97,103,101,84, +111,112,59,103,46,114,101,115,101,116,40,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116, +70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,69,78,86,46, +86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46, +103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49,41,59,100,114,97,119,73,109,97,103,101,40,41,59,115,101, +116,73,110,116,101,114,118,97,108,40,170,40,41,123,100,114,97,119,73,109,97,103,101,40,41,59,103,46,102,108,105,112, +40,41,59,105,109,103,83,99,114,111,108,108,61,40,105,109,103,83,99,114,111,108,108,43,49,41,37,105,109,103,72,101, +105,103,104,116,59,125,44,50,48,41,59,125,10,170,100,114,97,119,73,109,97,103,101,40,41,123,103,46,115,101,116,67, +108,105,112,82,101,99,116,40,48,44,105,109,97,103,101,84,111,112,44,87,45,49,44,72,45,49,52,41,59,103,46,100, +114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105,109,97,103,101,84,111,112,45,105,109,103,83,99,114,111,108, +108,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105,109,97,103,101,84,111,112,43,105,109, +103,72,101,105,103,104,116,45,105,109,103,83,99,114,111,108,108,41,59,103,46,115,101,116,67,108,105,112,82,101,99,116, +40,48,44,48,44,87,45,49,44,72,45,49,41,59,125,10,115,101,116,84,105,109,101,111,117,116,40,100,114,97,119,73, +110,102,111,44,49,48,48,48,41,59,10,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78, +49,41,59,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85, +85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254, +16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,254,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121, -85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,85,85,85,85,85,85,85,121,200,206,206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206, -163,85,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,85,85,85,121,163,206,206,206,206,206,206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,121,199,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206, -206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,121,206,206,206,206,206,206,206,206,206,206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206, -121,79,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,79,79,121,199,206,206,206,206,206,206,206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79, -79,79,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,79,79,79,198,198,198,198,198,198,198,198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15, -51,86,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,101,101,15,15,128,198,198,198,198,198,198,198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15, -58,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, -101,101,101,58,15,15,206,205,199,198,198,199,205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15, -101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101, -101,101,101,101,58,15,15,164,206,206,206,206,164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101, -101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101, -101,101,101,101,101,65,15,15,15,15,15,15,15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101, -101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121,85,85,85,85,85,85,85,254,254,254,16,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,200,206, +206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206,163,85,85,85,85,85,85,85,254,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206, +206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,254,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,199,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206, +206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206,121,79,85,85,85,85,85,85,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,79,79,121,199,206,206,206,206,206,206, +206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79,79,79,85,85,85,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,79,79,79,198,198,198,198,198,198,198, +198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15,51,86,85,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,15,15,128,198,198,198,198,198,198, +198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15,58,101,101,101,101,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,58,15,15,206,205,199,198,198,199, +205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15,101,101,101,101,101,101,101,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,58,15,15,164,206,206,206,206, +164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101,101,101,101,101,101,101,101,101,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,65,15,15,15,15,15,15, +15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101, +101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110, -102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116, -34,44,34,110,97,109,101,34,58,34,65,98,111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112, -112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114, -100,101,114,34,58,45,52,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58, -34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102, -111,44,97,98,111,117,116,46,97,112,112,46,106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,54,1,0,0, -119,105,100,108,111,99,107,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, -123,163,40,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,41,171,59,66,97,110,103,108,101,46,111,110,40, -34,108,111,99,107,34,44,170,40,111,110,41,123,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93,46,119,105,100, -116,104,61,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,63,49,54,58,48,59,66,97,110,103,108,101, -46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,125,41,59,87,73,68,71,69,84,83,91,34,108,111,99,107,34, -93,61,123,97,114,101,97,58,34,116,108,34,44,115,111,114,116,111,114,100,101,114,58,49,48,44,119,105,100,116,104,58, -66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,63,49,54,58,48,44,100,114,97,119,58,170,40,119,41, -123,163,40,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,41,103,46,114,101,115,101,116,40,41,46,100, -114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,68,104,65,66,72,43,68,47,119,119,77,77,68,68,65,119,119, -77,102,47,118,47,47,52,102,43,72,47,104,47,56,47,47,80,47,122,47,47,47,102,47,103,61,61,34,41,44,119,46, -120,43,49,44,119,46,121,43,52,41,59,125,125,59,125,41,40,41,255,255,129,0,0,0,119,105,100,108,111,99,107,46, -105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,108,111, -99,107,34,44,34,110,97,109,101,34,58,34,76,111,99,107,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58, -34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,54,34,44,34,116,97,103,115,34, -58,34,119,105,100,103,101,116,44,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,119,105,100,108,111,99,107,46, -105,110,102,111,44,119,105,100,108,111,99,107,46,119,105,100,46,106,115,34,125,255,255,255,98,3,0,0,119,105,100,98, -97,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,170,115,101, -116,87,105,100,116,104,40,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116,104,61,52,48, -43,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59,125,66,97,110, -103,108,101,46,111,110,40,39,99,104,97,114,103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103,41,123,163,40, -99,104,97,114,103,105,110,103,41,66,97,110,103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105,100,116,104,40, -41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105,112,40,41,59, -125,41,59,172,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105,115,76,67,68, -79,110,40,41,63,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116, -34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110,40,39,108,99, -100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91,34,98,97,116, -34,93,46,100,114,97,119,40,41,59,163,40,33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,98,97,116, -116,101,114,121,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71, -69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123,163,40,98,97, -116,116,101,114,121,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,98,97,116, -116,101,114,121,73,110,116,101,114,118,97,108,41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,183,59, -125,125,125,41,59,87,73,68,71,69,84,83,91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119, -105,100,116,104,58,52,48,44,100,114,97,119,58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46,120,44,121,61, -175,46,121,59,103,46,114,101,115,101,116,40,41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110, -103,40,41,41,123,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119,73,109,97,103, -101,40,97,116,111,98,40,34,68,104,103,66,72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47,47,47,47,47, -47,47,47,47,47,47,47,47,47,47,51,47,52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,66,52,65, -101,65,72,103,34,41,44,120,44,121,41,59,120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114,40,103,46,116, -104,101,109,101,46,102,103,41,46,102,105,108,108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45,52,44,121,43, -50,49,41,46,99,108,101,97,114,82,101,99,116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44,121,43,49,57, -41,46,102,105,108,108,82,101,99,116,40,120,43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43,49,52,41,59, -103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40,120,43,52,44, -121,43,54,44,120,43,52,43,69,46,103,101,116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50,41,47,49,48, -48,44,121,43,49,55,41,59,125,125,59,115,101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255,138,0,0,0, -119,105,100,98,97,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100, -34,58,34,119,105,100,98,97,116,34,44,34,110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76,101,118,101,108, -32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111, -110,34,58,34,48,46,48,57,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116,116,101,114,121, -34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97,116,46,119,105, -100,46,106,115,34,125,255,255,165,1,0,0,119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,61,123,97,114, -101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46,114,101,115,101, -116,40,41,59,163,40,78,82,70,46,103,101,116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40,41,46,99,111, -110,110,101,99,116,101,100,41,103,46,115,101,116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80,40,41,62,56, -41,63,34,35,48,55,102,34,58,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35, -48,48,102,34,41,41,59,164,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63, -34,35,54,54,54,34,58,34,35,57,57,57,34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40, -34,67,120,81,66,66,103,68,103,70,103,74,103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78,89,121,98,69, -89,73,119,84,65,115,66,119,68,65,65,61,61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41,59,125,44,99, -104,97,110,103,101,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46, -100,114,97,119,40,41,59,125,125,59,10,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,87,73,68,71, -69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78,82,70,46,111, -110,40,39,100,105,115,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116, -104,34,93,46,99,104,97,110,103,101,100,41,59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110,102,111,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116,34,44,34,110, -97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34, -119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58, -34,119,105,100,103,101,116,44,98,108,117,101,116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98, -116,46,105,110,102,111,44,119,105,100,98,116,46,119,105,100,46,106,115,34,125,255,255,255,252,0,0,0,119,105,100,105, -100,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,40,41,162,123,170,100,114, -97,119,40,41,123,172,105,100,61,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114, -40,41,46,115,117,98,115,116,114,40,49,50,41,46,115,112,108,105,116,40,34,58,34,41,59,103,46,114,101,115,101,116, -40,41,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58, -34,35,48,48,102,34,41,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,49,41,59,103,46,100,114,97,119,83, -116,114,105,110,103,40,105,100,91,48,93,44,175,46,120,43,50,44,175,46,121,43,52,44,180,41,59,103,46,100,114,97, -119,83,116,114,105,110,103,40,105,100,91,49,93,44,175,46,120,43,50,44,175,46,121,43,49,52,44,180,41,59,125,87, -73,68,71,69,84,83,91,34,119,105,100,105,100,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104, -58,49,54,44,100,114,97,119,58,100,114,97,119,125,59,125,41,40,41,59,138,0,0,0,119,105,100,105,100,46,105,110, -102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,105,100, -34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,73,68,32,87,105,100,103,101,116,34,44,34, -116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,51,34,44, -34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,97,100,100,114,101,115,115,44,109,97,99,34,44,34,102,105,108, -101,115,34,58,34,119,105,100,105,100,46,105,110,102,111,44,119,105,100,105,100,46,119,105,100,46,106,115,34,125,255,255, -169,0,0,0,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0, -40,170,40,41,123,173,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74, -83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101, -108,99,111,109,101,100,41,123,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39, -83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123, -119,101,108,99,111,109,101,100,58,180,125,41,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115, -39,41,125,41,125,125,41,40,41,255,255,255,94,23,0,0,119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100, -41,123,172,99,61,103,46,103,101,116,67,111,108,111,114,40,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108, -40,170,40,41,123,163,40,115,101,113,46,108,101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104,105,102,116,40, -41,59,103,46,115,101,116,67,111,108,111,114,40,99,41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73, -110,116,101,114,118,97,108,40,105,41,59,125,44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108, -44,99,97,108,108,98,97,99,107,41,123,172,110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67, -111,108,111,114,40,99,111,108,41,59,167,40,172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114, -97,119,76,105,110,101,40,105,44,48,44,48,44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50, -52,48,44,105,41,59,103,46,102,108,105,112,40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101, -111,117,116,40,102,44,48,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69, -78,69,95,67,79,85,78,84,61,49,48,59,10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41, -171,170,40,41,123,103,46,114,101,115,101,116,40,41,46,115,101,116,66,103,67,111,108,111,114,40,48,41,46,99,108,101, -97,114,82,101,99,116,40,48,44,48,44,49,55,54,44,49,55,54,41,59,103,46,115,101,116,70,111,110,116,40,34,54, -120,49,53,34,41,59,172,110,61,48,59,172,108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111,40,41,59,172, -105,109,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,108,41,59,172,105,61,115,101,116,73,110,116,101,114, -118,97,108,40,170,40,41,123,110,150,48,46,49,59,103,46,115,101,116,67,111,108,111,114,40,110,44,110,44,110,41,59, -103,46,100,114,97,119,73,109,97,103,101,40,108,44,40,49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,44,40, -49,55,54,45,105,109,46,104,101,105,103,104,116,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101,97,114,73,110, -116,101,114,118,97,108,40,105,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116, -114,105,110,103,40,34,79,112,101,110,34,44,52,52,44,49,48,52,41,44,53,48,48,41,59,115,101,116,84,105,109,101, -111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108,101,34,44,52, -52,44,49,49,54,41,44,49,48,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,83,109,97,114,116,32,87,97,116,99,104,34,44,52,52,44,49,50,56,41,44,49,53, -48,48,41,59,125,125,44,53,48,41,59,125,59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103,61,114,101,113, -117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116, -111,98,40,34,112,116,82,52,110,47,106,47,52,103,72,43,56,72,53,119,108,43,106,79,117,107,86,86,111,72,90,56, -100,116,47,110,47,47,110,51,55,79,116,103,72,57,115,72,104,119,72,112,52,72,53,120,109,107,71,105,72,55,50,77, -82,106,101,47,76,76,47,55,105,73,65,69,69,55,115,80,69,103,111,65,67,43,65,108,97,103,73,108,73,105,77,81, -69,114,80,120,68,119,85,89,120,65,65,66,119,73,72,67,106,56,78,55,110,79,108,51,117,69,113,97,54,66,69,103, -103,110,70,106,102,77,53,110,67,107,85,105,108,51,103,69,113,53,75,68,65,65,81,109,67,54,81,109,66,69,52,74, -120,83,69,104,73,65,66,105,81,109,66,56,81,109,83,88,111,81,108,67,89,82,77,100,69,119,73,108,67,65,65,73, -108,78,104,89,108,79,105,79,56,53,110,78,69,121,77,80,69,111,90,119,73,65,65,99,115,89,73,89,109,80,88,111, -89,108,77,105,75,97,70,69,120,88,47,117,57,86,69,113,76,66,66,79,89,114,67,72,43,99,122,109,116,86,113,74, -121,68,69,112,105,97,67,79,89,115,103,83,89,115,122,109,99,51,113,116,84,69,113,77,82,55,104,122,71,56,65,108, -71,109,100,49,79,81,103,108,79,79,89,54,97,69,103,89,108,67,109,109,90,111,74,77,67,84,66,114,110,68,54,83, -97,73,69,111,85,47,122,79,85,117,111,108,83,106,98,110,66,74,103,113,97,67,69,111,85,53,122,79,88,88,52,82, -121,81,89,66,66,122,67,83,52,88,53,122,78,68,113,113,90,67,74,105,69,82,74,103,53,122,66,69,111,86,74,69, -111,77,49,74,103,89,108,81,106,104,77,72,99,52,74,76,69,109,90,77,69,69,112,54,90,73,74,103,80,122,83,52, -87,84,109,90,77,86,84,73,76,109,70,89,65,75,43,66,109,103,108,67,109,100,49,74,103,85,89,74,105,80,78,69, -111,114,65,66,69,73,79,90,121,103,68,66,109,53,77,67,105,74,77,81,108,104,77,72,56,66,121,66,88,119,73,108, -66,74,103,85,120,74,105,77,100,53,110,79,84,73,122,108,66,84,65,75,43,66,65,65,78,86,113,52,106,80,65,65, -83,47,72,74,103,74,121,67,84,65,84,65,69,65,67,67,47,66,52,83,47,73,74,103,73,108,67,89,65,103,65,80, -105,83,47,75,110,53,121,69,89,65,78,84,69,121,80,99,53,110,105,79,81,120,77,66,47,76,108,67,79,97,112,121, -74,74,103,98,112,66,89,65,90,122,82,79,81,75,47,71,108,48,65,84,73,87,102,69,111,90,122,66,99,54,73,108, -66,54,83,89,71,103,66,74,66,74,103,112,122,83,108,104,121,72,56,69,65,104,53,77,66,84,73,106,110,67,117,73, -108,79,106,106,108,72,84,65,74,122,67,47,76,109,68,84,83,83,89,73,69,111,84,65,66,79,89,73,108,69,84,83, -75,89,72,88,119,73,65,66,79,89,77,48,121,89,109,69,84,83,67,89,72,69,111,98,110,68,79,89,113,97,66,69, -120,117,56,84,65,119,108,69,99,52,85,53,69,111,105,97,67,109,75,43,78,84,65,111,108,70,69,119,88,48,84,81, -122,66,77,88,119,88,105,69,112,84,66,67,65,65,111,109,78,69,111,83,43,69,69,111,52,109,73,89,73,73,109,75, -69,111,83,43,69,69,112,68,111,66,69,121,85,98,69,111,51,103,69,111,52,109,74,100,65,73,109,73,74,89,52,108, -74,69,121,99,100,69,111,80,79,79,66,89,109,80,117,73,108,69,43,72,99,74,89,104,75,75,84,90,49,102,104,89, -107,66,50,69,65,104,110,78,99,89,77,117,69,104,111,109,77,114,56,65,51,89,65,66,69,111,74,121,66,53,103,106, -79,65,65,89,109,72,109,57,86,103,69,76,69,111,74,77,66,69,111,88,65,69,121,88,122,69,52,53,89,66,74,103, -88,119,69,113,120,49,73,43,66,121,68,79,89,74,121,86,74,119,53,121,67,103,69,66,51,99,81,71,103,74,77,87, -74,119,81,110,67,117,54,47,67,103,70,66,105,103,68,66,49,51,83,47,103,108,86,65,65,102,49,113,111,109,67,103, -108,69,111,65,68,66,49,81,68,66,65,68,69,80,69,111,78,86,113,69,65,111,108,69,103,69,75,111,108,75,69,114, -74,77,68,89,65,74,77,68,48,108,69,48,65,109,97,69,111,78,97,65,103,74,77,67,70,73,89,65,97,104,86,47, -73,103,73,105,68,79,84,103,65,66,78,89,74,77,69,79,84,111,105,67,73,111,74,77,67,79,84,122,102,67,78,52, -82,77,66,79,84,120,115,68,74,73,82,121,102,73,119,90,77,66,75,81,90,122,102,74,103,82,121,102,79,89,90,77, -66,79,85,66,122,67,74,103,78,75,79,84,53,122,68,74,103,76,111,67,65,68,120,75,66,79,65,73,65,66,79,84, -54,97,67,65,65,82,121,102,79,89,82,121,106,79,89,82,121,106,79,89,108,75,69,115,66,122,69,69,115,66,122,69, -79,85,74,122,68,79,85,73,65,66,79,85,105,97,68,79,85,82,122,67,79,85,90,122,67,69,115,99,75,67,105,89, -34,41,41,59,172,105,109,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,59,103,46,114,101, -115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48,48,102,102,34,41,59,172,121, -61,49,55,54,44,115,112,101,101,100,61,53,59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97,99,107,41,123, -121,151,115,112,101,101,100,59,172,120,61,40,49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,59,103,46,100,114, -97,119,73,109,97,103,101,40,105,109,103,44,120,44,121,41,59,103,46,99,108,101,97,114,82,101,99,116,40,120,44,121, -43,56,49,44,120,43,55,55,44,121,43,56,49,43,115,112,101,101,100,41,59,163,40,121,62,51,48,41,115,101,116,84, -105,109,101,111,117,116,40,98,97,108,108,111,111,110,44,48,44,99,97,108,108,98,97,99,107,41,59,164,99,97,108,108, -98,97,99,107,40,41,59,125,102,97,100,101,40,34,35,102,102,48,48,102,102,34,44,170,40,41,123,98,97,108,108,111, -111,110,40,170,40,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,115,101,116,70,111,110,116,40,34,54, -120,49,53,58,50,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119, -83,116,114,105,110,103,40,34,87,101,108,99,111,109,101,46,34,44,56,56,44,49,51,48,41,59,125,41,59,125,41,59, -115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110,116,101,114,118, -97,108,40,170,40,41,123,110,150,52,59,103,46,115,99,114,111,108,108,40,48,44,45,52,41,59,163,40,110,62,49,53, -48,41,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51,53,48,48,41, -59,125,59,163,40,110,138,50,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67, -111,108,111,114,40,34,35,102,102,102,102,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97, -114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108, -105,103,110,40,48,44,48,41,59,172,120,61,55,48,44,121,61,50,53,44,104,61,50,53,59,97,110,105,109,97,116,101, -40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41,44, -40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150, -104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,104,97,115,32,111,110,101,34,44,120,44,121, -150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,117,116,116,111,110,34,44,120,44,121, -150,104,41,44,40,41,162,123,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,58,50,34,41,46,115,101,116, -70,111,110,116,65,108,105,103,110,40,48,44,48,44,49,41,46,100,114,97,119,83,116,114,105,110,103,40,34,72,69,82, -69,33,34,44,49,53,48,44,56,56,41,59,125,93,44,50,48,48,41,59,125,59,163,40,110,138,51,41,171,170,40,41, -123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,102,102, -34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116, -65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,59,103,46,100, -114,97,119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116, +254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116,34,44,34,110,97,109,101,34,58,34,65,98, +111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34, +58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,52,44,34,118,101,114, +115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109, +34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102,111,44,97,98,111,117,116,46,97,112,112,46, +106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,54,1,0,0,119,105,100,108,111,99,107,46,119,105,100,46, +106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,163,40,33,66,97,110,103,108,101,46,105, +115,76,111,99,107,101,100,41,171,59,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,170,40,111,110,41, +123,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93,46,119,105,100,116,104,61,66,97,110,103,108,101,46,105,115, +76,111,99,107,101,100,40,41,63,49,54,58,48,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115, +40,41,59,125,41,59,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93,61,123,97,114,101,97,58,34,116,108,34, +44,115,111,114,116,111,114,100,101,114,58,49,48,44,119,105,100,116,104,58,66,97,110,103,108,101,46,105,115,76,111,99, +107,101,100,40,41,63,49,54,58,48,44,100,114,97,119,58,170,40,119,41,123,163,40,66,97,110,103,108,101,46,105,115, +76,111,99,107,101,100,40,41,41,103,46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111, +98,40,34,68,104,65,66,72,43,68,47,119,119,77,77,68,68,65,119,119,77,102,47,118,47,47,52,102,43,72,47,104, +47,56,47,47,80,47,122,47,47,47,102,47,103,61,61,34,41,44,119,46,120,43,49,44,119,46,121,43,52,41,59,125, +125,59,125,41,40,41,255,255,129,0,0,0,119,105,100,108,111,99,107,46,105,110,102,111,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,108,111,99,107,34,44,34,110,97,109,101,34,58,34, +76,111,99,107,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101, +114,115,105,111,110,34,58,34,48,46,48,54,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,108,111,99, +107,34,44,34,102,105,108,101,115,34,58,34,119,105,100,108,111,99,107,46,105,110,102,111,44,119,105,100,108,111,99,107, +46,119,105,100,46,106,115,34,125,255,255,255,98,3,0,0,119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68, +71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116,104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67, +104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59,125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114, +103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103,41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110, +103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105,100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97, +119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105,112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73, +110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101, +114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48, +48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110, +41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40, +33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, +61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100, +114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123,163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97, +108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, +41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83, +91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119, +58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46,120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40, +41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111, +108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66, +72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47, +52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59, +120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108, +108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45,52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99, +116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44,121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120, +43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43,49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34, +35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40,120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101, +116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50,41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115, +101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255,138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34, +110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76,101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121, +112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116, +97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116,116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119, +105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97,116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0, +119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71, +69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116, +104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46,114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101, +116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40,41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101, +116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80,40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46, +116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101, +116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57, +34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74, +103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78,89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61, +61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41,59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87, +73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78, +82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111, +116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78,82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99, +116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41, +59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116,34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111, +111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114, +115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101, +116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116, +46,119,105,100,46,106,115,34,125,255,255,255,252,0,0,0,119,105,100,105,100,46,119,105,100,46,106,115,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,40,40,41,162,123,170,100,114,97,119,40,41,123,172,105,100,61,78,82,70, +46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,41,46,115,117,98,115,116,114,40,49,50, +41,46,115,112,108,105,116,40,34,58,34,41,59,103,46,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40, +103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,46,115,101,116,70, +111,110,116,40,34,54,120,56,34,44,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,105,100,91,48,93,44, +175,46,120,43,50,44,175,46,121,43,52,44,180,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,105,100,91,49, +93,44,175,46,120,43,50,44,175,46,121,43,49,52,44,180,41,59,125,87,73,68,71,69,84,83,91,34,119,105,100,105, +100,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,54,44,100,114,97,119,58,100,114,97, +119,125,59,125,41,40,41,59,138,0,0,0,119,105,100,105,100,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,105,100,34,44,34,110,97,109,101,34,58,34,66,108, +117,101,116,111,111,116,104,32,73,68,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101, +116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,51,34,44,34,116,97,103,115,34,58,34,119,105,100,103, +101,116,44,97,100,100,114,101,115,115,44,109,97,99,34,44,34,102,105,108,101,115,34,58,34,119,105,100,105,100,46,105, +110,102,111,44,119,105,100,105,100,46,119,105,100,46,106,115,34,125,255,255,169,0,0,0,119,101,108,99,111,109,101,46, +98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,173,115,61,114,101,113,117, +105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101, +46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101,108,99,111,109,101,100,41,123,115,101,116,84, +105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114, +105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,180,125,41, +108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,125,41,125,125,41,40,41,255,255,255, +94,23,0,0,119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100,41,123,172,99,61,103,46,103,101,116,67,111, +108,111,114,40,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,163,40,115,101,113,46,108, +101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104,105,102,116,40,41,59,103,46,115,101,116,67,111,108,111,114, +40,99,41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125, +44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108,44,99,97,108,108,98,97,99,107,41,123,172, +110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67,111,108,111,114,40,99,111,108,41,59,167,40, +172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114,97,119,76,105,110,101,40,105,44,48,44,48, +44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50,52,48,44,105,41,59,103,46,102,108,105,112, +40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101,111,117,116,40,102,44,48,41,59,164,99,97, +108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69,78,69,95,67,79,85,78,84,61,49,48,59, +10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41,171,170,40,41,123,103,46,114,101,115,101,116, +40,41,46,115,101,116,66,103,67,111,108,111,114,40,48,41,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,49, +55,54,44,49,55,54,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,59,172,110,61,48,59,172, +108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111,40,41,59,172,105,109,61,103,46,105,109,97,103,101,77,101, +116,114,105,99,115,40,108,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46, +49,59,103,46,115,101,116,67,111,108,111,114,40,110,44,110,44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40, +108,44,40,49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,44,40,49,55,54,45,105,109,46,104,101,105,103,104, +116,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,115,101, +116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,79,112,101,110,34,44, +52,52,44,49,48,52,41,44,53,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108,101,34,44,52,52,44,49,49,54,41,44,49,48,48,48,41, +59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,109,97, +114,116,32,87,97,116,99,104,34,44,52,52,44,49,50,56,41,44,49,53,48,48,41,59,125,125,44,53,48,41,59,125, +59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103,61,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104, +114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,112,116,82,52,110,47,106,47, +52,103,72,43,56,72,53,119,108,43,106,79,117,107,86,86,111,72,90,56,100,116,47,110,47,47,110,51,55,79,116,103, +72,57,115,72,104,119,72,112,52,72,53,120,109,107,71,105,72,55,50,77,82,106,101,47,76,76,47,55,105,73,65,69, +69,55,115,80,69,103,111,65,67,43,65,108,97,103,73,108,73,105,77,81,69,114,80,120,68,119,85,89,120,65,65,66, +119,73,72,67,106,56,78,55,110,79,108,51,117,69,113,97,54,66,69,103,103,110,70,106,102,77,53,110,67,107,85,105, +108,51,103,69,113,53,75,68,65,65,81,109,67,54,81,109,66,69,52,74,120,83,69,104,73,65,66,105,81,109,66,56, +81,109,83,88,111,81,108,67,89,82,77,100,69,119,73,108,67,65,65,73,108,78,104,89,108,79,105,79,56,53,110,78, +69,121,77,80,69,111,90,119,73,65,65,99,115,89,73,89,109,80,88,111,89,108,77,105,75,97,70,69,120,88,47,117, +57,86,69,113,76,66,66,79,89,114,67,72,43,99,122,109,116,86,113,74,121,68,69,112,105,97,67,79,89,115,103,83, +89,115,122,109,99,51,113,116,84,69,113,77,82,55,104,122,71,56,65,108,71,109,100,49,79,81,103,108,79,79,89,54, +97,69,103,89,108,67,109,109,90,111,74,77,67,84,66,114,110,68,54,83,97,73,69,111,85,47,122,79,85,117,111,108, +83,106,98,110,66,74,103,113,97,67,69,111,85,53,122,79,88,88,52,82,121,81,89,66,66,122,67,83,52,88,53,122, +78,68,113,113,90,67,74,105,69,82,74,103,53,122,66,69,111,86,74,69,111,77,49,74,103,89,108,81,106,104,77,72, +99,52,74,76,69,109,90,77,69,69,112,54,90,73,74,103,80,122,83,52,87,84,109,90,77,86,84,73,76,109,70,89, +65,75,43,66,109,103,108,67,109,100,49,74,103,85,89,74,105,80,78,69,111,114,65,66,69,73,79,90,121,103,68,66, +109,53,77,67,105,74,77,81,108,104,77,72,56,66,121,66,88,119,73,108,66,74,103,85,120,74,105,77,100,53,110,79, +84,73,122,108,66,84,65,75,43,66,65,65,78,86,113,52,106,80,65,65,83,47,72,74,103,74,121,67,84,65,84,65, +69,65,67,67,47,66,52,83,47,73,74,103,73,108,67,89,65,103,65,80,105,83,47,75,110,53,121,69,89,65,78,84, +69,121,80,99,53,110,105,79,81,120,77,66,47,76,108,67,79,97,112,121,74,74,103,98,112,66,89,65,90,122,82,79, +81,75,47,71,108,48,65,84,73,87,102,69,111,90,122,66,99,54,73,108,66,54,83,89,71,103,66,74,66,74,103,112, +122,83,108,104,121,72,56,69,65,104,53,77,66,84,73,106,110,67,117,73,108,79,106,106,108,72,84,65,74,122,67,47, +76,109,68,84,83,83,89,73,69,111,84,65,66,79,89,73,108,69,84,83,75,89,72,88,119,73,65,66,79,89,77,48, +121,89,109,69,84,83,67,89,72,69,111,98,110,68,79,89,113,97,66,69,120,117,56,84,65,119,108,69,99,52,85,53, +69,111,105,97,67,109,75,43,78,84,65,111,108,70,69,119,88,48,84,81,122,66,77,88,119,88,105,69,112,84,66,67, +65,65,111,109,78,69,111,83,43,69,69,111,52,109,73,89,73,73,109,75,69,111,83,43,69,69,112,68,111,66,69,121, +85,98,69,111,51,103,69,111,52,109,74,100,65,73,109,73,74,89,52,108,74,69,121,99,100,69,111,80,79,79,66,89, +109,80,117,73,108,69,43,72,99,74,89,104,75,75,84,90,49,102,104,89,107,66,50,69,65,104,110,78,99,89,77,117, +69,104,111,109,77,114,56,65,51,89,65,66,69,111,74,121,66,53,103,106,79,65,65,89,109,72,109,57,86,103,69,76, +69,111,74,77,66,69,111,88,65,69,121,88,122,69,52,53,89,66,74,103,88,119,69,113,120,49,73,43,66,121,68,79, +89,74,121,86,74,119,53,121,67,103,69,66,51,99,81,71,103,74,77,87,74,119,81,110,67,117,54,47,67,103,70,66, +105,103,68,66,49,51,83,47,103,108,86,65,65,102,49,113,111,109,67,103,108,69,111,65,68,66,49,81,68,66,65,68, +69,80,69,111,78,86,113,69,65,111,108,69,103,69,75,111,108,75,69,114,74,77,68,89,65,74,77,68,48,108,69,48, +65,109,97,69,111,78,97,65,103,74,77,67,70,73,89,65,97,104,86,47,73,103,73,105,68,79,84,103,65,66,78,89, +74,77,69,79,84,111,105,67,73,111,74,77,67,79,84,122,102,67,78,52,82,77,66,79,84,120,115,68,74,73,82,121, +102,73,119,90,77,66,75,81,90,122,102,74,103,82,121,102,79,89,90,77,66,79,85,66,122,67,74,103,78,75,79,84, +53,122,68,74,103,76,111,67,65,68,120,75,66,79,65,73,65,66,79,84,54,97,67,65,65,82,121,102,79,89,82,121, +106,79,89,82,121,106,79,89,108,75,69,115,66,122,69,69,115,66,122,69,79,85,74,122,68,79,85,73,65,66,79,85, +105,97,68,79,85,82,122,67,79,85,90,122,67,69,115,99,75,67,105,89,34,41,41,59,172,105,109,61,103,46,105,109, +97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66, +103,67,111,108,111,114,40,34,35,102,102,48,48,102,102,34,41,59,172,121,61,49,55,54,44,115,112,101,101,100,61,53, +59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97,99,107,41,123,121,151,115,112,101,101,100,59,172,120,61,40, +49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44, +120,44,121,41,59,103,46,99,108,101,97,114,82,101,99,116,40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56, +49,43,115,112,101,101,100,41,59,163,40,121,62,51,48,41,115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111, +111,110,44,48,44,99,97,108,108,98,97,99,107,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101, +40,34,35,102,102,48,48,102,102,34,44,170,40,41,123,98,97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116, +67,111,108,111,114,40,45,49,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,46,115,101,116,70, +111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99, +111,109,101,46,34,44,56,56,44,49,51,48,41,59,125,41,59,125,41,59,115,101,116,84,105,109,101,111,117,116,40,170, +40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,52,59,103, +46,115,99,114,111,108,108,40,48,44,45,52,41,59,163,40,110,62,49,53,48,41,99,108,101,97,114,73,110,116,101,114, +118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51,53,48,48,41,59,125,59,163,40,110,138,50,41,171,170,40, +41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,48, +48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110, +116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61, +55,48,44,121,61,50,53,44,104,61,50,53,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83, +116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114, +105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119, +83,116,114,105,110,103,40,34,104,97,115,32,111,110,101,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,98,117,116,116,111,110,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,115,101, +116,70,111,110,116,40,34,49,50,120,50,48,58,50,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, +48,44,49,41,46,100,114,97,119,83,116,114,105,110,103,40,34,72,69,82,69,33,34,44,49,53,48,44,56,56,41,59, +125,93,44,50,48,48,41,59,125,59,163,40,110,138,51,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103, +46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,102,102,34,41,46,115,101,116,67,111,108,111,114,40, +48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115, +101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80, +114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59, +103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,84,111,32,119,97,107,101,32,116,104,101,92,110,115,99,114,101,101,110,32,117,112,44,32,111,114,32,116,111,92,110, +115,101,108,101,99,116,34,44,56,56,44,54,48,41,59,125,59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101, +115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,102,102,34,41,46,115,101, +116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110, +40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,59,103,46,100,114,97,119,83,116, +114,105,110,103,40,34,76,111,110,103,32,80,114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116, 65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,119,97,107,101,32,116,104,101,92,110,115,99,114,101,101,110, -32,117,112,44,32,111,114,32,116,111,92,110,115,101,108,101,99,116,34,44,56,56,44,54,48,41,59,125,59,163,40,110, -138,52,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34, -35,48,48,102,102,102,102,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46, -115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58, -50,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,76,111,110,103,32,80,114,101,115,115,34,44,56,56, -44,52,48,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101,116,70,111,110, -116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,103,111,32,98, -97,99,107,32,116,111,92,110,116,104,101,32,99,108,111,99,107,34,44,56,56,44,54,48,41,59,125,59,163,40,110,138, -53,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35, -102,102,48,48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115, -101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34, -41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,32,101,118,101, -114,92,110,115,116,111,112,115,44,32,104,111,108,100,32,116,104,101,92,110,98,117,116,116,111,110,32,102,111,114,92,110, -116,101,110,32,115,101,99,111,110,100,115,46,92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92,110, -116,104,101,110,32,114,101,98,111,111,116,46,34,44,56,56,44,55,56,41,59,125,59,163,40,110,138,54,41,171,170,40, -41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,48,48,102, -102,34,41,46,115,101,116,67,111,108,111,114,40,45,49,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111, -110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120, -61,56,56,44,121,61,45,50,48,44,104,61,54,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32,104,97,115,32,97,92,110,102,117,108,108,32, -116,111,117,99,104,115,99,114,101,101,110,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,68,114,97,103,32,117,112,32,97,110,100,32,100,111,119,110,92,110,116,111, -32,115,99,114,111,108,108,32,97,110,100,92,110,116,97,112,32,116,111,32,115,101,108,101,99,116,34,44,120,44,121,150, -104,41,59,125,44,93,44,51,48,48,41,59,125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116, -40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,48,48,34,41,46,115,101,116,67,111, -108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34, -41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61,45,51,53,44, -104,61,56,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -66,97,110,103,108,101,46,106,115,32,99,111,109,101,115,92,110,119,105,116,104,32,97,32,102,101,119,92,110,97,112,112, -115,32,105,110,115,116,97,108,108,101,100,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,92,110, -98,97,110,103,108,101,106,115,46,99,111,109,47,97,112,112,115,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48, -48,41,59,125,59,163,40,110,138,56,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66, -103,67,111,108,111,114,40,34,35,102,102,48,48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108, -101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116, -65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89, -111,117,32,99,97,110,32,97,108,115,111,32,109,97,107,101,92,110,121,111,117,114,32,111,119,110,32,97,112,112,115,33, -34,44,120,44,51,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,92, -110,98,97,110,103,108,101,106,115,46,99,111,109,34,44,120,44,49,51,48,41,59,172,114,120,61,48,44,114,121,61,48, -59,170,100,114,97,119,40,41,123,114,120,150,48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77,97,116, -104,46,99,111,115,40,114,120,41,44,114,115,120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121,61,77, -97,116,104,46,99,111,115,40,114,121,41,44,114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170,112,40, -120,44,121,44,122,41,123,172,116,59,116,61,120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99,121,45, -120,42,114,115,121,59,120,61,116,59,116,61,121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99,120,45, -121,42,114,115,120,59,121,61,116,59,122,150,52,59,171,91,56,56,43,54,48,42,120,47,122,44,55,56,43,54,48,42, -121,47,122,93,59,125,172,97,59,172,115,61,51,48,59,103,46,99,108,101,97,114,82,101,99,116,40,56,56,45,115,44, -55,56,45,115,44,56,56,43,115,44,55,56,43,115,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46, -109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,103, -46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,103, -46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59, -103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49, -41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44, -49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44, -49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49, -41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49, -41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44, -49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49, -44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44, -45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44, -45,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49, -44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49, -44,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49, -44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49, -44,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45, -49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,125,115,101,116,73, -110,116,101,114,118,97,108,40,100,114,97,119,44,53,48,41,59,125,59,163,40,110,138,57,41,171,170,40,41,123,103,46, -114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,102,102,34,41,59, -103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46, -115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,172,120,61,56,56,44,121,61,49,48,44,104,61,50,49, -59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39, -115,32,105,116,33,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -80,114,101,115,115,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,104, -101,32,98,117,116,116,111,110,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116, -111,32,115,116,97,114,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97, -110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172,115,99,101,110, -101,78,117,109,98,101,114,61,48,59,10,170,109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62,48,158,115,99, -101,110,101,78,117,109,98,101,114,43,49,138,83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99,101,110,101,78, -117,109,98,101,114,61,40,115,99,101,110,101,78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78,69,95,67,79, -85,78,84,59,163,40,115,99,101,110,101,78,117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109,98,101,114,61, -48,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115,99,101,110,101, -78,117,109,98,101,114,41,40,41,59,163,40,115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172,108,61,83,67, -69,78,69,95,67,79,85,78,84,59,167,40,172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172,120,61,56,56, -43,40,105,45,40,108,45,50,41,47,50,41,42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45, -49,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,102,105,108,108,67,105,114,99,108,101,40,120,44,49, -54,54,44,52,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,48,41,46,102,105,108,108,67,105,114,99,108, -101,40,120,44,49,54,54,44,52,41,59,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,100,114,97,119,67,105, -114,99,108,101,40,120,44,49,54,54,44,52,41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114,60,83, -67,69,78,69,95,67,79,85,78,84,45,49,41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111,118,101, -40,49,41,59,125,44,53,48,48,48,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44, -100,105,114,162,109,111,118,101,40,100,105,114,41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,123,163,40,115, -99,101,110,101,78,117,109,98,101,114,138,83,67,69,78,69,95,67,79,85,78,84,45,49,41,108,111,97,100,40,41,59, -164,109,111,118,101,40,49,41,59,125,44,66,84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59,10,66,97,110, -103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116, -76,111,99,107,101,100,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41, -59,10,109,111,118,101,40,48,41,59,255,255,234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115, -46,106,115,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114, -101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99, -111,109,101,46,106,115,111,110,39,44,49,41,160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46, -114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123,125,69,46,115, -104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109,101,32,65,112, -112,39,125,44,39,82,117,110,32,110,101,120,116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33,115,101,116,116, -105,110,103,115,46,119,101,108,99,111,109,101,100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101,115,39,58,39, -78,111,39,44,111,110,99,104,97,110,103,101,58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39, -41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100, -58,33,118,125,41,44,125,44,39,82,117,110,32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119,101,108,99,111, -109,101,46,97,112,112,46,106,115,39,41,44,39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32,110,101,120,116, -39,58,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39, -119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59,66,97,110,103, -108,101,46,115,101,116,76,111,99,107,101,100,40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102, -40,41,41,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40, -41,59,125,44,39,60,32,66,97,99,107,39,58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0,119,101,108,99, -111,109,101,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254, +46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,103,111,32,98,97,99,107,32,116,111,92,110,116,104,101,32, +99,108,111,99,107,34,44,56,56,44,54,48,41,59,125,59,163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115, +101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48,48,48,48,34,41,46,115,101,116, +67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40, +48,44,48,41,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,32,101,118,101,114,92,110,115,116,111,112,115,44,32,104,111, +108,100,32,116,104,101,92,110,98,117,116,116,111,110,32,102,111,114,92,110,116,101,110,32,115,101,99,111,110,100,115,46, +92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92,110,116,104,101,110,32,114,101,98,111,111,116,46, +34,44,56,56,44,55,56,41,59,125,59,163,40,110,138,54,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59, +103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,48,48,102,102,34,41,46,115,101,116,67,111,108,111,114, +40,45,49,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61,45,50,48,44,104,61, +54,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97, +110,103,108,101,46,106,115,32,104,97,115,32,97,92,110,102,117,108,108,32,116,111,117,99,104,115,99,114,101,101,110,34, +44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, +68,114,97,103,32,117,112,32,97,110,100,32,100,111,119,110,92,110,116,111,32,115,99,114,111,108,108,32,97,110,100,92, +110,116,97,112,32,116,111,32,115,101,108,101,99,116,34,44,120,44,121,150,104,41,59,125,44,93,44,51,48,48,41,59, +125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111, +108,111,114,40,34,35,48,48,102,102,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114, +40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105, +103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61,45,51,53,44,104,61,56,48,59,97,110,105,109,97,116,101, +40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32,99,111, +109,101,115,92,110,119,105,116,104,32,97,32,102,101,119,92,110,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34, +44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, +84,111,32,97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,92,110,98,97,110,103,108,101,106,115,46,99,111,109, +47,97,112,112,115,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48,48,41,59,125,59,163,40,110,138,56,41,171, +170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48, +48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70, +111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172, +120,61,56,56,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,32,99,97,110,32,97,108,115,111,32, +109,97,107,101,92,110,121,111,117,114,32,111,119,110,32,97,112,112,115,33,34,44,120,44,51,48,41,59,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,92,110,98,97,110,103,108,101,106,115,46,99,111, +109,34,44,120,44,49,51,48,41,59,172,114,120,61,48,44,114,121,61,48,59,170,100,114,97,119,40,41,123,114,120,150, +48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77,97,116,104,46,99,111,115,40,114,120,41,44,114,115, +120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121,61,77,97,116,104,46,99,111,115,40,114,121,41,44, +114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170,112,40,120,44,121,44,122,41,123,172,116,59,116,61, +120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99,121,45,120,42,114,115,121,59,120,61,116,59,116,61, +121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99,120,45,121,42,114,115,120,59,121,61,116,59,122,150, +52,59,171,91,56,56,43,54,48,42,120,47,122,44,55,56,43,54,48,42,121,47,122,93,59,125,172,97,59,172,115,61, +51,48,59,103,46,99,108,101,97,114,82,101,99,116,40,56,56,45,115,44,55,56,45,115,44,56,56,43,115,44,55,56, +43,115,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44, +97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93, +44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93, +44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48, +93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97, +91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,109,111,118,101,84,111,40, +97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40, +97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97, +91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97, +91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40, +97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84, +111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,108,105,110,101, +84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,103,46,109,111,118, +101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,103,46,108,105,110, +101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,103,46,109,111,118, +101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,103,46,108,105,110,101, +84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,103,46,109,111,118, +101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,103,46,108,105,110, +101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,125,115,101,116,73,110,116,101,114,118,97,108,40,100,114,97,119, +44,53,48,41,59,125,59,163,40,110,138,57,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101, +116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120, +50,48,34,41,59,172,120,61,56,56,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41, +162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39,115,32,105,116,33,34,44,120,44,121,150,104, +41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,120,44,121,150,104, +42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,104,101,32,98,117,116,116,111,110,34,44,120,44, +121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,115,116,97,114,116,34,44,120,44,121, +150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121, +150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172,115,99,101,110,101,78,117,109,98,101,114,61,48,59,10,170, +109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62,48,158,115,99,101,110,101,78,117,109,98,101,114,43,49,138, +83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99,101,110,101,78,117,109,98,101,114,61,40,115,99,101,110,101, +78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78,69,95,67,79,85,78,84,59,163,40,115,99,101,110,101,78, +117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109,98,101,114,61,48,59,99,108,101,97,114,73,110,116,101,114, +118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115,99,101,110,101,78,117,109,98,101,114,41,40,41,59,163,40, +115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172,108,61,83,67,69,78,69,95,67,79,85,78,84,59,167,40, +172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172,120,61,56,56,43,40,105,45,40,108,45,50,41,47,50,41, +42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45,49,41,123,103,46,115,101,116,67,111,108,111, +114,40,45,49,41,46,102,105,108,108,67,105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,125,164,123,103,46,115, +101,116,67,111,108,111,114,40,48,41,46,102,105,108,108,67,105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,103, +46,115,101,116,67,111,108,111,114,40,45,49,41,46,100,114,97,119,67,105,114,99,108,101,40,120,44,49,54,54,44,52, +41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114,60,83,67,69,78,69,95,67,79,85,78,84,45,49, +41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111,118,101,40,49,41,59,125,44,53,48,48,48,41,59, +125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,109,111,118,101,40,100,105,114, +41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,123,163,40,115,99,101,110,101,78,117,109,98,101,114,138,83, +67,69,78,69,95,67,79,85,78,84,45,49,41,108,111,97,100,40,41,59,164,109,111,118,101,40,49,41,59,125,44,66, +84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105, +109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,48,41,59,10,66, +97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,10,109,111,118,101,40,48,41,59,255,255, +234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0, +40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41, +160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101, +116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123,125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58, +123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109,101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120, +116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33,115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101, +100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101,115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101, +58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108, +99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110, +32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44, +39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32,110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114, +101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110, +39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100, +40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111, +102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39, +58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0,119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204, -204,204,204,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150,150,186,186,186, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,206, -214,215,214,206,205,204,204,204,204,204,204,192,150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204,186,150,186,186, -186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,206,215,214, -205,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,97,91,91,127,204,205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204,206,215,206,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,97,97,134,171,172,135,204,204,213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204,214,206,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,254,97,97,135,215,171,97,91,91,204,204,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150, -186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204,213,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,97,97,172,215,134,97,97,91,91,168,204,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186, -186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204,204,205,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,97,134,215,135,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168,204,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,97,134,215,134,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91,204,204,204,204, -204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254, -254,254,97,134,171,97,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186, -186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91,91,168,204,204, -204,204,204,204,204,204,204,204,204,204,192,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,97,134,134,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186, -186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,204, -204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186,186,186,186,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91, -91,127,204,204,204,204,254,254,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,97,97,97,97,97,97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97,97,97,97,91, -254,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91, -91,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,129, -136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254, +254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -136,136,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254,254,254,254,254, +254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150,150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192, +150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204, +198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204, +205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204,206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204, +213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204,214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204, +214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204,213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204, +206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204,204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198, +150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91, +127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150, +150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91, +91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186, +186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97, +91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186, +186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97, +97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97,97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97, +97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254, +254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254, +254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,225,0,0,0, -119,101,108,99,111,109,101,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100, -34,58,34,119,101,108,99,111,109,101,34,44,34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34,44,34,115,114, -99,34,58,34,119,101,108,99,111,109,101,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,119,101,108,99, -111,109,101,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34, -58,34,115,116,97,114,116,44,119,101,108,99,111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101,108,99,111,109, -101,46,105,110,102,111,44,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111,109,101,46,97, -112,112,46,106,115,44,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101,108,99,111,109, -101,46,105,109,103,34,44,34,100,97,116,97,34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34,125,255,255,255, -20,16,0,0,104,101,97,108,116,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -10,170,103,101,116,83,101,116,116,105,110,103,115,40,41,123,171,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103, -101,34,41,46,114,101,97,100,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,49,41,160,123,125, -59,125,10,170,115,101,116,83,101,116,116,105,110,103,115,40,115,41,123,114,101,113,117,105,114,101,40,34,83,116,111,114, -97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,115,41, -59,125,10,170,109,101,110,117,77,97,105,110,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99, -108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116, -108,101,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34,58,40, -41,162,108,111,97,100,40,41,44,34,83,116,101,112,32,67,111,117,110,116,105,110,103,34,58,40,41,162,109,101,110,117, -83,116,101,112,67,111,117,110,116,40,41,44,34,77,111,118,101,109,101,110,116,34,58,40,41,162,109,101,110,117,77,111, -118,101,109,101,110,116,40,41,44,34,72,101,97,114,116,32,82,97,116,101,34,58,40,41,162,109,101,110,117,72,82,77, -40,41,44,34,83,101,116,116,105,110,103,115,34,58,40,41,162,109,101,110,117,83,101,116,116,105,110,103,115,40,41,125, -41,59,125,10,170,109,101,110,117,83,101,116,116,105,110,103,115,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101, -100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,172,115,61,103,101,116,83,101,116,116,105,110,103,115, -40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108,116,104, -32,84,114,97,99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110, -40,41,44,34,72,101,97,114,116,32,82,116,34,58,123,118,97,108,117,101,58,48,124,115,46,104,114,109,44,109,105,110, -58,48,44,109,97,120,58,51,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,51,32,109,105,110,115, -34,44,34,49,48,32,109,105,110,115,34,44,34,65,108,119,97,121,115,34,93,91,118,93,44,111,110,99,104,97,110,103, -101,58,118,162,123,115,46,104,114,109,61,118,59,115,101,116,83,101,116,116,105,110,103,115,40,115,41,59,125,125,125,41, -59,125,10,170,109,101,110,117,83,116,101,112,67,111,117,110,116,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101, -100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34, -58,123,116,105,116,108,101,58,34,83,116,101,112,32,67,111,117,110,116,105,110,103,34,125,44,34,60,32,66,97,99,107, -34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162,115,116, -101,112,115,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,115,116,101,112,115,80, -101,114,68,97,121,40,41,125,41,59,125,10,170,109,101,110,117,77,111,118,101,109,101,110,116,40,41,123,115,119,105,112, -101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119, -77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,77,111,118,101,109,101,110,116,34,125,44,34,60,32,66, -97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41, -162,109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162, -109,111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,109,101,110,117,72,82,77,40,41, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44, +34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34,44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46, +97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101, +114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99, +111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101,108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111, +109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111,109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109, +101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101,108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97, +34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34,125,255,255,255,119,56,0,0,115,101,116,116,105,110,103,46, +97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67, +97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100, +111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101, +40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41, +42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44, +40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97, +116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112, +111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118, +105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101, +40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112, +117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101, +107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138, +50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41, +41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118, +105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41, +46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41, +44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116, +101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116, +104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109, +111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59, +172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49, +59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110, +116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98, +114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50, +41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115, +46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58, +109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40, +41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69, +74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116, +111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105, +110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119, +114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10, +170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50,41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84, +78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160, +111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123,111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125, +125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50, +160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119, +97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101, +79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108, +101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125,10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41, +123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101,114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49, +57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98, +108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108,111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109, +101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58,180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50, +63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110,101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58, +182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114,115,116,68,97,121,79,102,87,101,101,107,58,48,44,98,114, +105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111,110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180, +44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97,107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79, +110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110,84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119, +105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115,104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116, +77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84,105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117, +112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97, +103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163, +40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111, +108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34,58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105, +110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, +83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65, +112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83, +121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101, +116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39, +58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162, +115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110, +109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109, +101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97, +99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41, +162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67, +68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39,58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101, +110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111,99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107, +77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84,105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84, +105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41, +59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116, +101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101,112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70, +111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61, +118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101, +101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101, +113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114, +101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59,125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34, +118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79,102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98, +114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46, +109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101, +112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58,98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102, +111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, +116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86,91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111, +103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84, +105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118, +138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101, +113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114, +101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, +59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115, +39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66, +101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101,109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118, +97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111, +108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105, +98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101, +116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66, +82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82, +65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41,59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101, +34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116, +58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109,115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51, +93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51, +59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40, +41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73,68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113, +109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59,125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117, +40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100, +86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34,107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93, +59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75,98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98, +114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115,101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69, +46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116, +104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39, +77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101,39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116, +97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101, +44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123, +115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101,116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116, +101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118, +97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111, +108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108, +101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101, +116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68,39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97, +120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41, +41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116, +58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, +72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44, +39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112, +97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111, +110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101, +121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105, +110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115, +116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34,41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101, +58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117, +41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171, +103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101,116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116, +104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101,116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59, +117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115, +101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115,101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101, +116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46,102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116, +104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61,170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116, +40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41, +44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59,125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110, +103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,109,46,100,114,97,119,40,41,59,125,172,116,104,101, +109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66, +97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66, +87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40, +34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34,35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35, +48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102,102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48, +102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39,76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112, +100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41,44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102, +103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103,50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72, +58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58,99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58, +181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47, +94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111,114,69,97,99,104,40,110,162,123,173,110,101,119,84,104,101, +109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,110, +41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119,84,104,101,109,101,46,110,97,109,101,63,110,101,119,84,104, +101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,110,101,119,84,104, +101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,41,44,102,103,50,58,99, +108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44,98,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46, +98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,72,41,44,98,103,72,58,99,108, +40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100,97,114,107,58,110,101,119,84,104,101,109,101,46,100,97,114, +107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77,101,110,117,91,39,67,117,115,116,111,109,105,122,101,39,93, +61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,59,172,109,61,69,46,115, +104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101,110,117,41,59,170,115,104,111,119,67,117,115,116,111,109,84, +104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84,40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109, +101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98,103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40, +118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117,112,100,40,116,104,41,59,125,173,114,103,98,61,123,125,59, +114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48,48,48,34,59,114,103,98,91,39,119,104,105,116,101,39,93, +61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100,39,93,61,34,35,102,48,48,34,59,114,103,98,91,39,103, +114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103,98,91,39,98,108,117,101,39,93,61,34,35,48,48,102,34, +59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48,102,102,34,59,114,103,98,91,39,109,97,103,101,110,116,97, +39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121,101,108,108,111,119,39,93,61,34,35,102,102,48,34,59,163, +40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98,91,39,111,114,97,110,103,101,39,93,61,34,35,102,102,55, +102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101,39,93,61,34,35,55,102,48,48,102,102,34,59,114,103,98, +91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55,102,34,59,125,173,99,111,108,111,114,115,61,91,93,44,110, +97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98,41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59, +99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114,103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123, +39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111,109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99, +107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123, +102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44,98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44, +102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32,50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117, +110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108,105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105, +103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34,102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34, +98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34,93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110, +117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105,110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108, +101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111, +108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116,104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109, +97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99, +111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103,39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115, +101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101,46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46, +116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40,39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41, +59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125,41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93, +61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117, +40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101, +110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68, +105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117, +112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125, +59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97, +115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121, +61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105, +61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123,109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43, +49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105, +93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110,99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116, +116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112,108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115, +101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116, +101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117, +40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172, +109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44, +34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, +61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40, +41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105, +110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111,114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91, +100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61,170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116, +40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101, +116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115, +46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120,79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83, +101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108, +105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125,125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101, +118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32, +100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116,111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87, +104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40,170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108, +108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108, +105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110, +101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44, +170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101, +116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105, +116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115, +40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101, +99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69, +46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41, +123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39, +60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68, +32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105, +103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44,109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111, +110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118, +160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67, +68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41, +59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, +115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110, +99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117, +112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109, +101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32, +111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, +46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110, +99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101, +79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66, +84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71, +76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87, +97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97, +116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, +119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, +101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101, +32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110, +115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111, +110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, +101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, +66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99, +116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85, +112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, +110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110, +103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97, +99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99, +101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32, +84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119, +97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99, +104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, +110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84, +111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110, +32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, +119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110, +99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101, +79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, +84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32, +84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117,101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101, +116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109, +105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44,115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110, +103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101, +115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97,108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79, +112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101, +58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58, +45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101, +58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118, +160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32, +84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, +46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101, +112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111, +110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61,118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116, +105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117, +41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110, +117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107, +39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101, +39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,44,102,111,114,109,97, +116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41,43,118,44,109,105,110,58,45,49,49,44,109,97,120,58,49, +51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, +116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, +44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123,118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115, +91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97,116,58,118,162,118,63,34,49,50,104,34,58,34,50,52,104, +34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93, +61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,83,116,97,114,116,32,87,101, +101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121, +79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48,44,109,97,120,58,49,44,102,111,114,109,97,116,58,118,162, +114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,40,118,44,49,41,44,111, +110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87, +101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,44,125,125,59,10,171, +69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108,101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116, +105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116, +105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101, +110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111,39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40, +48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48,44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44, +102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34,44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69, +46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116, +105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, +67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97, +103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46,46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92, +110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108,101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101, +113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85, +116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119,114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40, +41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111, +111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101, +97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106,115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101, +116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125,44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114, +121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103, +32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32,99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92, +110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116,111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59, +66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115, +101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119, +101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59, +163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72, +82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111, +109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101, +114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101, +114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40, +49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66, +97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73, +110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49,48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125, +125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10,109,101,110,117,91,39,67,97,108,105,98,114,97,116,101,32, +66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,73,115,32,116, +104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121,32,99,104,97,114,103,101,100,63,34,44,123,116,105,116,108, +101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46,116,104,101,110,40,111,107,162,123,163,40,111,107,41,123,172, +115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115, +101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46,98,97,116,70,117,108,108,86,111,108,116,97,103,101,61,40, +97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110, +97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,41,47,52,59,114, +101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,115,101,116, +116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46,115,104,111,119,65,108,101,114,116,40,34,67,97,108,105,98, +114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46, +97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115,104,111,119,65,108,101,114,116,40,34,80,108,101,97,115,101, +32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106,115,32,102,111,114,32,51,32,104,111,117,114,115,32,97,110, +100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116, +105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,125,41,59,125,59,10,109,101,110,117,91,39,82,101,115,101, +116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82, +101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115,63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105, +110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115, +97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41,59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41, +59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115, +104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,59,10,109,101,110,117,91,34,84,117,114,110,32,79, +102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115, +117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32,116,105,109,101,114,115,32,119,111,110,39,116,32,102,105,114, +101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32,79,102,102,34,125,41,46,116,104,101,110,40,40,99,111,110, +102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105,114,109,101,100,41,123,69,46,115,104,111,119,77,101,115,115, +97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97,116,101,114,33,34,44,34,71,111,111,100,98,121,101,34,41, +59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59, +103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108,101,46,115,111,102,116,79,102,102,63,66,97,110,103,108,101, +46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,50,53,48,48,41,59, +125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,125,41,59,125,59,10,163,40,66,97,110,103,108, +101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123,109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101, +115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108, +108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104,105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97, +99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46, +115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101,114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108, +101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119, +85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125,10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110, +117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119, +97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123,125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67, +111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101,61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82, +70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99, +101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111,119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110, +83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101,63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101, +99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114,162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101, +140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101,61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46,115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101, +41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99, +107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65,112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111, +114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162, +123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158, +97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63,97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112, +112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44,98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98, +46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108,111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105, +116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111,99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40, +41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46, +102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46, +110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103,115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41, +160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108, +61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111,99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41, +162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116, +105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115,114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99, +107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123,99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108, +111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162,123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117, +40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41, +123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105,109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116, +108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101,39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123, +115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109,101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121, +115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97,121,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68, +97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43, +51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68,97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44, +39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,111,110,116,104,40,41,43,49,44,102,111, +114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,109,111,110, +116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43, +49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77,111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59, +125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41, +44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49,48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41, +123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118,41,59,125,125,44,39,72,111,117,114,39,58,123,118,97,108, +117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46, +118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59,100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108, +117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117, +116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54, +48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116,101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39, +83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100,46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110, +99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46, +115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108,117,101,41,59,125,125,125,59,10,171,69,46,115,104,111,119, +77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103, +115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, +65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77, +97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112,115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47, +92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47,41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116, +114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41,41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116, +111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105,100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97, +109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110,97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111, +114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41, +162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114, +100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59, +163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46, +108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110,117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101, +116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125,10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40, +97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112,46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65, +112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125,59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97, +112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10, +174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36, +123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109,115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32, +103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116,99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110, +103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112,101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116, +116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116, +105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83,101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112, +83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40, +96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41, +171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59, +125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141,34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111, +119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112, +112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117, +40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112, +46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69, +114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119, +77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0,115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0, +0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80, +0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0, +85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85,69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0, +0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85,234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170, +213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122, +170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170,169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0, +0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42, +170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234, +170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170,171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0, +0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170, +181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0,0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85, +94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85,85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0, +0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0,5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80, +0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0, +5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116, +105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116, +114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114,117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34, +116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98,114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112, +34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110,101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101, +44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49,50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114, +105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116,105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84, +78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101, +79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97,107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115, +101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105, +115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84,104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44, +34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48,44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58, +49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116,105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115,101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34, +83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34, +44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114, +34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,56,34,44,34,116,97,103,115,34,58,34,116,111, +111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111, +44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44,115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97, +116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111,110,34,125,255,210,14,0,0,104,101,97,108,116,104,46,97, +112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,170,109,101,110,117,77,97,105,110,40,41, 123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69, -46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,114,116,32,82,97,116,101, -34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104, -111,117,114,34,58,40,41,162,104,114,109,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40, -41,162,104,114,109,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,115,116,101,112,115,80,101,114,72,111,117,114, -40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172, -100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104, -101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104, -46,104,114,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46, +46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108,116,104,32,84,114,97, +99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,108,111,97,100,40,41,44,34,83,116,101,112, +32,67,111,117,110,116,105,110,103,34,58,40,41,162,109,101,110,117,83,116,101,112,67,111,117,110,116,40,41,44,34,77, +111,118,101,109,101,110,116,34,58,40,41,162,109,101,110,117,77,111,118,101,109,101,110,116,40,41,44,34,72,101,97,114, +116,32,82,97,116,101,34,58,40,41,162,109,101,110,117,72,82,77,40,41,44,34,83,101,116,116,105,110,103,115,34,58, +40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40, +34,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46,106,115,34,41,41,40,40,41,162,109,101,110,117,77,97, +105,110,40,41,41,125,41,59,125,10,170,109,101,110,117,83,116,101,112,67,111,117,110,116,40,41,123,115,119,105,112,101, +95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77, +101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,83,116,101,112,115,34,125,44,34,60,32,66,97,99,107,34, +58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162,115,116,101, +112,115,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,115,116,101,112,115,80,101, +114,68,97,121,40,41,125,41,59,125,10,170,109,101,110,117,77,111,118,101,109,101,110,116,40,41,123,115,119,105,112,101, +95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77, +101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,77,111,118,101,109,101,110,116,34,125,44,34,60,32,66,97, +99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162, +109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,109, +111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,109,101,110,117,72,82,77,40,41,123, +115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46, +115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,114,116,32,82,97,116,101,34, +125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111, +117,114,34,58,40,41,162,104,114,109,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41, +162,104,114,109,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,115,116,101,112,115,80,101,114,72,111,117,114,40, +41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100, +97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101, +97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46, +104,114,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100, +114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110, +40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44, +100,97,116,97,41,59,125,10,170,115,116,101,112,115,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115, +115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54, +65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100, +68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46, +100,97,121,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46, 100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111, -110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34, -44,100,97,116,97,41,59,125,10,170,115,116,101,112,115,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101, +110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65,89,34,44, +100,97,116,97,41,59,125,10,170,104,114,109,80,101,114,72,111,117,114,40,41,123,69,46,115,104,111,119,77,101,115,115, +97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65, +114,114,97,121,40,50,52,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,50,51,41,59,114,101, +113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44, +104,162,123,100,97,116,97,91,104,46,104,114,93,150,104,46,98,112,109,59,163,40,104,46,98,112,109,41,99,110,116,91, +104,46,104,114,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40,100,44,105,41,162,100,97,116, +97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101, +46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116, +111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97,116,97, +41,59,125,10,170,104,114,109,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34, +76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40, +51,49,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101, +40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68, +97,116,101,40,41,44,104,162,123,100,97,116,97,91,104,46,100,97,121,93,150,104,46,98,112,109,59,163,40,104,46,98, +112,109,41,99,110,116,91,104,46,100,97,121,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40, +100,44,105,41,162,100,97,116,97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49, +41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41, +59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,68,65, +89,34,44,100,97,116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,123,69,46, +115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61, +184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104, +34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,104,114,93,150, +104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114, +97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40, +109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97, +116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101, 115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49, 54,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97, 100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104, -46,100,97,121,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101, -46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116, -111,110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65,89,34, -44,100,97,116,97,41,59,125,10,170,104,114,109,80,101,114,72,111,117,114,40,41,123,69,46,115,104,111,119,77,101,115, -115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54, -65,114,114,97,121,40,50,52,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,50,51,41,59,114, -101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41, -44,104,162,123,100,97,116,97,91,104,46,104,114,93,150,104,46,98,112,109,59,163,40,104,46,98,112,109,41,99,110,116, -91,104,46,104,114,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40,100,44,105,41,162,100,97, -116,97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108, -101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116, -116,111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97,116, -97,41,59,125,10,170,104,114,109,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40, -34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121, -40,51,49,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114, -101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184, -68,97,116,101,40,41,44,104,162,123,100,97,116,97,91,104,46,100,97,121,93,150,104,46,98,112,109,59,163,40,104,46, -98,112,109,41,99,110,116,91,104,46,100,97,121,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40, -40,100,44,105,41,162,100,97,116,97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40, -49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40, -41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,68, -65,89,34,44,100,97,116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,123,69, -46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97, -61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116, -104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,104,114,93, -150,104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100, -114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110, -40,109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100, -97,116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77, -101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116, -49,54,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101, -97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91, -104,46,100,97,121,93,150,104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97, -110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116, -66,117,116,116,111,110,40,109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68, -65,89,34,44,100,97,116,97,41,59,125,10,174,119,61,103,46,103,101,116,87,105,100,116,104,40,41,59,10,174,104,61, -103,46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,100,97,116,97,95,108,101,110,59,10,172,99,104,97,114,116, -95,105,110,100,101,120,59,10,172,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,59,10,172,99,104,97,114,116, -95,108,97,98,101,108,59,10,172,99,104,97,114,116,95,100,97,116,97,59,10,172,115,119,105,112,101,95,101,110,97,98, -108,101,100,61,181,59,10,172,98,116,110,59,10,170,109,97,120,40,97,114,114,41,123,172,109,61,45,73,110,102,105,110, -105,116,121,59,167,40,172,105,61,48,59,105,60,97,114,114,46,108,101,110,103,116,104,59,105,152,41,163,40,97,114,114, -91,105,93,62,109,41,109,61,97,114,114,91,105,93,59,171,109,59,125,10,170,103,101,116,95,100,97,116,97,95,108,101, -110,103,116,104,40,97,114,114,41,123,172,110,108,101,110,61,97,114,114,46,108,101,110,103,116,104,59,167,40,172,105,61, -97,114,114,46,108,101,110,103,116,104,45,49,59,105,62,48,158,97,114,114,91,105,93,138,48,59,105,153,41,110,108,101, -110,153,59,171,110,108,101,110,59,125,10,170,98,97,114,67,104,97,114,116,40,108,97,98,101,108,44,100,116,41,123,100, -97,116,97,95,108,101,110,61,103,101,116,95,100,97,116,97,95,108,101,110,103,116,104,40,100,116,41,59,99,104,97,114, -116,95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40,100,97,116,97,95,108,101,110,45,53,44,45,53,41,59, -99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,61,109,97,120,40,100,116,41,59,99,104,97,114,116,95,108,97, -98,101,108,61,108,97,98,101,108,59,99,104,97,114,116,95,100,97,116,97,61,100,116,59,100,114,97,119,66,97,114,67, -104,97,114,116,40,41,59,115,119,105,112,101,95,101,110,97,98,108,101,100,61,180,59,125,10,170,100,114,97,119,66,97, -114,67,104,97,114,116,40,41,123,174,98,97,114,95,98,111,116,61,49,52,48,59,174,98,97,114,95,119,105,100,116,104, -61,40,119,45,50,41,47,57,59,172,98,97,114,95,116,111,112,59,172,98,97,114,59,103,46,115,101,116,67,111,108,111, -114,40,103,46,116,104,101,109,101,46,98,103,41,59,103,46,102,105,108,108,82,101,99,116,40,48,44,50,52,44,119,44, -104,41,59,167,40,98,97,114,61,49,59,98,97,114,60,49,48,59,98,97,114,152,41,123,163,40,98,97,114,138,53,41, -123,103,46,115,101,116,70,111,110,116,40,39,54,120,56,39,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105, -103,110,40,48,44,45,49,41,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103, +46,100,97,121,93,150,104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110, +103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66, +117,116,116,111,110,40,109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65, +89,34,44,100,97,116,97,41,59,125,10,174,119,61,103,46,103,101,116,87,105,100,116,104,40,41,59,10,174,104,61,103, +46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,100,97,116,97,95,108,101,110,59,10,172,99,104,97,114,116,95, +105,110,100,101,120,59,10,172,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,59,10,172,99,104,97,114,116,95, +108,97,98,101,108,59,10,172,99,104,97,114,116,95,100,97,116,97,59,10,172,115,119,105,112,101,95,101,110,97,98,108, +101,100,61,181,59,10,172,98,116,110,59,10,170,109,97,120,40,97,114,114,41,123,172,109,61,45,73,110,102,105,110,105, +116,121,59,167,40,172,105,61,48,59,105,60,97,114,114,46,108,101,110,103,116,104,59,105,152,41,163,40,97,114,114,91, +105,93,62,109,41,109,61,97,114,114,91,105,93,59,171,109,59,125,10,170,103,101,116,95,100,97,116,97,95,108,101,110, +103,116,104,40,97,114,114,41,123,172,110,108,101,110,61,97,114,114,46,108,101,110,103,116,104,59,167,40,172,105,61,97, +114,114,46,108,101,110,103,116,104,45,49,59,105,62,48,158,97,114,114,91,105,93,138,48,59,105,153,41,110,108,101,110, +153,59,171,110,108,101,110,59,125,10,170,98,97,114,67,104,97,114,116,40,108,97,98,101,108,44,100,116,41,123,100,97, +116,97,95,108,101,110,61,103,101,116,95,100,97,116,97,95,108,101,110,103,116,104,40,100,116,41,59,99,104,97,114,116, +95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40,100,97,116,97,95,108,101,110,45,53,44,45,53,41,59,99, +104,97,114,116,95,109,97,120,95,100,97,116,117,109,61,109,97,120,40,100,116,41,59,99,104,97,114,116,95,108,97,98, +101,108,61,108,97,98,101,108,59,99,104,97,114,116,95,100,97,116,97,61,100,116,59,100,114,97,119,66,97,114,67,104, +97,114,116,40,41,59,115,119,105,112,101,95,101,110,97,98,108,101,100,61,180,59,125,10,170,100,114,97,119,66,97,114, +67,104,97,114,116,40,41,123,174,98,97,114,95,98,111,116,61,49,52,48,59,174,98,97,114,95,119,105,100,116,104,61, +40,119,45,50,41,47,57,59,172,98,97,114,95,116,111,112,59,172,98,97,114,59,103,46,115,101,116,67,111,108,111,114, +40,103,46,116,104,101,109,101,46,98,103,41,59,103,46,102,105,108,108,82,101,99,116,40,48,44,50,52,44,119,44,104, +41,59,167,40,98,97,114,61,49,59,98,97,114,60,49,48,59,98,97,114,152,41,123,163,40,98,97,114,138,53,41,123, +103,46,115,101,116,70,111,110,116,40,39,54,120,56,39,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, +110,40,48,44,45,49,41,59,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103, 46,100,114,97,119,83,116,114,105,110,103,40,99,104,97,114,116,95,108,97,98,101,108,43,34,32,34,43,40,99,104,97, 114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,43,34,32,32,32,34,43,99,104,97,114,116,95,100,97,116,97, 91,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,93,44,103,46,103,101,116,87,105,100,116,104,40,41, 47,50,44,49,53,48,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,48,102,34,41,59,125,164,123,103,46, 115,101,116,67,111,108,111,114,40,34,35,48,102,102,34,41,59,125,163,40,40,99,104,97,114,116,95,105,110,100,101,120, 43,98,97,114,45,49,41,145,48,158,40,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,60,100,97, -116,97,95,108,101,110,41,98,97,114,95,116,111,112,61,98,97,114,95,98,111,116,45,49,48,48,42,40,99,104,97,114, -116,95,100,97,116,97,91,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,93,41,47,99,104,97,114,116, -95,109,97,120,95,100,97,116,117,109,59,164,98,97,114,95,116,111,112,61,98,97,114,95,98,111,116,59,103,46,102,105, -108,108,82,101,99,116,40,49,43,40,98,97,114,45,49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,98, -111,116,44,49,43,98,97,114,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,116,111,112,41,59,103,46,115,101, -116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103,46,100,114,97,119,82,101,99,116,40,49,43, -40,98,97,114,45,49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97,114,42, -98,97,114,95,119,105,100,116,104,44,98,97,114,95,116,111,112,41,59,125,125,10,170,110,101,120,116,95,98,97,114,40, -41,123,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116,104,46,109,105,110,40,100,97,116,97,95,108,101,110,45, -53,44,99,104,97,114,116,95,105,110,100,101,120,43,49,41,59,125,10,170,112,114,101,118,95,98,97,114,40,41,123,99, -104,97,114,116,95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40,40,99,104,97,114,116,95,108,97,98,101,108, -138,34,68,65,89,34,41,63,45,51,58,45,52,44,99,104,97,114,116,95,105,110,100,101,120,45,49,41,59,125,10,66, -97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,123,163,40,33,115,119,105,112,101,95,101, -110,97,98,108,101,100,41,171,59,163,40,100,105,114,138,49,41,112,114,101,118,95,98,97,114,40,41,59,164,110,101,120, -116,95,98,97,114,40,41,59,100,114,97,119,66,97,114,67,104,97,114,116,40,41,59,125,41,59,10,170,115,101,116,66, -117,116,116,111,110,40,102,110,41,123,66,97,110,103,108,101,46,115,101,116,85,73,40,34,117,112,100,111,119,110,34,44, -183,41,59,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,98,116,110, -61,115,101,116,87,97,116,99,104,40,102,110,44,66,84,78,50,41,59,164,98,116,110,61,115,101,116,87,97,116,99,104, -40,102,110,44,66,84,78,49,41,59,125,10,170,99,108,101,97,114,66,117,116,116,111,110,40,41,123,163,40,98,116,110, -141,183,41,123,99,108,101,97,114,87,97,116,99,104,40,98,116,110,41,59,98,116,110,61,183,59,125,125,10,66,97,110, -103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105, -100,103,101,116,115,40,41,59,10,109,101,110,117,77,97,105,110,40,41,59,76,2,0,0,104,101,97,108,116,104,46,105, -109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,224,249,255,255,59,255, +116,97,95,108,101,110,158,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,62,48,41,98,97,114,95,116,111,112, +61,98,97,114,95,98,111,116,45,49,48,48,42,40,99,104,97,114,116,95,100,97,116,97,91,99,104,97,114,116,95,105, +110,100,101,120,43,98,97,114,45,49,93,41,47,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,59,164,98,97, +114,95,116,111,112,61,98,97,114,95,98,111,116,59,103,46,102,105,108,108,82,101,99,116,40,49,43,40,98,97,114,45, +49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97,114,42,98,97,114,95,119, +105,100,116,104,44,98,97,114,95,116,111,112,41,59,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101, +46,102,103,41,59,103,46,100,114,97,119,82,101,99,116,40,49,43,40,98,97,114,45,49,41,42,98,97,114,95,119,105, +100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97,114,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95, +116,111,112,41,59,125,125,10,170,110,101,120,116,95,98,97,114,40,41,123,99,104,97,114,116,95,105,110,100,101,120,61, +77,97,116,104,46,109,105,110,40,100,97,116,97,95,108,101,110,45,53,44,99,104,97,114,116,95,105,110,100,101,120,43, +49,41,59,125,10,170,112,114,101,118,95,98,97,114,40,41,123,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116, +104,46,109,97,120,40,40,99,104,97,114,116,95,108,97,98,101,108,138,34,68,65,89,34,41,63,45,51,58,45,52,44, +99,104,97,114,116,95,105,110,100,101,120,45,49,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112, +101,39,44,100,105,114,162,123,163,40,33,115,119,105,112,101,95,101,110,97,98,108,101,100,41,171,59,163,40,100,105,114, +138,49,41,112,114,101,118,95,98,97,114,40,41,59,164,110,101,120,116,95,98,97,114,40,41,59,100,114,97,119,66,97, +114,67,104,97,114,116,40,41,59,125,41,59,10,170,115,101,116,66,117,116,116,111,110,40,102,110,41,123,66,97,110,103, +108,101,46,115,101,116,85,73,40,34,117,112,100,111,119,110,34,44,183,41,59,163,40,112,114,111,99,101,115,115,46,101, +110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,98,116,110,61,115,101,116,87,97,116,99,104,40,102,110,44,66, +84,78,50,41,59,164,98,116,110,61,115,101,116,87,97,116,99,104,40,102,110,44,66,84,78,49,41,59,125,10,170,99, +108,101,97,114,66,117,116,116,111,110,40,41,123,163,40,98,116,110,141,183,41,123,99,108,101,97,114,87,97,116,99,104, +40,98,116,110,41,59,98,116,110,61,183,59,125,125,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116, +115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,109,101,110,117,77, +97,105,110,40,41,59,255,255,76,2,0,0,104,101,97,108,116,104,46,105,109,103,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,48,48,194,0,255,255,224,249,255,255,59,255,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,80,0,0,5,85,64,0,0, -0,0,21,85,85,0,0,85,85,84,0,0,0,0,85,85,85,64,1,85,85,90,0,0,0,1,85,85,85,80,5,85, -85,106,128,0,0,5,85,85,85,84,21,85,85,234,160,0,0,21,85,85,85,85,85,85,87,170,180,0,0,21,85,85, -85,85,85,85,94,170,212,0,0,85,85,85,85,85,85,85,122,171,85,0,0,85,85,85,85,85,85,85,234,173,85,0, -0,85,85,122,213,85,85,87,170,181,85,0,0,85,85,106,181,85,85,94,170,213,85,0,0,85,85,106,173,85,85,122, -171,85,85,0,0,85,85,122,171,85,85,234,173,85,85,0,0,85,85,94,170,213,87,170,181,85,85,0,0,21,85,87, -170,181,94,170,213,85,84,0,0,21,85,85,234,173,122,171,85,85,84,0,0,5,85,85,122,171,234,173,85,85,80,0, -0,1,85,85,94,170,170,181,85,85,64,0,0,0,85,85,87,170,170,213,85,85,0,0,0,0,21,85,85,234,171,85, -85,84,0,0,0,0,5,85,85,122,173,85,85,80,0,0,0,0,1,85,85,94,181,85,85,64,0,0,0,0,0,85, -85,87,213,85,85,0,0,0,0,0,0,21,85,85,85,85,84,0,0,0,0,0,0,5,85,85,85,85,80,0,0,0, -0,0,0,1,85,85,85,85,64,0,0,0,0,0,0,0,85,85,85,85,0,0,0,0,0,0,0,0,21,85,85,84, -0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0, -0,85,85,0,0,0,0,0,0,0,0,0,0,21,84,0,0,0,0,0,0,0,0,0,0,5,80,0,0,0,0,0, -0,0,0,0,0,1,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,85,80,0,0,5,85,64,0,0,0,0,21,85,85,0,0,85,85,84,0,0, +0,0,85,85,85,64,1,85,85,90,0,0,0,1,85,85,85,80,5,85,85,106,128,0,0,5,85,85,85,84,21,85, +85,234,160,0,0,21,85,85,85,85,85,85,87,170,180,0,0,21,85,85,85,85,85,85,94,170,212,0,0,85,85,85, +85,85,85,85,122,171,85,0,0,85,85,85,85,85,85,85,234,173,85,0,0,85,85,122,213,85,85,87,170,181,85,0, +0,85,85,106,181,85,85,94,170,213,85,0,0,85,85,106,173,85,85,122,171,85,85,0,0,85,85,122,171,85,85,234, +173,85,85,0,0,85,85,94,170,213,87,170,181,85,85,0,0,21,85,87,170,181,94,170,213,85,84,0,0,21,85,85, +234,173,122,171,85,85,84,0,0,5,85,85,122,171,234,173,85,85,80,0,0,1,85,85,94,170,170,181,85,85,64,0, +0,0,85,85,87,170,170,213,85,85,0,0,0,0,21,85,85,234,171,85,85,84,0,0,0,0,5,85,85,122,173,85, +85,80,0,0,0,0,1,85,85,94,181,85,85,64,0,0,0,0,0,85,85,87,213,85,85,0,0,0,0,0,0,21, +85,85,85,85,84,0,0,0,0,0,0,5,85,85,85,85,80,0,0,0,0,0,0,1,85,85,85,85,64,0,0,0, +0,0,0,0,85,85,85,85,0,0,0,0,0,0,0,0,21,85,85,84,0,0,0,0,0,0,0,0,5,85,85,80, +0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,85,85,0,0,0,0,0,0,0,0,0, +0,21,84,0,0,0,0,0,0,0,0,0,0,5,80,0,0,0,0,0,0,0,0,0,0,1,64,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -17,6,0,0,104,101,97,108,116,104,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -40,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,97,61,48,124,40,114,101,113,117,105,114,101,40,34,83,116, -111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,49, -41,124,124,123,125,41,46,104,114,109,59,105,102,40,49,61,61,97,124,124,50,61,61,97,41,123,102,117,110,99,116,105, -111,110,32,102,40,41,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101,97, -108,116,104,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,66,97,110,103,108,101,46,115,101,116,72, -82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,44,54,69,52,42,97,41,59,105,102,40,49,61, -61,97,41,102,111,114,40,118,97,114,32,98,61,49,59,50,62,61,98,59,98,43,43,41,115,101,116,84,105,109,101,111, -117,116,40,40,41,61,62,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101, -97,108,116,104,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,123,66,97,110,103,108,101,46,115,101, -116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,125,44,50,69,53,42,98,43,54,69,52, -41,125,44,50,69,53,42,98,41,125,66,97,110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34,44,102,41,59, -66,97,110,103,108,101,46,111,110,40,34,72,82,77,34,44,98,61,62,123,56,48,60,98,46,99,111,110,102,105,100,101, -110,99,101,38,38,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116, -104,34,41,125,41,59,66,97,110,103,108,101,46,103,101,116,72,101,97,108,116,104,83,116,97,116,117,115,40,41,46,98, -112,109,67,111,110,102,105,100,101,110,99,101,124,124,102,40,41,125,101,108,115,101,32,66,97,110,103,108,101,46,115,101, -116,72,82,77,80,111,119,101,114,40,48,33,61,10,97,44,34,104,101,97,108,116,104,34,41,125,41,40,41,59,66,97, -110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34,44,97,61,62,123,102,117,110,99,116,105,111,110,32,102,40, -99,41,123,114,101,116,117,114,110,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,99,46, -115,116,101,112,115,62,62,56,44,99,46,115,116,101,112,115,38,50,53,53,44,99,46,98,112,109,44,77,97,116,104,46, -109,105,110,40,99,46,109,111,118,101,109,101,110,116,47,56,44,50,53,53,41,41,125,118,97,114,32,98,61,110,101,119, -32,68,97,116,101,40,68,97,116,101,46,110,111,119,40,41,45,53,57,69,52,41,44,101,61,102,117,110,99,116,105,111, -110,40,99,41,123,114,101,116,117,114,110,32,49,52,53,42,40,99,46,103,101,116,68,97,116,101,40,41,45,49,41,43, -54,42,99,46,103,101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,99,46,103,101,116,77,105,110,117,116,101,115, -40,41,47,54,48,41,125,40,98,41,59,98,61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,34, -104,101,97,108,116,104,45,34,43,99,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,99,46, -103,101,116,77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119,34,125,40,98,41,59,118,97,114,32,103,61,114, -101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,98,41,59,105,102,40,103,41,123, -118,97,114,32,100,61,103,46,115,117,98,115,116,114,40,56,43,52,42,101,44,52,41,59,105,102,40,34,92,117,48,48, -102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,100,41,123,112,114,105,110,116,40, -34,72,69,65,76,84,72,32,69,82,82,58,32,65,108,114,101,97,100,121,32,119,114,105,116,116,101,110,33,34,41,59, -114,101,116,117,114,110,125,125,101,108,115,101,32,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, -119,114,105,116,101,40,98,44,10,34,72,69,65,76,84,72,49,92,120,48,48,34,44,48,44,49,55,57,56,56,41,59, -118,97,114,32,104,61,56,43,52,42,101,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119, -114,105,116,101,40,98,44,102,40,97,41,44,104,44,49,55,57,56,56,41,59,105,102,40,49,52,51,61,61,101,37,49, -52,53,41,105,102,40,101,61,104,43,52,44,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92, -117,48,48,102,102,34,33,61,103,46,115,117,98,115,116,114,40,101,44,52,41,41,112,114,105,110,116,40,34,72,69,65, -76,84,72,32,69,82,82,58,32,68,97,105,108,121,32,115,117,109,109,97,114,121,32,97,108,114,101,97,100,121,32,119, -114,105,116,116,101,110,33,34,41,59,101,108,115,101,123,97,61,123,115,116,101,112,115,58,48,44,98,112,109,58,48,44, -109,111,118,101,109,101,110,116,58,48,44,109,111,118,67,110,116,58,48,44,98,112,109,67,110,116,58,48,125,59,102,111, -114,40,118,97,114,32,107,61,48,59,49,52,52,62,107,59,107,43,43,41,100,61,103,46,115,117,98,115,116,114,40,104, -44,52,41,44,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61, -100,38,38,40,97,46,115,116,101,112,115,43,61,40,100,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56, -41,43,100,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,97,46,109,111,118,101,109,101,110,116,43,61,100,46, -99,104,97,114,67,111,100,101,65,116,40,50,41,44,97,46,109,111,118,67,110,116,43,43,44,100,61,100,46,99,104,97, -114,67,111,100,101,65,116,40,50,41,44,97,46,98,112,109,43,61,100,44,100,38,38,97,46,98,112,109,67,110,116,43, -43,41,44,104,45,61,52,59,97,46,98,112,109,67,110,116,38,38,40,97,46,98,112,109,47,61,97,46,98,112,109,67, -110,116,41,59,97,46,109,111,118,67,110,116,38,38,40,97,46,109,111,118,101,109,101,110,116,47,61,97,46,109,111,118, -67,110,116,41,59,10,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98, -44,102,40,97,41,44,101,44,49,55,57,56,56,41,125,125,41,255,255,255,65,4,0,0,104,101,97,108,116,104,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,104,40,97, -41,123,114,101,116,117,114,110,34,104,101,97,108,116,104,45,34,43,97,46,103,101,116,70,117,108,108,89,101,97,114,40, -41,43,34,45,34,43,40,97,46,103,101,116,77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119,34,125,102,117, -110,99,116,105,111,110,32,107,40,97,41,123,114,101,116,117,114,110,32,49,52,53,42,40,97,46,103,101,116,68,97,116, -101,40,41,45,49,41,43,54,42,97,46,103,101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,97,46,103,101,116, -77,105,110,117,116,101,115,40,41,47,54,48,41,125,101,120,112,111,114,116,115,46,114,101,97,100,65,108,108,82,101,99, -111,114,100,115,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,97,61,104,40,97,41,59,97,61,114,101,113,117, -105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111,105,100,32,48, -33,61,61,97,41,102,111,114,40,118,97,114,32,99,61,56,44,100,61,48,59,51,49,62,100,59,100,43,43,41,123,102, -111,114,40,118,97,114,32,98,61,48,59,50,52,62,98,59,98,43,43,41,102,111,114,40,118,97,114,32,101,61,48,59, -54,62,101,59,101,43,43,41,123,118,97,114,32,103,61,97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92,117, -48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,103,38,38,102,40,123,100, -97,121,58,100,43,49,44,104,114,58,98,44,109,105,110,58,49,48,42,101,44,115,116,101,112,115,58,103,46,99,104,97, -114,67,111,100,101,65,116,40,48,41,60,60,56,124,103,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112, -109,58,103,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,103,46,99,104,97, -114,67,111,100,101,65,116,40,51,41,125,41,59,99,43,61,10,52,125,99,43,61,52,125,125,59,101,120,112,111,114,116, -115,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,61,102,117,110,99,116,105,111,110,40,97,44, -102,41,123,107,40,97,41,59,97,61,104,40,97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103, -101,34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111,114,40,118,97, -114,32,99,61,53,56,52,44,100,61,48,59,51,49,62,100,59,100,43,43,41,123,118,97,114,32,98,61,97,46,115,117, -98,115,116,114,40,99,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48, -48,102,102,34,33,61,98,38,38,102,40,123,100,97,121,58,100,43,49,44,115,116,101,112,115,58,98,46,99,104,97,114, -67,111,100,101,65,116,40,48,41,60,60,56,124,98,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109, -58,98,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,98,46,99,104,97,114, -67,111,100,101,65,116,40,51,41,125,41,59,99,43,61,53,56,48,125,125,59,101,120,112,111,114,116,115,46,114,101,97, -100,68,97,121,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,107,40,97,41,59,118,97,114,32,99,61,104,40, -97,41,59,99,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,99,41,59, -105,102,40,118,111,105,100,32,48,33,61,61,99,41,123,97,61,56,43,53,56,48,42,40,97,46,103,101,116,68,97,116, -101,40,41,45,49,41,59,102,111,114,40,118,97,114,32,100,61,48,59,50,52,62,100,59,100,43,43,41,102,111,114,40, -118,97,114,32,98,61,48,59,54,62,98,59,98,43,43,41,123,118,97,114,32,101,61,99,46,115,117,98,115,116,114,40, -97,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33, -61,101,38,38,102,40,123,104,114,58,100,44,10,109,105,110,58,49,48,42,98,44,115,116,101,112,115,58,101,46,99,104, -97,114,67,111,100,101,65,116,40,48,41,60,60,56,124,101,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98, -112,109,58,101,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,101,46,99,104, -97,114,67,111,100,101,65,116,40,51,41,125,41,59,97,43,61,52,125,125,125,255,255,255,196,0,0,0,104,101,97,108, -116,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,104, -101,97,108,116,104,34,44,34,110,97,109,101,34,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,44, -34,115,114,99,34,58,34,104,101,97,108,116,104,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,104,101, -97,108,116,104,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,49,34,44,34,116,97,103,115, -34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,104,101,97,108,116,104,34,44,34,102,105,108,101,115,34,58,34, -104,101,97,108,116,104,46,105,110,102,111,44,104,101,97,108,116,104,46,97,112,112,46,106,115,44,104,101,97,108,116,104, -46,105,109,103,44,104,101,97,108,116,104,46,98,111,111,116,46,106,115,44,104,101,97,108,116,104,34,125,232,13,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,6,0,0,104,101,97,108,116,104,46,98, +111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,102,117,110,99,116,105,111,110,40,41,123, +118,97,114,32,97,61,48,124,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100, +74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,49,41,124,124,123,125,41,46,104,114,109,59,105, +102,40,49,61,61,97,124,124,50,61,61,97,41,123,102,117,110,99,116,105,111,110,32,102,40,41,123,66,97,110,103,108, +101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101,97,108,116,104,34,41,59,115,101,116,84,105,109, +101,111,117,116,40,40,41,61,62,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104, +101,97,108,116,104,34,41,44,54,69,52,42,97,41,59,105,102,40,49,61,61,97,41,102,111,114,40,118,97,114,32,98, +61,49,59,50,62,61,98,59,98,43,43,41,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,123,66,97,110,103, +108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101,97,108,116,104,34,41,59,115,101,116,84,105, +109,101,111,117,116,40,40,41,61,62,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44, +34,104,101,97,108,116,104,34,41,125,44,50,69,53,42,98,43,54,69,52,41,125,44,50,69,53,42,98,41,125,66,97, +110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34,44,102,41,59,66,97,110,103,108,101,46,111,110,40,34,72, +82,77,34,44,98,61,62,123,56,48,60,98,46,99,111,110,102,105,100,101,110,99,101,38,38,66,97,110,103,108,101,46, +115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,125,41,59,66,97,110,103,108,101, +46,103,101,116,72,101,97,108,116,104,83,116,97,116,117,115,40,41,46,98,112,109,67,111,110,102,105,100,101,110,99,101, +124,124,102,40,41,125,101,108,115,101,32,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,33, +61,10,97,44,34,104,101,97,108,116,104,34,41,125,41,40,41,59,66,97,110,103,108,101,46,111,110,40,34,104,101,97, +108,116,104,34,44,97,61,62,123,102,117,110,99,116,105,111,110,32,102,40,99,41,123,114,101,116,117,114,110,32,83,116, +114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,99,46,115,116,101,112,115,62,62,56,44,99,46,115, +116,101,112,115,38,50,53,53,44,99,46,98,112,109,44,77,97,116,104,46,109,105,110,40,99,46,109,111,118,101,109,101, +110,116,47,56,44,50,53,53,41,41,125,118,97,114,32,98,61,110,101,119,32,68,97,116,101,40,68,97,116,101,46,110, +111,119,40,41,45,53,57,69,52,41,44,101,61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,32, +49,52,53,42,40,99,46,103,101,116,68,97,116,101,40,41,45,49,41,43,54,42,99,46,103,101,116,72,111,117,114,115, +40,41,43,40,48,124,54,42,99,46,103,101,116,77,105,110,117,116,101,115,40,41,47,54,48,41,125,40,98,41,59,98, +61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,34,104,101,97,108,116,104,45,34,43,99,46,103, +101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,99,46,103,101,116,77,111,110,116,104,40,41,43,49, +41,43,34,46,114,97,119,34,125,40,98,41,59,118,97,114,32,103,61,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,114,101,97,100,40,98,41,59,105,102,40,103,41,123,118,97,114,32,100,61,103,46,115,117,98,115, +116,114,40,56,43,52,42,101,44,52,41,59,105,102,40,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48, +102,102,92,117,48,48,102,102,34,33,61,100,41,123,112,114,105,110,116,40,34,72,69,65,76,84,72,32,69,82,82,58, +32,65,108,114,101,97,100,121,32,119,114,105,116,116,101,110,33,34,41,59,114,101,116,117,114,110,125,125,101,108,115,101, +32,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,10,34,72,69, +65,76,84,72,49,92,120,48,48,34,44,48,44,49,55,57,56,56,41,59,118,97,114,32,104,61,56,43,52,42,101,59, +114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,102,40,97,41,44, +104,44,49,55,57,56,56,41,59,105,102,40,49,52,51,61,61,101,37,49,52,53,41,105,102,40,101,61,104,43,52,44, +34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,103,46,115,117, +98,115,116,114,40,101,44,52,41,41,112,114,105,110,116,40,34,72,69,65,76,84,72,32,69,82,82,58,32,68,97,105, +108,121,32,115,117,109,109,97,114,121,32,97,108,114,101,97,100,121,32,119,114,105,116,116,101,110,33,34,41,59,101,108, +115,101,123,97,61,123,115,116,101,112,115,58,48,44,98,112,109,58,48,44,109,111,118,101,109,101,110,116,58,48,44,109, +111,118,67,110,116,58,48,44,98,112,109,67,110,116,58,48,125,59,102,111,114,40,118,97,114,32,107,61,48,59,49,52, +52,62,107,59,107,43,43,41,100,61,103,46,115,117,98,115,116,114,40,104,44,52,41,44,34,92,117,48,48,102,102,92, +117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,100,38,38,40,97,46,115,116,101,112,115,43, +61,40,100,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56,41,43,100,46,99,104,97,114,67,111,100,101, +65,116,40,49,41,44,97,46,109,111,118,101,109,101,110,116,43,61,100,46,99,104,97,114,67,111,100,101,65,116,40,50, +41,44,97,46,109,111,118,67,110,116,43,43,44,100,61,100,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,97, +46,98,112,109,43,61,100,44,100,38,38,97,46,98,112,109,67,110,116,43,43,41,44,104,45,61,52,59,97,46,98,112, +109,67,110,116,38,38,40,97,46,98,112,109,47,61,97,46,98,112,109,67,110,116,41,59,97,46,109,111,118,67,110,116, +38,38,40,97,46,109,111,118,101,109,101,110,116,47,61,97,46,109,111,118,67,110,116,41,59,10,114,101,113,117,105,114, +101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,102,40,97,41,44,101,44,49,55,57,56, +56,41,125,125,41,255,255,255,65,4,0,0,104,101,97,108,116,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,104,40,97,41,123,114,101,116,117,114,110,34,104,101,97, +108,116,104,45,34,43,97,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,97,46,103,101,116, +77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119,34,125,102,117,110,99,116,105,111,110,32,107,40,97,41,123, +114,101,116,117,114,110,32,49,52,53,42,40,97,46,103,101,116,68,97,116,101,40,41,45,49,41,43,54,42,97,46,103, +101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,97,46,103,101,116,77,105,110,117,116,101,115,40,41,47,54,48, +41,125,101,120,112,111,114,116,115,46,114,101,97,100,65,108,108,82,101,99,111,114,100,115,61,102,117,110,99,116,105,111, +110,40,97,44,102,41,123,97,61,104,40,97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, +34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111,114,40,118,97,114, +32,99,61,56,44,100,61,48,59,51,49,62,100,59,100,43,43,41,123,102,111,114,40,118,97,114,32,98,61,48,59,50, +52,62,98,59,98,43,43,41,102,111,114,40,118,97,114,32,101,61,48,59,54,62,101,59,101,43,43,41,123,118,97,114, +32,103,61,97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117, +48,48,102,102,92,117,48,48,102,102,34,33,61,103,38,38,102,40,123,100,97,121,58,100,43,49,44,104,114,58,98,44, +109,105,110,58,49,48,42,101,44,115,116,101,112,115,58,103,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60, +56,124,103,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,103,46,99,104,97,114,67,111,100,101, +65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,103,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41, +59,99,43,61,10,52,125,99,43,61,52,125,125,59,101,120,112,111,114,116,115,46,114,101,97,100,68,97,105,108,121,83, +117,109,109,97,114,105,101,115,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,107,40,97,41,59,97,61,104,40, +97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,97,41,59, +105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111,114,40,118,97,114,32,99,61,53,56,52,44,100,61,48,59, +51,49,62,100,59,100,43,43,41,123,118,97,114,32,98,61,97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92, +117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,98,38,38,102,40,123, +100,97,121,58,100,43,49,44,115,116,101,112,115,58,98,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56, +124,98,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,98,46,99,104,97,114,67,111,100,101,65, +116,40,50,41,44,109,111,118,101,109,101,110,116,58,98,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41,59, +99,43,61,53,56,48,125,125,59,101,120,112,111,114,116,115,46,114,101,97,100,68,97,121,61,102,117,110,99,116,105,111, +110,40,97,44,102,41,123,107,40,97,41,59,118,97,114,32,99,61,104,40,97,41,59,99,61,114,101,113,117,105,114,101, +40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,99,41,59,105,102,40,118,111,105,100,32,48,33,61,61, +99,41,123,97,61,56,43,53,56,48,42,40,97,46,103,101,116,68,97,116,101,40,41,45,49,41,59,102,111,114,40,118, +97,114,32,100,61,48,59,50,52,62,100,59,100,43,43,41,102,111,114,40,118,97,114,32,98,61,48,59,54,62,98,59, +98,43,43,41,123,118,97,114,32,101,61,99,46,115,117,98,115,116,114,40,97,44,52,41,59,34,92,117,48,48,102,102, +92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,101,38,38,102,40,123,104,114,58,100,44, +10,109,105,110,58,49,48,42,98,44,115,116,101,112,115,58,101,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60, +60,56,124,101,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,101,46,99,104,97,114,67,111,100, +101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,101,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125, +41,59,97,43,61,52,125,125,125,255,255,255,4,2,0,0,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46, +106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,172,115,101,116,116,105,110,103,115,61,79, +98,106,101,99,116,46,97,115,115,105,103,110,40,123,104,114,109,58,48,44,115,116,101,112,71,111,97,108,58,49,48,48, +48,48,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40, +34,104,101,97,108,116,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,69,46,115,104,111,119,77,101,110,117,40, +123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,125,44,34,60, +32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41,44,34,72,82,77,32,73,110,116,101,114,118,97,108,34,58, +123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,104,114,109,44,109,105,110,58,48,44,109,97,120,58,51,44, +102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,51,32,109,105,110,34,44,34,49,48,32,109,105,110,34, +44,34,65,108,119,97,121,115,34,93,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, +103,115,46,104,114,109,61,118,59,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125, +125,44,34,68,97,105,108,121,32,83,116,101,112,32,71,111,97,108,34,58,123,118,97,108,117,101,58,115,101,116,116,105, +110,103,115,46,115,116,101,112,71,111,97,108,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48,48,44,115,116,101, +112,58,50,53,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,115,116,101,112,71, +111,97,108,61,118,59,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,125,41, +59,170,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,123,114,101,113,117,105,114,101,40, +34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111, +110,34,44,115,101,116,116,105,110,103,115,41,59,125,125,41,236,0,0,0,104,101,97,108,116,104,46,105,110,102,111,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,104,101,97,108,116,104,34,44,34, +110,97,109,101,34,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,44,34,115,114,99,34,58,34,104, +101,97,108,116,104,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,104,101,97,108,116,104,46,105,109,103, +34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,53,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44, +115,121,115,116,101,109,44,104,101,97,108,116,104,34,44,34,102,105,108,101,115,34,58,34,104,101,97,108,116,104,46,105, +110,102,111,44,104,101,97,108,116,104,46,97,112,112,46,106,115,44,104,101,97,108,116,104,46,105,109,103,44,104,101,97, +108,116,104,46,98,111,111,116,46,106,115,44,104,101,97,108,116,104,44,104,101,97,108,116,104,46,115,101,116,116,105,110, +103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,104,101,97,108,116,104,46,106,115,111,110,34,125,198,41,0,0, 97,108,97,114,109,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117, -108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120, -112,111,114,116,115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123, -172,118,105,98,80,97,116,116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,46,46,34,44,34,45,34,44,34,45, -45,34,44,34,45,46,45,34,44,34,45,45,45,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120, -40,48,44,118,105,98,80,97,116,116,101,114,110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109, -105,110,58,48,44,109,97,120,58,118,105,98,80,97,116,116,101,114,110,115,46,108,101,110,103,116,104,44,102,111,114,109, -97,116,58,118,162,118,105,98,80,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110, -103,101,58,118,162,123,99,97,108,108,98,97,99,107,40,118,105,98,80,97,116,116,101,114,110,115,91,118,93,41,59,125, -125,59,125,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110, -103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117,105, -114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,100,101,99,111,100,101, -84,105,109,101,40,116,41,123,116,61,48,124,116,59,172,104,114,115,61,48,124,40,116,47,51,54,48,48,48,48,48,41, -59,171,123,104,114,115,58,104,114,115,44,109,105,110,115,58,77,97,116,104,46,114,111,117,110,100,40,40,116,45,104,114, -115,42,51,54,48,48,48,48,48,41,47,54,48,48,48,48,41,125,59,125,10,170,101,110,99,111,100,101,84,105,109,101, -40,111,41,123,171,111,46,104,114,115,42,51,54,48,48,48,48,48,43,111,46,109,105,110,115,42,54,48,48,48,48,59, -125,10,170,102,111,114,109,97,116,84,105,109,101,40,116,41,123,172,111,61,100,101,99,111,100,101,84,105,109,101,40,116, -41,59,171,111,46,104,114,115,43,34,58,34,43,40,34,48,34,43,111,46,109,105,110,115,41,46,115,117,98,115,116,114, -40,45,50,41,59,125,10,170,103,101,116,67,117,114,114,101,110,116,84,105,109,101,40,41,123,172,116,105,109,101,61,184, -68,97,116,101,40,41,59,171,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48, -43,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,43,116,105,109,101,46,103,101, -116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,59,125,10,170,115,97,118,101,65,110,100,82,101,108,111,97, -100,40,41,123,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97, -108,97,114,109,115,41,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41, -59,125,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117,61,123,39,39,58,123,39,116, -105,116,108,101,39,58,39,65,108,97,114,109,47,84,105,109,101,114,39,125,44,39,60,32,66,97,99,107,39,58,40,41, -162,123,108,111,97,100,40,41,59,125,44,39,78,101,119,32,65,108,97,114,109,39,58,40,41,162,101,100,105,116,65,108, -97,114,109,40,45,49,41,44,39,78,101,119,32,84,105,109,101,114,39,58,40,41,162,101,100,105,116,84,105,109,101,114, -40,45,49,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,100,120,41, -162,123,172,116,120,116,59,163,40,97,108,97,114,109,46,116,105,109,101,114,41,116,120,116,61,34,84,105,109,101,114,34, -43,34,32,34,43,102,111,114,109,97,116,84,105,109,101,40,97,108,97,114,109,46,116,105,109,101,114,41,59,164,116,120, -116,61,34,65,108,97,114,109,34,43,34,32,34,43,102,111,114,109,97,116,84,105,109,101,40,97,108,97,114,109,46,116, -41,59,163,40,97,108,97,114,109,46,114,112,41,116,120,116,150,34,92,48,34,43,97,116,111,98,40,34,70,66,97,66, -65,65,65,66,103,65,65,99,65,65,72,110,47,47,47,47,47,47,119,65,72,115,65,66,122,65,65,89,119,65,65,77, -65,65,68,65,65,65,65,65,65,119,65,65,77,65,65,68,71,65,65,122,103,65,78,52,65,68,47,47,47,47,47,47, -53,52,65,65,79,65,65,66,103,65,65,61,34,41,59,109,101,110,117,91,116,120,116,93,61,123,118,97,108,117,101,58, -34,92,48,34,43,97,116,111,98,40,97,108,97,114,109,46,111,110,63,34,69,104,75,66,65,72,47,47,118,47,47,47, -47,47,47,47,47,47,47,47,47,47,53,47,47,120,47,47,106,47,47,72,43,101,80,43,77,102,47,65,47,47,104,47, -47,122,47,47,47,47,47,47,47,47,47,47,51,47,47,103,34,58,34,69,104,75,66,65,72,47,47,118,47,47,56,65, -65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56,65,65,56, -65,65,56,65,65,56,65,65,47,47,47,51,47,47,103,34,41,44,111,110,99,104,97,110,103,101,58,170,40,41,123,163, -40,97,108,97,114,109,46,116,105,109,101,114,41,101,100,105,116,84,105,109,101,114,40,105,100,120,44,97,108,97,114,109, -41,59,164,101,100,105,116,65,108,97,114,109,40,105,100,120,44,97,108,97,114,109,41,59,125,125,59,125,41,59,163,40, -87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,41,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34, -93,46,114,101,108,111,97,100,40,41,59,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,10,170, -101,100,105,116,68,79,87,40,100,111,119,44,111,110,99,104,97,110,103,101,41,123,174,109,101,110,117,61,123,39,39,58, -123,39,116,105,116,108,101,39,58,39,68,97,121,115,32,111,102,32,87,101,101,107,39,125,44,39,60,32,66,97,99,107, -39,58,40,41,162,111,110,99,104,97,110,103,101,40,100,111,119,41,125,59,167,40,172,105,61,48,59,105,60,55,59,105, -152,41,40,105,162,123,172,100,97,121,79,102,87,101,101,107,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101, -34,41,46,100,111,119,40,123,103,101,116,68,97,121,58,40,41,162,105,125,41,59,109,101,110,117,91,100,97,121,79,102, -87,101,101,107,93,61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,105,41,41,44,102,111,114,109,97, -116,58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,118,162,118,63,100,111, -119,159,49,143,105,58,100,111,119,157,126,40,49,143,105,41,44,125,59,125,41,40,105,41,59,69,46,115,104,111,119,77, -101,110,117,40,109,101,110,117,41,59,125,10,170,101,100,105,116,65,108,97,114,109,40,97,108,97,114,109,73,110,100,101, -120,44,97,108,97,114,109,41,123,172,110,101,119,65,108,97,114,109,61,97,108,97,114,109,73,110,100,101,120,60,48,59, -172,97,61,123,116,58,49,50,42,51,54,48,48,48,48,48,44,111,110,58,180,44,114,112,58,180,44,97,115,58,181,44, -100,111,119,58,48,98,49,49,49,49,49,49,49,44,108,97,115,116,58,48,44,118,105,98,114,97,116,101,58,34,46,46, -34,125,163,40,33,110,101,119,65,108,97,114,109,41,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108, -97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,41,59,163,40,97,108,97,114,109,41,79,98,106,101,99,116, -46,97,115,115,105,103,110,40,97,44,97,108,97,114,109,41,59,172,116,61,100,101,99,111,100,101,84,105,109,101,40,97, -46,116,41,59,174,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108,97,114,109,39,125,44, -39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,72,111,117,114, -115,39,58,123,118,97,108,117,101,58,116,46,104,114,115,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97, -112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,46,104,114,115,61,118,125,44,39,77,105,110,117,116,101,115, -39,58,123,118,97,108,117,101,58,116,46,109,105,110,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97, -112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,46,109,105,110,115,61,118,125,44,39,69,110,97,98,108,101, -100,39,58,123,118,97,108,117,101,58,97,46,111,110,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34, -79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,97,46,111,110,61,118,125,44,39,82,101,112,101,97,116,39, -58,123,118,97,108,117,101,58,97,46,114,112,44,102,111,114,109,97,116,58,118,162,118,63,34,89,101,115,34,58,34,78, -111,34,44,111,110,99,104,97,110,103,101,58,118,162,97,46,114,112,61,118,125,44,39,68,97,121,115,39,58,123,118,97, -108,117,101,58,34,83,77,84,87,84,70,83,34,46,115,112,108,105,116,40,34,34,41,46,109,97,112,40,40,100,44,110, -41,162,97,46,100,111,119,38,40,49,143,110,41,63,100,58,34,46,34,41,46,106,111,105,110,40,34,34,41,44,111,110, -99,104,97,110,103,101,58,40,41,162,101,100,105,116,68,79,87,40,97,46,100,111,119,44,100,162,123,97,46,100,111,119, -61,100,59,101,100,105,116,65,108,97,114,109,40,97,108,97,114,109,73,110,100,101,120,44,97,41,125,41,125,44,39,86, -105,98,114,97,116,101,39,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116, -116,101,114,110,40,97,46,118,105,98,114,97,116,101,44,118,162,97,46,118,105,98,114,97,116,101,61,118,41,44,39,65, -117,116,111,32,115,110,111,111,122,101,39,58,123,118,97,108,117,101,58,97,46,97,115,44,102,111,114,109,97,116,58,118, -162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,118,162,97,46,97,115,61,118,125, -125,59,109,101,110,117,91,34,83,97,118,101,34,93,61,170,40,41,123,97,46,116,61,101,110,99,111,100,101,84,105,109, -101,40,116,41,59,163,40,97,46,116,60,103,101,116,67,117,114,114,101,110,116,84,105,109,101,40,41,41,97,46,100,97, -121,61,40,184,68,97,116,101,40,41,41,46,103,101,116,68,97,116,101,40,41,59,163,40,110,101,119,65,108,97,114,109, -41,97,108,97,114,109,115,46,112,117,115,104,40,97,41,59,164,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100, -101,120,93,61,97,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101, -110,117,40,41,59,125,59,163,40,33,110,101,119,65,108,97,114,109,41,123,109,101,110,117,91,34,68,101,108,101,116,101, -34,93,61,170,40,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44, -49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40, -41,59,125,59,125,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,10,170,101,100,105,116,84,105, -109,101,114,40,97,108,97,114,109,73,110,100,101,120,44,97,108,97,114,109,41,123,172,110,101,119,65,108,97,114,109,61, -97,108,97,114,109,73,110,100,101,120,60,48,59,172,97,61,123,116,105,109,101,114,58,53,42,54,48,42,49,48,48,48, -44,111,110,58,180,44,114,112,58,181,44,97,115,58,181,44,100,111,119,58,48,98,49,49,49,49,49,49,49,44,108,97, -115,116,58,48,44,118,105,98,114,97,116,101,58,34,46,46,34,125,163,40,33,110,101,119,65,108,97,114,109,41,79,98, -106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93, -41,59,163,40,97,108,97,114,109,41,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,44,97,108,97,114,109,41, -59,172,116,61,100,101,99,111,100,101,84,105,109,101,40,97,46,116,105,109,101,114,41,59,174,109,101,110,117,61,123,39, -39,58,123,39,116,105,116,108,101,39,58,39,84,105,109,101,114,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162, -115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,72,111,117,114,115,39,58,123,118,97,108,117,101,58,116,46, -104,114,115,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,118,162,116,46,104,114,115,61,118,125,44,39,77,105,110,117,116,101,115,39,58,123,118,97,108,117,101,58,116,46,109, -105,110,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,118,162,116,46,109,105,110,115,61,118,125,44,39,69,110,97,98,108,101,100,39,58,123,118,97,108,117,101,58,97,46, -111,110,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103, -101,58,118,162,97,46,111,110,61,118,125,44,39,86,105,98,114,97,116,101,39,58,114,101,113,117,105,114,101,40,34,98, -117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,46,118,105,98,114,97,116,101,44,118,162,97, -46,118,105,98,114,97,116,101,61,118,41,44,125,59,109,101,110,117,91,34,83,97,118,101,34,93,61,170,40,41,123,97, -46,116,105,109,101,114,61,101,110,99,111,100,101,84,105,109,101,40,116,41,59,97,46,116,61,103,101,116,67,117,114,114, -101,110,116,84,105,109,101,40,41,43,97,46,116,105,109,101,114,59,163,40,110,101,119,65,108,97,114,109,41,97,108,97, -114,109,115,46,112,117,115,104,40,97,41,59,164,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61, -97,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41, -59,125,59,163,40,33,110,101,119,65,108,97,114,109,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,170, -40,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59,115, -97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,59, -125,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,10,115,104,111,119,77,97,105,110,77,101,110, -117,40,41,59,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170,40,41,123,174, +79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61,54,48,42,79, +78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77,73,78,85,84, +69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114,116,115,46,101, +110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84,105,109,101,40, +116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104,42,79,78,69, +95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101,46,115,42,79, +78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171,123,100,58,116, +105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160,48,44,115,58, +116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,61,40,109, +105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176,34,79,110,108, +121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172,100,61,77,97, +116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108,108,105,115,151, +100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79, +78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172,109,61,77,97, +116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59,109,105,108,108, +105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111,114,40,109,105, +108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109,58,109,44,115, +58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108,117,101,41,162, +123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63, +118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41, +59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100, +32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41,176,34,73,110, +118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32,60,61,32,50, +51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110,118,97,108,105, +100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53,57,34,59,171, +116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115,116,114,40,45, +50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40,118,97,108,117, +101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160,181,59,172,100, +117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101, +139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105, +109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116,114,105,109,40, +41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34,32,34,44,34, +34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114,101,110,116,84, +105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105, +109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77,105,110,117,116, +101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49,48,48,48,59, +125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105, +108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116, +101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40, +184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114, +101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41, +63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112, +101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91, +93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105, +61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119, +40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101, +100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162, +100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116, +115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61, +114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105, +45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115, +108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97, +98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41, +58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97, +116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101, +40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104, +115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53, +41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101, +40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98, +114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116, +104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,77,111, +100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114, +116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111, +108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111, +108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116, +101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85, +90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77, +95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103, +108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110, +40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99, +138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95, +87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44, +49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95, +77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116, +40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117, +122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41, +162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59, +34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82, +79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49, +48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77, +83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117, +116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122, +122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10,77,111,100,117,108,101,115,46, +97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116, +115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,112,97,116, +116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34,58,58,34,44,34,44,34,44, +34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45,45,34,44,34,61,61,34,44, +34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44,34,61,61,61,34,93,59,171, +123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114,110,115,46,105,110,100,101,120, +79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116,116,101,114,110,115,46,108,101, +110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102, +34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97, +116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98,97,99,107,40,112,97,116,116, +101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103, +101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, +46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,180,41,160,123,125,41,46, +102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,59,10,174,87,79,82,75,68,65,89,83,61,54,50,10,174, +87,69,69,75,69,78,68,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,49,57,50,58,54,53,59,10,174, +69,86,69,82,89,95,68,65,89,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,50,53,52,58,49,50,55, +59,10,174,105,99,111,110,65,108,97,114,109,79,110,61,34,92,48,34,43,97,116,111,98,40,34,71,66,105,66,65,65, +65,65,65,65,65,65,65,65,89,65,89,65,52,65,99,66,120,43,79,68,110,47,110,65,80,47,119,65,102,47,52,65, +47,110,56,65,47,110,56,66,47,110,43,66,47,110,43,66,47,110,43,66,47,110,43,66,47,104,43,66,47,52,43,65, +47,43,56,65,47,47,56,65,102,47,52,65,80,47,119,65,72,47,103,65,66,43,65,65,65,65,65,65,65,65,65,65, +61,61,34,41,59,10,174,105,99,111,110,65,108,97,114,109,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109, +101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65, +71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65, +102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77, +72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98, +40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106, +103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119, +65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119, +77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,110,61, +34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47, +47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65, +66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65, +65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65, +65,65,65,65,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119, +65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89, +65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,41,59,10,174, +105,99,111,110,84,105,109,101,114,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63, +97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43, +65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65, +65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52, +99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65, +80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103, +89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53, +72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65, +102,52,65,65,72,103,61,34,41,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104, +101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,104,97,110,100,108,101,70,105,114,115,116,68,97, +121,79,102,87,101,101,107,40,100,111,119,41,123,163,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,138,49,41, +123,163,40,40,100,111,119,38,49,41,138,49,41,123,100,111,119,150,49,50,55,59,125,164,163,40,40,100,111,119,38,49, +50,56,41,138,49,50,56,41,123,100,111,119,151,49,50,55,59,125,125,171,100,111,119,59,125,10,97,108,97,114,109,115, +46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97, +46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41, +41,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117,61,123,34,34,58,123,34,116, +105,116,108,101,34,58,34,65,108,97,114,109,115,32,38,32,84,105,109,101,114,115,34,125,44,34,60,32,66,97,99,107, +34,58,40,41,162,108,111,97,100,40,41,44,34,78,101,119,46,46,46,34,58,40,41,162,115,104,111,119,78,101,119,77, +101,110,117,40,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,101,44,105,110,100,101,120,41,162, +123,172,108,97,98,101,108,61,101,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,101,46,116,105,109,101,114,41,58,114,101, +113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,84,105,109,101,40,101, +46,116,41,43,40,101,46,114,112,63,96,32,36,123,100,101,99,111,100,101,68,79,87,40,101,41,125,96,58,34,34,41, +59,109,101,110,117,91,108,97,98,101,108,93,61,123,118,97,108,117,101,58,101,46,111,110,63,40,101,46,116,105,109,101, +114,63,105,99,111,110,84,105,109,101,114,79,110,58,105,99,111,110,65,108,97,114,109,79,110,41,58,40,101,46,116,105, +109,101,114,63,105,99,111,110,84,105,109,101,114,79,102,102,58,105,99,111,110,65,108,97,114,109,79,102,102,41,44,111, +110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,101,46,116,105,109,101,114,63,115,104, +111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,58,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110, +117,44,49,48,44,101,44,105,110,100,101,120,41,125,59,125,41,59,10,109,101,110,117,91,34,65,100,118,97,110,99,101, +100,34,93,61,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,10,69,46,115,104,111, +119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,78,101,119,77,101,110,117,40,41,123,10,69,46, +115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,78,101,119,46,46,46,34,125,44, +34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,65,108,97,114, +109,34,58,40,41,162,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,183,44,183,41,44,34,84,105, +109,101,114,34,58,40,41,162,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,183,44,183,41,125,41, +59,10,125,170,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,115,101,108,101,99,116,101,100,65,108, +97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,97,108,97,114,109,73,110,100, +101,120,139,183,59,10,172,97,108,97,114,109,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,110,101, +119,68,101,102,97,117,108,116,65,108,97,114,109,40,41,59,10,97,108,97,114,109,46,100,111,119,61,104,97,110,100,108, +101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,108,97,114,109,46,100,111,119,41,59,10,163,40,115,101, +108,101,99,116,101,100,65,108,97,114,109,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,108,97,114,109, +44,115,101,108,101,99,116,101,100,65,108,97,114,109,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40, +34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116, +41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119, +32,65,108,97,114,109,34,58,34,69,100,105,116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40, +41,162,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97, +114,109,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104, +111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,34,58,123,118,97,108,117,101,58,116,105,109, +101,46,104,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44, +109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116, +105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,34,58,123,118,97,108,117,101,58,116,105,109,101,46,109,44, +102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44,109,105,110,58, +48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46, +109,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,111,110,44,111, +110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,111,110,61,118,125,44,34,82,101,112,101,97,116,34,58,123, +118,97,108,117,101,58,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,44,111,110,99,104,97,110,103,101,58, +40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117, +44,49,48,48,44,97,108,97,114,109,46,114,112,44,97,108,97,114,109,46,100,111,119,44,40,114,101,112,101,97,116,44, +100,111,119,41,162,123,97,108,97,114,109,46,114,112,61,114,101,112,101,97,116,59,97,108,97,114,109,46,100,111,119,61, +100,111,119,59,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, +41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104, +111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110, +100,101,120,41,59,125,41,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122, +95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,108,97,114,109,46,118,105,98,114,97,116,101,44,118,162, +97,108,97,114,109,46,118,105,98,114,97,116,101,61,118,41,44,34,65,117,116,111,32,83,110,111,111,122,101,34,58,123, +118,97,108,117,101,58,97,108,97,114,109,46,97,115,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46, +97,115,61,118,125,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41, +125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,40,41,162,123, +69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105, +116,108,101,58,34,68,101,108,101,116,101,32,65,108,97,114,109,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105, +114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108, +97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119, +77,97,105,110,77,101,110,117,40,41,59,125,164,123,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116, +105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116, +84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97, +114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110, +117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97, +108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,123,10,97,108,97,114,109,46,116,61,114, +101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40, +116,105,109,101,41,59,10,97,108,97,114,109,46,108,97,115,116,61,97,108,97,114,109,46,116,60,114,101,113,117,105,114, +101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105, +108,108,105,115,40,41,63,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41,58,48,59,10,163,40,97,108, +97,114,109,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40,97,108,97,114,109,41,59,125, +164,123,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,108,97,114,109,59,125,10,125,170,115, +97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162, +101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108, +101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59,10,114,101,113,117,105,114,101, +40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,10,114,101,113, +117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,10,97,108,97,114,109,115,46,102, +105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100, +111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59, +10,125,170,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,123,10,171,97,108,97,114,109,46,114,112,10,63, +114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,10,46,100,111,119,115,40,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,44,50,41,10,46,109,97,112,40,40,100,97,121,44,105,110,100,101,120,41,162,97, +108,97,114,109,46,100,111,119,38,40,49,143,40,105,110,100,101,120,43,102,105,114,115,116,68,97,121,79,102,87,101,101, +107,41,41,63,100,97,121,58,34,95,34,41,10,46,106,111,105,110,40,34,34,41,10,46,116,111,76,111,119,101,114,67, +97,115,101,40,41,10,58,34,79,110,99,101,34,10,125,170,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101, +110,117,40,114,101,112,101,97,116,44,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41, +123,10,172,111,114,105,103,105,110,97,108,82,101,112,101,97,116,61,114,101,112,101,97,116,59,10,172,111,114,105,103,105, +110,97,108,68,111,119,61,100,111,119,59,10,172,105,115,67,117,115,116,111,109,61,114,101,112,101,97,116,158,100,111,119, +140,87,79,82,75,68,65,89,83,158,100,111,119,140,87,69,69,75,69,78,68,158,100,111,119,140,69,86,69,82,89,95, +68,65,89,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,82,101,112,101,97,116,32, +65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, +108,98,97,99,107,40,114,101,112,101,97,116,44,100,111,119,41,44,34,79,110,99,101,34,58,123,118,97,108,117,101,58, +33,114,101,112,101,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, +108,98,97,99,107,40,181,44,69,86,69,82,89,95,68,65,89,41,125,44,34,87,111,114,107,100,97,121,115,34,58,123, +118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,79,82,75,68,65,89,83,44,111,110,99,104,97,110, +103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,79,82,75,68,65, +89,83,41,125,44,34,87,101,101,107,101,110,100,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111, +119,138,87,69,69,75,69,78,68,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67, +97,108,108,98,97,99,107,40,180,44,87,69,69,75,69,78,68,41,125,44,34,69,118,101,114,121,32,68,97,121,34,58, +123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,69,86,69,82,89,95,68,65,89,44,111,110,99,104, +97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,69,86,69,82, +89,95,68,65,89,41,125,44,34,67,117,115,116,111,109,34,58,123,118,97,108,117,101,58,105,115,67,117,115,116,111,109, +63,100,101,99,111,100,101,68,79,87,40,123,114,112,58,180,44,100,111,119,58,100,111,119,125,41,58,181,44,111,110,99, +104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,67,117,115,116,111,109,68,97, +121,115,77,101,110,117,44,49,48,44,105,115,67,117,115,116,111,109,63,100,111,119,58,69,86,69,82,89,95,68,65,89, +44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97, +116,44,111,114,105,103,105,110,97,108,68,111,119,41,125,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110, +117,41,59,10,125,170,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117,40,100,111,119,44,100,111,119, +67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114, +105,103,105,110,97,108,68,111,119,41,123,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34, +67,117,115,116,111,109,32,68,97,121,115,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,172,114,101,112,101, +97,116,61,100,111,119,62,48,59,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97, +116,44,114,101,112,101,97,116,63,100,111,119,58,69,86,69,82,89,95,68,65,89,41,125,125,59,10,114,101,113,117,105, +114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,115,40,102,105,114,115,116,68,97,121,79,102, +87,101,101,107,41,46,102,111,114,69,97,99,104,40,40,100,97,121,44,105,41,162,123,109,101,110,117,91,100,97,121,93, +61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87, +101,101,107,41,41,41,44,111,110,99,104,97,110,103,101,58,118,162,118,63,40,100,111,119,159,49,143,40,105,43,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,41,41,58,40,100,111,119,157,126,40,49,143,40,105,43,102,105,114,115,116, +68,97,121,79,102,87,101,101,107,41,41,41,125,59,125,41,59,10,109,101,110,117,91,34,67,97,110,99,101,108,34,93, +61,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110, +117,44,49,48,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,44, +100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,10,69,46,115,104,111,119,77,101,110,117,40,109,101, +110,117,41,59,10,125,170,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,115,101,108,101,99,116,101, +100,84,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,116,105,109,101,114, +73,110,100,101,120,139,183,59,10,172,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41, +46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,40,41,59,10,163,40,115,101,108,101,99,116,101,100,84,105, +109,101,114,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,116,105,109,101,114,44,115,101,108,101,99,116,101, +100,84,105,109,101,114,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,116,105,109,101,114,46,116,105,109,101,114,41,59,10,174, +109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119,32,84,105,109, +101,114,34,58,34,69,100,105,116,32,84,105,109,101,114,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,112, +114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110, +100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97, +105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,104, +44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162, +116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46, +109,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118, +162,116,105,109,101,46,109,61,118,125,44,34,83,101,99,111,110,100,115,34,58,123,118,97,108,117,101,58,116,105,109,101, +46,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110, +99,104,97,110,103,101,58,118,162,116,105,109,101,46,115,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97, +108,117,101,58,116,105,109,101,114,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46,111,110, +61,118,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117, +34,41,46,112,97,116,116,101,114,110,40,116,105,109,101,114,46,118,105,98,114,97,116,101,44,118,162,116,105,109,101,114, +46,118,105,98,114,97,116,101,61,118,41,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110, +77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34, +93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101, +63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,84,105,109,101,114,34,125,41,46,116,104,101,110,40, +40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108, +105,99,101,40,116,105,109,101,114,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40, +41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,116,105,109,101,114,46,116,105,109,101,114,61, +114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101, +40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,84,105,109,101,114,77, +101,110,117,44,49,48,44,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,125,125,41,59,125,59,125,10, +69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,84,105,109,101,114, +70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,123,10, +116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, +41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,116,105,109,101,114,46,116,61,114,101,113,117, +105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101, +77,105,108,108,105,115,40,41,43,116,105,109,101,114,46,116,105,109,101,114,59,10,116,105,109,101,114,46,108,97,115,116, +61,48,59,10,163,40,116,105,109,101,114,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40, +116,105,109,101,114,41,59,125,164,123,97,108,97,114,109,115,91,116,105,109,101,114,73,110,100,101,120,93,61,116,105,109, +101,114,59,125,10,125,170,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,123,10,69,46,115,104,111, +119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,100,118,97,110,99,101,100,34,125,44,34, +60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,83,99,104,101,100, +117,108,101,114,32,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40,34, +83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106, +115,34,41,41,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,44,34,69,110,97, +98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,180,41,44,34,68,105,115,97,98,108, +101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,181,41,44,34,68,101,108,101,116,101,32,65, +108,108,34,58,40,41,162,100,101,108,101,116,101,65,108,108,40,41,125,41,59,10,125,170,101,110,97,98,108,101,65,108, +108,40,111,110,41,123,10,163,40,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,111,110,138,33,111, +110,41,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,111,110,63,34,78,111,116, +104,105,110,103,32,116,111,32,69,110,97,98,108,101,34,58,34,78,111,116,104,105,110,103,32,116,111,32,68,105,115,97, +98,108,101,34,44,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32,65,108, +108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59, +125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44, +123,116,105,116,108,101,58,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32, +65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109, +41,123,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,41,162,123,97,108,97,114, +109,46,111,110,61,111,110,59,163,40,111,110,41,123,163,40,97,108,97,114,109,46,116,105,109,101,114,41,123,112,114,101, +112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101, +40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46, +116,105,109,101,114,41,41,125,164,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108, +97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111, +100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,41,125,125,125,41,59,115,97,118,101,65,110,100,82,101,108,111, +97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118,97,110, +99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,170,100,101,108,101,116,101,65,108,108,40,41,123,10,163, +40,97,108,97,114,109,115,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,78, +111,116,104,105,110,103,32,116,111,32,100,101,108,101,116,101,34,44,34,68,101,108,101,116,101,32,65,108,108,34,41,46, +116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59,125,164,123,69, +46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116, +108,101,58,34,68,101,108,101,116,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41, +162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,61,91,93,59,115,97,118,101,65,110,100,82,101, +108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118, +97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,115,104,111,119,77,97,105,110,77,101,110,117,40, +41,59,255,255,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,17,102, 102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17,17,102,102,102, @@ -2600,7 +2910,7 @@ const char jsfStorageInitialContents[] = { 108,111,97,100,40,41,59,255,171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110,97,109,101,34,58,34,65,108, 97,114,109,115,34,44,34,115,114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106,115,34,44,34,105,99,111,110, -34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,55,34,44,34, +34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,51,49,34,44,34, 116,97,103,115,34,58,34,116,111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116,34,44,34,102,105,108,101,115, 34,58,34,97,108,97,114,109,46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46,106,115,44,97,108,97,114,109, 46,105,109,103,44,97,108,97,114,109,46,119,105,100,46,106,115,34,125,255, diff --git a/scripts/build_docs.py b/scripts/build_docs.py index 92cdac9cbe..c489c495e8 100755 --- a/scripts/build_docs.py +++ b/scripts/build_docs.py @@ -76,7 +76,7 @@ def html(s): htmlFile.write(s+"\n"); def htmlify(d,current): - d = markdown.markdown(d, extensions=['urlize'], tab_length=2) + d = markdown.markdown(d, extensions=['mdx_urlize'], tab_length=2) # replace with newlines with pre idx = d.find("") end = d.find("", idx) diff --git a/src/jsutils.h b/src/jsutils.h index 9cb8d733c1..b39939dec0 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -26,9 +26,9 @@ #include #ifndef BUILDNUMBER -#define JS_VERSION "2v13" +#define JS_VERSION "2v14" #else -#define JS_VERSION "2v13." BUILDNUMBER +#define JS_VERSION "2v14." BUILDNUMBER #endif /* In code: From d583645061aa25918eb371d5379127c987faf9c3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 14 Jun 2022 19:18:02 +0100 Subject: [PATCH 0132/1183] docs - for https://github.com/espruino/BangleApps/issues/1958 --- ChangeLog | 2 +- libs/banglejs/jswrap_bangle.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7c8edbf4f4..fca3d95051 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ - Bangle.js2: Fix issue with E.showMenu creating a global `s` variable + 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb Bangle.js2: Fix E.showMenu title changing color after scroll down+up *if* a non-standard theme was used diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 7ea3972719..e8b56003bb 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -2026,7 +2026,8 @@ Set internal options used for gestures, etc... * `gestureMinLength` how many samples must a gesture have before we notify about it? default = `10` * `powerSave` after a minute of not being moved, Bangle.js will change the accelerometer poll interval down to 800ms (10x accelerometer samples). On movement it'll be raised to the default 80ms. If `Bangle.setPollInterval` is used this is disabled, and for it to work the poll interval - must be either 80ms or 800ms. default = `true` + must be either 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this, automatic power saving, but will **not** change + the poll interval from what it currently is, so if you desire a specific interval (eg the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` * `lockTimeout` how many milliseconds before the screen locks * `lcdPowerTimeout` how many milliseconds before the screen turns off * `backlightTimeout` how many milliseconds before the screen's backlight turns off From e9698cc7faea003db5a5eeec23e27d3c82a34c7c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 14 Jun 2022 19:19:56 +0100 Subject: [PATCH 0133/1183] doc tweak - for https://github.com/espruino/BangleApps/issues/1958 --- libs/banglejs/jswrap_bangle.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index e8b56003bb..92c2d3efbd 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -2026,8 +2026,9 @@ Set internal options used for gestures, etc... * `gestureMinLength` how many samples must a gesture have before we notify about it? default = `10` * `powerSave` after a minute of not being moved, Bangle.js will change the accelerometer poll interval down to 800ms (10x accelerometer samples). On movement it'll be raised to the default 80ms. If `Bangle.setPollInterval` is used this is disabled, and for it to work the poll interval - must be either 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this, automatic power saving, but will **not** change - the poll interval from what it currently is, so if you desire a specific interval (eg the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` + must be either 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this automatic power saving, but will **not** change + the poll interval from its current value. If you desire a specific interval (eg the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` + after setting `powerSave:false`. * `lockTimeout` how many milliseconds before the screen locks * `lcdPowerTimeout` how many milliseconds before the screen turns off * `backlightTimeout` how many milliseconds before the screen's backlight turns off From e03e37ff30667a8ede02418af776903ae49ee625 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Jun 2022 12:49:16 +0100 Subject: [PATCH 0134/1183] Fix issue where `E.toJS("\0"+"0") == '"\00"'` which is just `"\0"` --- ChangeLog | 2 ++ src/jsutils.c | 7 ++++--- src/jsutils.h | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index fca3d95051..8e6f9a0ee2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ + Fix issue where `E.toJS("\0"+"0") == '"\00"'` which is just `"\0"` + 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu Bangle.js2: Double input buffer size from 1kb to 2kb diff --git a/src/jsutils.c b/src/jsutils.c index abba121947..0b9bc5840f 100644 --- a/src/jsutils.c +++ b/src/jsutils.c @@ -69,7 +69,7 @@ char charToLowerCase(char ch) { /** escape a character - if it is required. This may return a reference to a static array, so you can't store the value it returns in a variable and call it again. If jsonStyle=true, only string escapes supported by JSON are used */ -const char *escapeCharacter(char ch, bool jsonStyle) { +const char *escapeCharacter(char ch, char nextCh, bool jsonStyle) { if (ch=='\b') return "\\b"; // 8 if (ch=='\t') return "\\t"; // 9 if (ch=='\n') return "\\n"; // A @@ -80,7 +80,7 @@ const char *escapeCharacter(char ch, bool jsonStyle) { if (ch=='"') return "\\\""; static char buf[7]; unsigned char uch = (unsigned char)ch; - if (uch<8 && !jsonStyle) { + if (uch<8 && !jsonStyle && (nextCh<'0' || nextCh>'7')) { // encode less than 8 as \# buf[0]='\\'; buf[1] = (char)('0'+uch); @@ -811,8 +811,9 @@ void vcbprintf( // OPT: this could be faster than it is (sending whole blocks at once) while (jsvStringIteratorHasChar(&it)) { buf[0] = jsvStringIteratorGetCharAndNext(&it); + char nextCh = jsvStringIteratorGetChar(&it); if (quoted) { - user_callback(escapeCharacter(buf[0], isJSONStyle), user_data); + user_callback(escapeCharacter(buf[0], nextCh, isJSONStyle), user_data); } else { user_callback(buf,user_data); } diff --git a/src/jsutils.h b/src/jsutils.h index b39939dec0..020f1b7458 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -423,8 +423,9 @@ char charToLowerCase(char ch); /** escape a character - if it is required. This may return a reference to a static array, so you can't store the value it returns in a variable and call it again. -If jsonStyle=true, only string escapes supported by JSON are used */ -const char *escapeCharacter(char ch, bool jsonStyle); +If jsonStyle=true, only string escapes supported by JSON are used. 'nextCh' is needed +to ensure that certain escape combinations are avoided. For instance "\0" + "0" is NOT "\00" */ +const char *escapeCharacter(char ch, char nextCh, bool jsonStyle); /** Parse radix prefixes, or return 0 */ int getRadix(const char **s, bool *hasError); /// Convert a character to the hexadecimal equivalent (or -1) From 2687667e686a2c7d4d3691f7d056f11cce8e69ff Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Jun 2022 13:05:56 +0100 Subject: [PATCH 0135/1183] Fix issue accessing `arguments` after/inside 'let/const' keyword (fix #2224) --- ChangeLog | 1 + src/jswrap_functions.c | 7 ++++++- tests/test_let_scoping.js | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 8e6f9a0ee2..223c51d82b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ Fix issue where `E.toJS("\0"+"0") == '"\00"'` which is just `"\0"` + Fix issue accessing `arguments` after/inside 'let/const' keyword (fix #2224) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jswrap_functions.c b/src/jswrap_functions.c index 8a384d9b82..1565adcbff 100644 --- a/src/jswrap_functions.c +++ b/src/jswrap_functions.c @@ -47,8 +47,13 @@ Normal JavaScript interpreters would return `0` in the above case. extern JsExecInfo execInfo; JsVar *jswrap_arguments() { JsVar *scope = 0; - if (execInfo.scopesVar) +#ifdef ESPR_NO_LET_SCOPING + if (execInfo.scopesVar) // if no let scoping, the top of the scopes list is the function scope = jsvGetLastArrayItem(execInfo.scopesVar); +#else + if (execInfo.baseScope) // if let scoping, the top of the scopes list may just be a scope. Use baseScope instead + scope = jsvLockAgain(execInfo.baseScope); +#endif if (!jsvIsFunction(scope)) { jsExceptionHere(JSET_ERROR, "Can only use 'arguments' variable inside a function"); return 0; diff --git a/tests/test_let_scoping.js b/tests/test_let_scoping.js index 774b7ee8e6..9ef18bd84a 100644 --- a/tests/test_let_scoping.js +++ b/tests/test_let_scoping.js @@ -48,6 +48,16 @@ function test3() { } test3(); + +// https://github.com/espruino/Espruino/issues/2224 +function pushCommand(command) { + let hash = print(arguments); // fails + var hash2 = print(arguments); // works + print(arguments); // works + results.push(true); +} +pushCommand("Hello") + console.log("Results:",results); result = results.every(r=>r); From 75f392af06a2733ee0f5cf4728ef5a8b57c1fcf1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Jun 2022 13:25:10 +0100 Subject: [PATCH 0136/1183] let/const now don't add a scope if executed in a function outside a block (fix #2225) When executing a function, ensure the scope doesn't include a `return` var Rename internal return var to fit it inside one JsVar on embedded systems --- ChangeLog | 3 +++ src/jsparse.c | 16 ++++++++++++---- src/jsutils.h | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 223c51d82b..a5f0cc35de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ Fix issue where `E.toJS("\0"+"0") == '"\00"'` which is just `"\0"` Fix issue accessing `arguments` after/inside 'let/const' keyword (fix #2224) + let/const now don't add a scope if executed in a function outside a block (fix #2225) + When executing a function, ensure the scope doesn't include a `return` var + Rename internal return var to fit it inside one JsVar on embedded systems 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jsparse.c b/src/jsparse.c index 9e2315063e..ec666528b4 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -760,12 +760,13 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t } // add the function's execute space to the symbol table so we can recurse if (jspeiAddScope(functionRoot)) { + /* Adding scope may have failed - we may have descended too deep - so be sure + * not to pull somebody else's scope off */ #ifndef ESPR_NO_LET_SCOPING JsVar *oldBaseScope = execInfo.baseScope; + uint8_t oldBlockCount = execInfo.blockCount; execInfo.baseScope = functionRoot; - /* Adding scope may have failed - we may have descended too deep - so be sure - * not to pull somebody else's scope off - */ + execInfo.blockCount = 0; #endif JsVar *oldThisVar = execInfo.thisVar; @@ -823,13 +824,19 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t // setup a return variable JsVar *returnVarName = jsvAddNamedChild(functionRoot, 0, JSPARSE_RETURN_VAR); // parse the whole block +#ifndef ESPR_NO_LET_SCOPING + execInfo.blockCount--; // jspeBlockNoBrackets immediately increments the block count +#endif jspeBlockNoBrackets(); +#ifndef ESPR_NO_LET_SCOPING + execInfo.blockCount++; // jspeBlockNoBrackets decrements the block count after +#endif /* get the real return var before we remove it from our function. * We can unlock below because returnVarName is still part of * functionRoot, so won't get freed. */ returnVar = jsvSkipNameAndUnLock(returnVarName); if (returnVarName) // could have failed with out of memory - jsvSetValueOfName(returnVarName, 0); // remove return value (which helps stops circular references) + jsvRemoveChild(functionRoot, returnVarName); // remove return value (helps stops circular references, saves RAM) } // Store a stack trace if we had an error JsExecFlags hasError = execInfo.execute&EXEC_ERROR_MASK; @@ -875,6 +882,7 @@ NO_INLINE JsVar *jspeFunctionCall(JsVar *function, JsVar *functionName, JsVar *t #ifndef ESPR_NO_LET_SCOPING jspeiRemoveScope(); execInfo.baseScope = oldBaseScope; + execInfo.blockCount = oldBlockCount; #endif } diff --git a/src/jsutils.h b/src/jsutils.h index 020f1b7458..5bb4b09815 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -306,7 +306,7 @@ typedef int64_t JsSysTime; #endif // javascript specific names -#define JSPARSE_RETURN_VAR "return" // variable name used for returning function results +#define JSPARSE_RETURN_VAR JS_HIDDEN_CHAR_STR"rtn" // variable name used for returning function results #define JSPARSE_PROTOTYPE_VAR "prototype" #define JSPARSE_CONSTRUCTOR_VAR "constructor" #define JSPARSE_INHERITS_VAR "__proto__" From 5c08b7c33491ca0e6d87752d4366b17467f90057 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Jun 2022 16:54:08 +0100 Subject: [PATCH 0137/1183] Initial support for multiple connections on nRF52 --- libs/bluetooth/bluetooth.h | 35 ++-- libs/bluetooth/bluetooth_utils.h | 3 +- libs/bluetooth/jswrap_bluetooth.c | 140 ++++++++++---- libs/bluetooth/jswrap_bluetooth.h | 40 ++-- targets/esp32/BLE/esp32_gattc_func.c | 6 +- targets/esp32/bluetooth.c | 28 +-- targets/nrf5x/bluetooth.c | 277 +++++++++++++++------------ 7 files changed, 325 insertions(+), 204 deletions(-) diff --git a/libs/bluetooth/bluetooth.h b/libs/bluetooth/bluetooth.h index c4a84f25c8..b9ea8ed22a 100644 --- a/libs/bluetooth/bluetooth.h +++ b/libs/bluetooth/bluetooth.h @@ -134,10 +134,10 @@ typedef enum { BLEP_DISCONNECTED, //< Peripheral disconnected BLEP_RSSI_PERIPH, //< RSSI data from peripheral connection (rssi as data) BLEP_ADV_REPORT, //< Advertising received (as buffer) - BLEP_RSSI_CENTRAL, //< RSSI data from central connection (rssi as data) + BLEP_RSSI_CENTRAL, //< RSSI data from central connection (rssi as data low byte, index in m_central_conn_handles as high byte ) BLEP_TASK_FAIL_CONN_TIMEOUT, //< Central: Connection timeout BLEP_TASK_FAIL_DISCONNECTED, //< Central: Task failed because disconnected - BLEP_TASK_CENTRAL_CONNECTED, //< Central: Connected + BLEP_TASK_CENTRAL_CONNECTED, //< Central: Connected, (m_central_conn_handles index as data) BLEP_TASK_DISCOVER_SERVICE, //< New service discovered (as buffer) BLEP_TASK_DISCOVER_SERVICE_COMPLETE, //< Service discovery complete BLEP_TASK_DISCOVER_CHARACTERISTIC, //< New characteristic discovered (as buffer) @@ -146,7 +146,7 @@ typedef enum { BLEP_TASK_CHARACTERISTIC_READ, //< Central: Characteristic read finished (as buffer) BLEP_TASK_CHARACTERISTIC_WRITE, //< Central: Characteristic write finished BLEP_TASK_CHARACTERISTIC_NOTIFY, //< Central: Started requesting notifications - BLEP_CENTRAL_DISCONNECTED, //< Central: Disconnected (reason as data) + BLEP_CENTRAL_DISCONNECTED, //< Central: Disconnected (reason as data low byte, index in m_central_conn_handles as high byte ) BLEP_TASK_BONDING, //< Bonding negotiation complete (success in data) BLEP_NFC_STATUS, //< NFC changed state BLEP_NFC_RX, //< NFC data received (as buffer) @@ -155,8 +155,8 @@ typedef enum { BLEP_HID_VALUE, //< A HID value was received (eg caps lock) BLEP_WRITE, //< One of our characteristics written by someone else BLEP_NOTIFICATION, //< A characteristic we were watching has changes - BLEP_TASK_PASSKEY_DISPLAY, //< We're pairing and have been provided with a passkey to display - BLEP_TASK_AUTH_KEY_REQUEST, //< We're pairing and the device wants a passkey from us + BLEP_TASK_PASSKEY_DISPLAY, //< We're pairing and have been provided with a passkey to display (data = conn_handle) + BLEP_TASK_AUTH_KEY_REQUEST, //< We're pairing and the device wants a passkey from us (data = conn_handle) BLEP_TASK_AUTH_STATUS, //< Data on how authentication was going has been received #ifdef ESPR_BLUETOOTH_ANCS BLEP_ANCS_NOTIF, //< Apple Notification Centre notification received @@ -173,7 +173,7 @@ extern volatile BLEStatus bleStatus; extern uint16_t bleAdvertisingInterval; /**< The advertising interval (in units of 0.625 ms). */ extern volatile uint16_t m_peripheral_conn_handle; /**< Handle of the current connection. */ #if CENTRAL_LINK_COUNT>0 -extern volatile uint16_t m_central_conn_handle; /**< Handle for central mode connection */ +extern volatile uint16_t m_central_conn_handles[CENTRAL_LINK_COUNT]; /**< Handle for central mode connection */ #endif @@ -203,6 +203,9 @@ bool jsble_has_connection(); /** Is BLE connected to a central device at all? */ bool jsble_has_central_connection(); +/** Return the index of the central connection in m_central_conn_handles, or -1 */ +bool jsble_get_central_connection_idx(uint16_t handle); + /** Is BLE connected to a server device at all (eg, the simple, 'slave' mode)? */ bool jsble_has_peripheral_connection(); @@ -301,25 +304,25 @@ void jsble_nfc_send_rsp(const uint8_t data, size_t len); See BluetoothRemoteGATTServer.connect docs for more docs */ void jsble_central_connect(ble_gap_addr_t peer_addr, JsVar *options); /// Get primary services. Filter by UUID unless UUID is invalid, in which case return all. When done call bleCompleteTask -void jsble_central_getPrimaryServices(ble_uuid_t uuid); +void jsble_central_getPrimaryServices(uint16_t central_conn_handle, ble_uuid_t uuid); /// Get characteristics. Filter by UUID unless UUID is invalid, in which case return all. When done call bleCompleteTask -void jsble_central_getCharacteristics(JsVar *service, ble_uuid_t uuid); +void jsble_central_getCharacteristics(uint16_t central_conn_handle, JsVar *service, ble_uuid_t uuid); // Write data to the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicWrite(JsVar *characteristic, char *dataPtr, size_t dataLen); +void jsble_central_characteristicWrite(uint16_t central_conn_handle, JsVar *characteristic, char *dataPtr, size_t dataLen); // Read data from the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicRead(JsVar *characteristic); +void jsble_central_characteristicRead(uint16_t central_conn_handle, JsVar *characteristic); // Discover descriptors of characteristic -void jsble_central_characteristicDescDiscover(JsVar *characteristic); +void jsble_central_characteristicDescDiscover(uint16_t central_conn_handle, JsVar *characteristic); // Set whether to notify on the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicNotify(JsVar *characteristic, bool enable); +void jsble_central_characteristicNotify(uint16_t central_conn_handle, JsVar *characteristic, bool enable); /// Start bonding on the current central connection -void jsble_central_startBonding(bool forceRePair); +void jsble_central_startBonding(uint16_t central_conn_handle, bool forceRePair); /// Get the security status of the current link -JsVar *jsble_central_getSecurityStatus(); +JsVar *jsble_central_getSecurityStatus(uint16_t central_conn_handle); /// RSSI monitoring in central mode -uint32_t jsble_set_central_rssi_scan(bool enabled); +uint32_t jsble_set_central_rssi_scan(uint16_t central_conn_handle, bool enabled); /// Send a passkey if one was requested (passkey = 6 bytes long) -uint32_t jsble_central_send_passkey(char *passkey); +uint32_t jsble_central_send_passkey(uint16_t central_conn_handle, char *passkey); #endif #if PEER_MANAGER_ENABLED /// Set whether or not the whitelist is enabled diff --git a/libs/bluetooth/bluetooth_utils.h b/libs/bluetooth/bluetooth_utils.h index 7f7120313c..bae67b24dd 100644 --- a/libs/bluetooth/bluetooth_utils.h +++ b/libs/bluetooth/bluetooth_utils.h @@ -29,7 +29,8 @@ #define BLE_NAME_HID_DATA "BLE_HID_D" #define BLE_NAME_NUS "BLE_UART" #define BLE_NAME_FLAGS "BLE_FLAGS" -#define BLE_NAME_GATT_SERVER "BLE_GATTS" +#define BLE_NAME_GATT_SERVER "BLE_GATTSx" // x is replaced with the index in m_central_conn_handles +#define BLE_NAME_GATT_SERVER_LEN 11 // include null terminator #define BLE_NAME_SECURITY "BLE_SEC" #define BLE_NAME_MAC_ADDRESS "BLE_MAC" #if ESPR_BLUETOOTH_ANCS diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index fe1353be86..3242a407dc 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -62,6 +62,7 @@ JsVar *blePromise = 0; JsVar *bleTaskInfo = 0; +JsVar *bleTaskInfo2 = 0; BleTask bleTask = BLETASK_NONE; /// Get the string value of the given task @@ -101,10 +102,11 @@ bool bleNewTask(BleTask task, JsVar *taskInfo) { jsiConsolePrintf("Existing bleTaskInfo!\n"); jsvTrace(bleTaskInfo,2); }*/ - assert(!blePromise && !bleTaskInfo); + assert(!blePromise && !bleTaskInfo && !bleTaskInfo2); blePromise = jspromise_create(); bleTask = task; bleTaskInfo = jsvLockAgainSafe(taskInfo); + bleTaskInfo2 = NULL; return true; } @@ -123,6 +125,8 @@ void bleCompleteTask(BleTask task, bool ok, JsVar *data) { } jsvUnLock(bleTaskInfo); bleTaskInfo = 0; + jsvUnLock(bleTaskInfo2); + bleTaskInfo2 = 0; jshHadEvent(); } @@ -147,14 +151,46 @@ void bleSwitchTask(BleTask task) { // ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------ #ifdef NRF52_SERIES -void bleSetActiveBluetoothGattServer(JsVar *var) { - jsvObjectSetChild(execInfo.hiddenRoot, BLE_NAME_GATT_SERVER, var); +void bleSetActiveBluetoothGattServer(int idx, JsVar *var) { + assert(idx >=0 && idx < CENTRAL_LINK_COUNT); + if (idx<0) return; + char name[BLE_NAME_GATT_SERVER_LEN] = BLE_NAME_GATT_SERVER; + name[BLE_NAME_GATT_SERVER_LEN-2] = '0'+idx; + jsvObjectSetChild(execInfo.hiddenRoot, name, var); } -JsVar *bleGetActiveBluetoothGattServer() { - return jsvObjectGetChild(execInfo.hiddenRoot, BLE_NAME_GATT_SERVER, 0); +JsVar *bleGetActiveBluetoothGattServer(int idx) { + assert(idx < CENTRAL_LINK_COUNT); + if (idx<0) return 0; + char name[BLE_NAME_GATT_SERVER_LEN] = BLE_NAME_GATT_SERVER; + name[BLE_NAME_GATT_SERVER_LEN-2] = '0'+idx; + return jsvObjectGetChild(execInfo.hiddenRoot, name, 0); } #endif + +uint16_t jswrap_ble_BluetoothRemoteGATTServer_getHandle(JsVar *parent) { + JsVar *handle = jsvObjectGetChild(parent, "handle", 0); + if (!jsvIsInt(handle)) return BLE_CONN_HANDLE_INVALID; + return jsvGetIntegerAndUnLock(handle); +} +uint16_t jswrap_ble_BluetoothDevice_getHandle(JsVar *parent) { + JsVar *gatt = jswrap_BluetoothDevice_gatt(parent); + uint16_t handle = BLE_CONN_HANDLE_INVALID; + if (gatt) handle = jswrap_ble_BluetoothRemoteGATTServer_getHandle(gatt); + return handle; +} +uint16_t jswrap_ble_BluetoothRemoteGATTService_getHandle(JsVar *parent) { + JsVar *device = jsvObjectGetChild(parent, "device", 0); + uint16_t handle = BLE_CONN_HANDLE_INVALID; + if (device) handle = jswrap_ble_BluetoothDevice_getHandle(device); + return handle; +} +uint16_t jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(JsVar *parent) { + JsVar *service = jsvObjectGetChild(parent, "service", 0); + uint16_t handle = BLE_CONN_HANDLE_INVALID; + if (service) handle = jswrap_ble_BluetoothRemoteGATTService_getHandle(service); + return handle; +} // ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------ @@ -247,15 +283,17 @@ void jswrap_ble_kill() { blePromise = 0; if (bleTaskInfo) jsvUnLock(bleTaskInfo); bleTaskInfo = 0; + if (bleTaskInfo2) jsvUnLock(bleTaskInfo2); + bleTaskInfo2 = 0; // if we were scanning, make sure we stop jsble_set_scanning(false, false); jsble_set_rssi_scan(false); #if CENTRAL_LINK_COUNT>0 // if we were connected to something, disconnect - if (jsble_has_central_connection()) { - jsble_disconnect(m_central_conn_handle); - } + for (int i=0;i0 uint32_t err_code; - if (m_central_conn_handle != BLE_CONN_HANDLE_INVALID) { + uint16_t central_conn_handle = jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent); + if (central_conn_handle != BLE_CONN_HANDLE_INVALID) { // we have a connection, disconnect JsVar *promise = 0; if (bleNewTask(BLETASK_DISCONNECT, parent/*BluetoothRemoteGATTServer*/)) promise = jsvLockAgainSafe(blePromise); - err_code = jsble_disconnect(m_central_conn_handle); + err_code = jsble_disconnect(central_conn_handle); jsble_check_error(err_code); return promise; } else { @@ -3684,7 +3731,7 @@ JsVar *jswrap_ble_BluetoothRemoteGATTServer_startBonding(JsVar *parent, bool for #if CENTRAL_LINK_COUNT>0 if (bleNewTask(BLETASK_BONDING, parent/*BluetoothRemoteGATTServer*/)) { JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_startBonding(forceRePair); + jsble_central_startBonding(jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent), forceRePair); return promise; } return 0; @@ -3724,7 +3771,7 @@ specifically for Puck.js. */ JsVar *jswrap_ble_BluetoothRemoteGATTServer_getSecurityStatus(JsVar *parent) { #if CENTRAL_LINK_COUNT>0 - return jsble_get_security_status(m_central_conn_handle); + return jsble_get_security_status(jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent)); #else jsExceptionHere(JSET_ERROR, "Unimplemented"); return 0; @@ -3748,8 +3795,12 @@ JsVar *jswrap_BluetoothRemoteGATTServer_getPrimaryService(JsVar *parent, JsVar * const char *err; ble_uuid_t uuid; - if (!bleNewTask(BLETASK_PRIMARYSERVICE, 0)) + JsVar *device = jsvObjectGetChild(parent, "device", 0); + bool ok = bleNewTask(BLETASK_PRIMARYSERVICE, device/*BluetoothDevice*/); + jsvUnLock(device); + if (!ok) { return 0; + } err = bleVarToUUID(&uuid, service); if (err) { @@ -3758,7 +3809,7 @@ JsVar *jswrap_BluetoothRemoteGATTServer_getPrimaryService(JsVar *parent, JsVar * } JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_getPrimaryServices(uuid); + jsble_central_getPrimaryServices(jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent), uuid); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3780,10 +3831,14 @@ JsVar *jswrap_BluetoothRemoteGATTServer_getPrimaryServices(JsVar *parent) { ble_uuid_t uuid; uuid.type = BLE_UUID_TYPE_UNKNOWN; - if (!bleNewTask(BLETASK_PRIMARYSERVICE, 0)) + JsVar *device = jsvObjectGetChild(parent, "device", 0); + bool ok = bleNewTask(BLETASK_PRIMARYSERVICE, device/*BluetoothDevice*/); + jsvUnLock(device); + if (!ok) return 0; + JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_getPrimaryServices(uuid); + jsble_central_getPrimaryServices(jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent), uuid); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3822,7 +3877,7 @@ void jswrap_BluetoothRemoteGATTServer_setRSSIHandler(JsVar *parent, JsVar *callb if (!jsvIsFunction(callback)) callback=0; jsvObjectSetChild(parent, BLE_RSSI_EVENT, callback); // either start or stop scanning - uint32_t err_code = jsble_set_central_rssi_scan(callback != 0); + uint32_t err_code = jsble_set_central_rssi_scan(jswrap_ble_BluetoothRemoteGATTServer_getHandle(parent), callback != 0); jsble_check_error(err_code); #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3839,6 +3894,15 @@ Web Bluetooth-style GATT service - get this using `BluetoothRemoteGATTServer.get https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattservice */ +/*JSON{ + "type" : "property", + "class" : "BluetoothRemoteGATTService", + "name" : "device", + "ifdef" : "NRF52_SERIES", + "generate" : false, + "return" : ["JsVar", "The `BluetoothDevice` this Service came from" ] +} +*//*Documentation only*/ /*JSON{ "type" : "method", "class" : "BluetoothRemoteGATTService", @@ -3856,7 +3920,7 @@ JsVar *jswrap_BluetoothRemoteGATTService_getCharacteristic(JsVar *parent, JsVar const char *err; ble_uuid_t uuid; - if (!bleNewTask(BLETASK_CHARACTERISTIC, 0)) + if (!bleNewTask(BLETASK_CHARACTERISTIC, parent/*BluetoothRemoteGATTService*/)) return 0; err = bleVarToUUID(&uuid, characteristic); @@ -3866,7 +3930,7 @@ JsVar *jswrap_BluetoothRemoteGATTService_getCharacteristic(JsVar *parent, JsVar } JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_getCharacteristics(parent, uuid); + jsble_central_getCharacteristics(jswrap_ble_BluetoothRemoteGATTService_getHandle(parent), parent, uuid); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3888,11 +3952,11 @@ JsVar *jswrap_BluetoothRemoteGATTService_getCharacteristics(JsVar *parent) { ble_uuid_t uuid; uuid.type = BLE_UUID_TYPE_UNKNOWN; - if (!bleNewTask(BLETASK_CHARACTERISTIC, 0)) + if (!bleNewTask(BLETASK_CHARACTERISTIC, parent/*BluetoothRemoteGATTService*/)) return 0; JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_getCharacteristics(parent, uuid); + jsble_central_getCharacteristics(jswrap_ble_BluetoothRemoteGATTService_getHandle(parent), parent, uuid); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3909,6 +3973,15 @@ Web Bluetooth-style GATT characteristic - get this using `BluetoothRemoteGATTSer https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattcharacteristic */ +/*JSON{ + "type" : "property", + "class" : "BluetoothRemoteGATTCharacteristic", + "name" : "service", + "ifdef" : "NRF52_SERIES", + "generate" : false, + "return" : ["JsVar", "The `BluetoothRemoteGATTService` this Service came from" ] +} +*//*Documentation only*/ /*JSON{ "type" : "method", "class" : "BluetoothRemoteGATTCharacteristic", @@ -3950,7 +4023,7 @@ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_writeValue(JsVar *characteri return 0; JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_characteristicWrite(characteristic, dataPtr, dataLen); + jsble_central_characteristicWrite(jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(characteristic), characteristic, dataPtr, dataLen); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -3989,11 +4062,11 @@ NRF.connect(device_address).then(function(d) { */ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_readValue(JsVar *characteristic) { #if CENTRAL_LINK_COUNT>0 - if (!bleNewTask(BLETASK_CHARACTERISTIC_READ, characteristic)) + if (!bleNewTask(BLETASK_CHARACTERISTIC_READ, characteristic/*BluetoothRemoteGATTCharacteristic*/)) return 0; JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_characteristicRead(characteristic); + jsble_central_characteristicRead(jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(characteristic), characteristic); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); @@ -4055,6 +4128,7 @@ NRF.connect("pu:ck:js:ad:dr:es random").then(function(g) { */ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_startNotifications(JsVar *characteristic) { #if CENTRAL_LINK_COUNT>0 + uint16_t central_conn_handle = jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(characteristic); // Set our characteristic's handle up in the list of handles to notify for // TODO: What happens when we close the connection and re-open another? @@ -4070,16 +4144,16 @@ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_startNotifications(JsVar *ch // Check for existing cccd_handle JsVar *cccdVar = jsvObjectGetChild(characteristic,"handle_cccd", 0); if ( !cccdVar ) { // if it doesn't exist, try and find it - if (!bleNewTask(BLETASK_CHARACTERISTIC_DESC_AND_STARTNOTIFY, characteristic)) + if (!bleNewTask(BLETASK_CHARACTERISTIC_DESC_AND_STARTNOTIFY, characteristic/*BluetoothRemoteGATTCharacteristic*/)) return 0; promise = jsvLockAgainSafe(blePromise); - jsble_central_characteristicDescDiscover(characteristic); + jsble_central_characteristicDescDiscover(central_conn_handle, characteristic); } else { jsvUnLock(cccdVar); - if (!bleNewTask(BLETASK_CHARACTERISTIC_NOTIFY, 0)) + if (!bleNewTask(BLETASK_CHARACTERISTIC_NOTIFY, characteristic/*BluetoothRemoteGATTCharacteristic*/)) return 0; promise = jsvLockAgainSafe(blePromise); - jsble_central_characteristicNotify(characteristic, true); + jsble_central_characteristicNotify(central_conn_handle, characteristic, true); } return promise; #else @@ -4101,6 +4175,8 @@ Stop notifications (that were requested with `BluetoothRemoteGATTCharacteristic. */ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_stopNotifications(JsVar *characteristic) { #if CENTRAL_LINK_COUNT>0 + uint16_t central_conn_handle = jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(characteristic); + // Remove our characteristic handle from the list of handles to notify for uint16_t handle = (uint16_t)jsvGetIntegerAndUnLock(jsvObjectGetChild(characteristic, "handle_value", 0)); JsVar *handles = jsvObjectGetChild(execInfo.hiddenRoot, "bleHdl", JSV_ARRAY); @@ -4109,7 +4185,7 @@ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_stopNotifications(JsVar *cha jsvUnLock(handles); } JsVar *promise = jsvLockAgainSafe(blePromise); - jsble_central_characteristicNotify(characteristic, false); + jsble_central_characteristicNotify(central_conn_handle, characteristic, false); return promise; #else jsExceptionHere(JSET_ERROR, "Unimplemented"); diff --git a/libs/bluetooth/jswrap_bluetooth.h b/libs/bluetooth/jswrap_bluetooth.h index a8e9226021..6fac3f4390 100644 --- a/libs/bluetooth/jswrap_bluetooth.h +++ b/libs/bluetooth/jswrap_bluetooth.h @@ -16,22 +16,22 @@ // ------------------------------------------------------------------------------ typedef enum { BLETASK_NONE, - BLETASK_REQUEST_DEVICE, ///< Waiting for requestDevice to finish + BLETASK_REQUEST_DEVICE, ///< Waiting for requestDevice to finish (bleTaskInfo=index of a setTimeout to stop scanning) BLETASK_CENTRAL_START, // =========================================== Start of central tasks - BLETASK_CONNECT = BLETASK_CENTRAL_START, ///< Connect in central mode - BLETASK_DISCONNECT, ///< Disconnect from Central - BLETASK_PRIMARYSERVICE, ///< Find primary service - BLETASK_CHARACTERISTIC, ///< Find characteristics - BLETASK_CHARACTERISTIC_WRITE, ///< Write to a characteristic - BLETASK_CHARACTERISTIC_READ, ///< Read from a characteristic - BLETASK_CHARACTERISTIC_DESC_AND_STARTNOTIFY, ///< Discover descriptors and start notifications - BLETASK_CHARACTERISTIC_NOTIFY, ///< Setting whether notifications are on or off - BLETASK_BONDING, ///< Try and bond in central mode + BLETASK_CONNECT = BLETASK_CENTRAL_START, ///< Connect in central mode (bleTaskInfo=BluetoothRemoteGATTServer) + BLETASK_DISCONNECT, ///< Disconnect from Central (bleTaskInfo=BluetoothRemoteGATTServer) + BLETASK_PRIMARYSERVICE, ///< Find primary service (bleTaskInfo=BluetoothDevice, bleTaskInfo2=populated with list of BluetoothRemoteGATTService) + BLETASK_CHARACTERISTIC, ///< Find characteristics (bleTaskInfo=BluetoothRemoteGATTService, bleTaskInfo2=populated with list of BluetoothRemoteGATTCharacteristic) + BLETASK_CHARACTERISTIC_WRITE, ///< Write to a characteristic (bleTaskInfo=0) + BLETASK_CHARACTERISTIC_READ, ///< Read from a characteristic (bleTaskInfo=BluetoothRemoteGATTCharacteristic) + BLETASK_CHARACTERISTIC_DESC_AND_STARTNOTIFY, ///< Discover descriptors and start notifications (bleTaskInfo=BluetoothRemoteGATTCharacteristic) + BLETASK_CHARACTERISTIC_NOTIFY, ///< Setting whether notifications are on or off (bleTaskInfo=BluetoothRemoteGATTCharacteristic) + BLETASK_BONDING, ///< Try and bond in central mode (bleTaskInfo=BluetoothRemoteGATTServer for central, or 0 for peripheral) BLETASK_CENTRAL_END = BLETASK_CHARACTERISTIC_NOTIFY, // ============= End of central tasks #ifdef ESPR_BLUETOOTH_ANCS - BLETASK_ANCS_NOTIF_ATTR, //< Apple Notification Centre notification attributes - BLETASK_ANCS_APP_ATTR, //< Apple Notification Centre app attributes - BLETASK_AMS_ATTR, //< Apple Media Service track info request + BLETASK_ANCS_NOTIF_ATTR, //< Apple Notification Centre notification attributes (bleTaskInfo=0) + BLETASK_ANCS_APP_ATTR, //< Apple Notification Centre app attributes (bleTaskInfo=appId string) + BLETASK_AMS_ATTR, //< Apple Media Service track info request (bleTaskInfo=0) #endif } BleTask; @@ -49,6 +49,7 @@ typedef enum { #endif extern JsVar *bleTaskInfo; // info related to the current task +extern JsVar *bleTaskInfo2; // info related to the current task const char *bleGetTaskString(BleTask task); bool bleInTask(BleTask task); @@ -61,10 +62,15 @@ void bleCompleteTaskFailAndUnLock(BleTask task, JsVar *data); void bleSwitchTask(BleTask task); #ifdef NRF52_SERIES -// Set the currently active GATT server -void bleSetActiveBluetoothGattServer(JsVar *var); -// Get the currently active GATT server (the return value needs unlocking) -JsVar *bleGetActiveBluetoothGattServer(); +// Set the currently active GATT server based on the index in m_central_conn_handles +void bleSetActiveBluetoothGattServer(int idx, JsVar *var); +// Get the currently active GATT server based on the index in m_central_conn_handles (the return value needs unlocking) +JsVar *bleGetActiveBluetoothGattServer(int idx); + +uint16_t jswrap_ble_BluetoothRemoteGATTServer_getHandle(JsVar *parent); +uint16_t jswrap_ble_BluetoothDevice_getHandle(JsVar *parent); +uint16_t jswrap_ble_BluetoothRemoteGATTService_getHandle(JsVar *parent); +uint16_t jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(JsVar *parent); #endif // ------------------------------------------------------------------------------ diff --git a/targets/esp32/BLE/esp32_gattc_func.c b/targets/esp32/BLE/esp32_gattc_func.c index 5240447af0..57e2548751 100644 --- a/targets/esp32/BLE/esp32_gattc_func.c +++ b/targets/esp32/BLE/esp32_gattc_func.c @@ -53,13 +53,13 @@ void gattc_evt_reg(esp_gatt_if_t gattc_if,esp_ble_gattc_cb_param_t *param){ void gattc_evt_connect(esp_gatt_if_t gattc_if,esp_ble_gattc_cb_param_t *param){ esp_ble_gattc_cb_param_t *p_data = (esp_ble_gattc_cb_param_t *)param; gattc_apps[GATTC_PROFILE].conn_id = p_data->connect.conn_id; - m_central_conn_handle = 0x01; + m_central_conn_handles[0] = 0x01; memcpy(gattc_apps[GATTC_PROFILE].remote_bda, p_data->connect.remote_bda, sizeof(esp_bd_addr_t)); esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req (gattc_if, p_data->connect.conn_id); if (mtu_ret){jsWarn("config MTU error, error code = %x", mtu_ret);} } void gattc_evt_disconnect(esp_gatt_if_t gattc_if,esp_ble_gattc_cb_param_t *param){ - m_central_conn_handle = BLE_GATT_HANDLE_INVALID; + m_central_conn_handles[0] = BLE_GATT_HANDLE_INVALID; } void gattc_evt_cfg_mtu(esp_gatt_if_t gattc_if,esp_ble_gattc_cb_param_t *param){ if (!bleTaskInfo) bleTaskInfo = jsvNewEmptyArray(); @@ -111,7 +111,7 @@ void gattc_reset(){ ret = esp_ble_gattc_app_unregister(gattc_apps[GATTC_PROFILE].gattc_if); if(ret) jsWarn("could not unregister GATTC(%d)\n",ret); } - m_central_conn_handle = BLE_GATT_HANDLE_INVALID; + m_central_conn_handles[0] = BLE_GATT_HANDLE_INVALID; } void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) { diff --git a/targets/esp32/bluetooth.c b/targets/esp32/bluetooth.c index be65a28099..5725a6f7c0 100644 --- a/targets/esp32/bluetooth.c +++ b/targets/esp32/bluetooth.c @@ -34,8 +34,8 @@ volatile BLEStatus bleStatus; uint16_t bleAdvertisingInterval; /**< The advertising interval (in units of 0.625 ms). */ -volatile uint16_t m_peripheral_conn_handle; /**< Handle of the current connection. */ -volatile uint16_t m_central_conn_handle; /**< Handle of central mode connection */ +volatile uint16_t m_peripheral_conn_handle; /**< Handle of the current connection. */ +volatile uint16_t m_central_conn_handles[1]; /**< Handle of central mode connection */ /** Initialise the BLE stack */ void jsble_init(){ @@ -110,7 +110,7 @@ void jsble_advertising_stop(){ /** Is BLE connected to any device at all? */ bool jsble_has_connection(){ #if CENTRAL_LINK_COUNT>0 - return (m_central_conn_handle != BLE_GATT_HANDLE_INVALID) || + return (m_central_conn_handles[0] != BLE_GATT_HANDLE_INVALID) || (m_peripheral_conn_handle != BLE_GATT_HANDLE_INVALID); #else return m_peripheral_conn_handle != BLE_GATT_HANDLE_INVALID; @@ -120,7 +120,7 @@ bool jsble_has_connection(){ /** Is BLE connected to a central device at all? */ bool jsble_has_central_connection(){ #if CENTRAL_LINK_COUNT>0 - return (m_central_conn_handle != BLE_GATT_HANDLE_INVALID); + return (m_central_conn_handles[0] != BLE_GATT_HANDLE_INVALID); #else return false; #endif @@ -180,47 +180,47 @@ void jsble_central_connect(ble_gap_addr_t peer_addr, JsVar *options){ gattc_connect(peer_addr.addr); } /// Get primary services. Filter by UUID unless UUID is invalid, in which case return all. When done call bleCompleteTask -void jsble_central_getPrimaryServices(ble_uuid_t uuid){ +void jsble_central_getPrimaryServices(uint16_t central_conn_handle, ble_uuid_t uuid){ gattc_searchService(uuid); } /// Get characteristics. Filter by UUID unless UUID is invalid, in which case return all. When done call bleCompleteTask -void jsble_central_getCharacteristics(JsVar *service, ble_uuid_t uuid){ +void jsble_central_getCharacteristics(uint16_t central_conn_handle, JsVar *service, ble_uuid_t uuid){ gattc_getCharacteristic(uuid); UNUSED(service); } // Write data to the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicWrite(JsVar *characteristic, char *dataPtr, size_t dataLen){ +void jsble_central_characteristicWrite(uint16_t central_conn_handle, JsVar *characteristic, char *dataPtr, size_t dataLen){ uint16_t handle = jsvGetIntegerAndUnLock(jsvObjectGetChild(characteristic, "handle_value", 0)); gattc_writeValue(handle,dataPtr,dataLen); } // Read data from the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicRead(JsVar *characteristic){ +void jsble_central_characteristicRead(uint16_t central_conn_handle, JsVar *characteristic){ uint16_t handle = jsvGetIntegerAndUnLock(jsvObjectGetChild(characteristic, "handle_value", 0)); gattc_readValue(handle); } // Discover descriptors of characteristic -void jsble_central_characteristicDescDiscover(JsVar *characteristic){ +void jsble_central_characteristicDescDiscover(uint16_t central_conn_handle, JsVar *characteristic){ jsWarn("Central characteristicDescDiscover not implemented yet\n"); UNUSED(characteristic); } // Set whether to notify on the given characteristic. When done call bleCompleteTask -void jsble_central_characteristicNotify(JsVar *characteristic, bool enable){ +void jsble_central_characteristicNotify(uint16_t central_conn_handle, JsVar *characteristic, bool enable){ jsWarn("central characteristic notify not implemented yet\n"); UNUSED(characteristic); UNUSED(enable); } /// Start bonding on the current central connection -void jsble_central_startBonding(bool forceRePair){ +void jsble_central_startBonding(uint16_t central_conn_handle, bool forceRePair){ jsWarn("central start bonding not implemented yet\n"); UNUSED(forceRePair); } /// RSSI monitoring in central mode -uint32_t jsble_set_central_rssi_scan(bool enabled){ +uint32_t jsble_set_central_rssi_scan(uint16_t central_conn_handle, bool enabled){ jsWarn("central set rssi scan not implemented yet\n"); return 0; } // Set whether or not the whitelist is enabled -void jsble_central_setWhitelist(bool whitelist){ +void jsble_central_setWhitelist(uint16_t central_conn_handle, bool whitelist){ jsWarn("central set Whitelist not implemented yet\n"); return 0; } @@ -238,7 +238,7 @@ void jsble_set_tx_power(int8_t pwr) { jsWarn("jsble_set_tx_power not implemented yet\n"); } -uint32_t jsble_central_send_passkey(char *passkey) { +uint32_t jsble_central_send_passkey(uint16_t central_conn_handle, char *passkey) { jsWarn("central set Whitelist not implemented yet\n"); return 0; } diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index c33b2948f9..d3dd3fd349 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -176,7 +176,7 @@ uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; /**< Ad int8_t m_tx_power = 0; #endif -volatile uint16_t m_peripheral_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */ +volatile uint16_t m_peripheral_conn_handle; /**< Handle of the current connection. */ #ifndef SAVE_ON_FLASH ble_gap_addr_t m_peripheral_addr; #endif @@ -186,7 +186,7 @@ volatile uint16_t m_peripheral_effective_mtu; const uint16_t m_peripheral_effective_mtu = GATT_MTU_SIZE_DEFAULT; #endif #if CENTRAL_LINK_COUNT>0 -volatile uint16_t m_central_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle for central mode connection */ +volatile uint16_t m_central_conn_handles[CENTRAL_LINK_COUNT]; /**< Handle for central mode connection */ #ifdef EXTENSIBLE_MTU volatile uint16_t m_central_effective_mtu; #else @@ -414,10 +414,11 @@ int jsble_exec_pending(IOEvent *event) { break; } #if CENTRAL_LINK_COUNT>0 - case BLEP_RSSI_CENTRAL: { - JsVar *gattServer = bleGetActiveBluetoothGattServer(); + case BLEP_RSSI_CENTRAL: { // rssi as data low byte, index in m_central_conn_handles as high byte + int centralIdx = data>>8; // index in m_central_conn_handles + JsVar *gattServer = bleGetActiveBluetoothGattServer(centralIdx); if (gattServer) { - JsVar *rssi = jsvNewFromInteger((signed char)data); + JsVar *rssi = jsvNewFromInteger((signed char)(data & 255)); JsVar *bluetoothDevice = jsvObjectGetChild(gattServer, "device", 0); if (bluetoothDevice) { jsvObjectSetChild(bluetoothDevice, "rssi", rssi); @@ -433,50 +434,53 @@ int jsble_exec_pending(IOEvent *event) { case BLEP_TASK_FAIL_DISCONNECTED: bleCompleteTaskFailAndUnLock(bleGetCurrentTask(), jsvNewFromString("Disconnected")); break; - case BLEP_TASK_CENTRAL_CONNECTED: + case BLEP_TASK_CENTRAL_CONNECTED: /* bleTaskInfo is a BluetoothRemoteGATTServer */ jsvObjectSetChildAndUnLock(bleTaskInfo, "connected", jsvNewFromBool(true)); + jsvObjectSetChildAndUnLock(bleTaskInfo, "handle", jsvNewFromInteger(m_central_conn_handles[data])); bleCompleteTaskSuccess(BLETASK_CONNECT, bleTaskInfo); break; - case BLEP_TASK_DISCOVER_SERVICE: { + case BLEP_TASK_DISCOVER_SERVICE: { /* bleTaskInfo = BluetoothDevice, bleTaskInfo2 = an array of BluetoothRemoteGATTService, or 0 */ if (!bleInTask(BLETASK_PRIMARYSERVICE)) { jsExceptionHere(JSET_INTERNALERROR,"Wrong task: %d vs %d", bleGetCurrentTask(), BLETASK_PRIMARYSERVICE); break; } ble_gattc_service_t *p_srv = (ble_gattc_service_t*)buffer; - if (!bleTaskInfo) bleTaskInfo = jsvNewEmptyArray(); - if (!bleTaskInfo) break; + if (!bleTaskInfo2) bleTaskInfo2 = jsvNewEmptyArray(); + if (!bleTaskInfo2) break; JsVar *o = jspNewObject(0, "BluetoothRemoteGATTService"); if (o) { + jsvObjectSetChild(o,"device", bleTaskInfo); jsvObjectSetChildAndUnLock(o,"uuid", bleUUIDToStr(p_srv->uuid)); jsvObjectSetChildAndUnLock(o,"isPrimary", jsvNewFromBool(true)); jsvObjectSetChildAndUnLock(o,"start_handle", jsvNewFromInteger(p_srv->handle_range.start_handle)); jsvObjectSetChildAndUnLock(o,"end_handle", jsvNewFromInteger(p_srv->handle_range.end_handle)); - jsvArrayPushAndUnLock(bleTaskInfo, o); + jsvArrayPushAndUnLock(bleTaskInfo2, o); } break; } - case BLEP_TASK_DISCOVER_SERVICE_COMPLETE: { + case BLEP_TASK_DISCOVER_SERVICE_COMPLETE: { /* bleTaskInfo = BluetoothDevice, bleTaskInfo2 = an array of BluetoothRemoteGATTService */ // When done, send the result to the handler - if (bleTaskInfo && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) { + if (bleTaskInfo2 && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) { // single item because filtering - JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(bleTaskInfo)); - jsvUnLock(bleTaskInfo); - bleTaskInfo = t; + JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(bleTaskInfo2)); + jsvUnLock(bleTaskInfo2); + bleTaskInfo2 = t; } - if (bleTaskInfo) bleCompleteTaskSuccess(BLETASK_PRIMARYSERVICE, bleTaskInfo); + if (bleTaskInfo) bleCompleteTaskSuccess(BLETASK_PRIMARYSERVICE, bleTaskInfo2); else bleCompleteTaskFailAndUnLock(BLETASK_PRIMARYSERVICE, jsvNewFromString("No Services found")); break; } - case BLEP_TASK_DISCOVER_CHARACTERISTIC: { + case BLEP_TASK_DISCOVER_CHARACTERISTIC: { /* bleTaskInfo = BluetoothRemoteGATTService, bleTaskInfo2 = an array of BluetoothRemoteGATTCharacteristic, or 0 */ if (!bleInTask(BLETASK_CHARACTERISTIC)) { jsExceptionHere(JSET_INTERNALERROR,"Wrong task: %d vs %d", bleGetCurrentTask(), BLETASK_PRIMARYSERVICE); break; } ble_gattc_char_t *p_chr = (ble_gattc_char_t*)buffer; - if (!bleTaskInfo) bleTaskInfo = jsvNewEmptyArray(); - if (!bleTaskInfo) break; + if (!bleTaskInfo2) bleTaskInfo2 = jsvNewEmptyArray(); + if (!bleTaskInfo2) break; JsVar *o = jspNewObject(0, "BluetoothRemoteGATTCharacteristic"); if (o) { + jsvObjectSetChild(o,"service", bleTaskInfo); jsvObjectSetChildAndUnLock(o,"uuid", bleUUIDToStr(p_chr->uuid)); jsvObjectSetChildAndUnLock(o,"handle_value", jsvNewFromInteger(p_chr->handle_value)); jsvObjectSetChildAndUnLock(o,"handle_decl", jsvNewFromInteger(p_chr->handle_decl)); @@ -492,30 +496,30 @@ int jsble_exec_pending(IOEvent *event) { jsvObjectSetChildAndUnLock(o,"properties", p); } // char_props? - jsvArrayPushAndUnLock(bleTaskInfo, o); + jsvArrayPushAndUnLock(bleTaskInfo2, o); } break; } - case BLEP_TASK_DISCOVER_CHARACTERISTIC_COMPLETE: { + case BLEP_TASK_DISCOVER_CHARACTERISTIC_COMPLETE: { /* bleTaskInfo = BluetoothRemoteGATTService, bleTaskInfo2 = an array of BluetoothRemoteGATTCharacteristic, or 0 */ // When done, send the result to the handler - if (bleTaskInfo && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) { + if (bleTaskInfo2 && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) { // single item because filtering - JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(bleTaskInfo)); - jsvUnLock(bleTaskInfo); - bleTaskInfo = t; + JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(bleTaskInfo2)); + jsvUnLock(bleTaskInfo2); + bleTaskInfo2 = t; } - if (bleTaskInfo) bleCompleteTaskSuccess(BLETASK_CHARACTERISTIC, bleTaskInfo); + if (bleTaskInfo) bleCompleteTaskSuccess(BLETASK_CHARACTERISTIC, bleTaskInfo2); else bleCompleteTaskFailAndUnLock(BLETASK_CHARACTERISTIC, jsvNewFromString("No Characteristics found")); break; } - case BLEP_TASK_DISCOVER_CCCD: { + case BLEP_TASK_DISCOVER_CCCD: { /* bleTaskInfo = BluetoothRemoteGATTCharacteristic */ uint16_t cccd_handle = data; if (cccd_handle) { if(bleTaskInfo) jsvObjectSetChildAndUnLock(bleTaskInfo, "handle_cccd", jsvNewFromInteger(cccd_handle)); // Switch task here rather than completing... bleSwitchTask(BLETASK_CHARACTERISTIC_NOTIFY); - jsble_central_characteristicNotify(bleTaskInfo, true); + jsble_central_characteristicNotify(jswrap_ble_BluetoothRemoteGATTCharacteristic_getHandle(bleTaskInfo), bleTaskInfo, true); } else { // Couldn't find anything - just report error bleCompleteTaskFailAndUnLock(BLETASK_CHARACTERISTIC_DESC_AND_STARTNOTIFY, jsvNewFromString("CCCD Handle not found")); @@ -536,23 +540,25 @@ int jsble_exec_pending(IOEvent *event) { bleCompleteTaskSuccess(BLETASK_CHARACTERISTIC_NOTIFY, 0); break; } - case BLEP_CENTRAL_DISCONNECTED: { + case BLEP_CENTRAL_DISCONNECTED: { // reason as data low byte, index in m_central_conn_handles as high byte + int centralIdx = data>>8; // index in m_central_conn_handles if (bleInTask(BLETASK_DISCONNECT)) bleCompleteTaskSuccess(BLETASK_DISCONNECT, bleTaskInfo); - JsVar *gattServer = bleGetActiveBluetoothGattServer(); + JsVar *gattServer = bleGetActiveBluetoothGattServer(centralIdx); if (gattServer) { JsVar *bluetoothDevice = jsvObjectGetChild(gattServer, "device", 0); jsvObjectSetChildAndUnLock(gattServer, "connected", jsvNewFromBool(false)); + jsvObjectRemoveChild(gattServer, "handle"); if (bluetoothDevice) { // HCI error code, see BLE_HCI_STATUS_CODES in ble_hci.h - JsVar *reason = jsvNewFromInteger(data); + JsVar *reason = jsvNewFromInteger(data & 255); jsiQueueObjectCallbacks(bluetoothDevice, JS_EVENT_PREFIX"gattserverdisconnected", &reason, 1); jsvUnLock(reason); jshHadEvent(); } jsvUnLock2(gattServer, bluetoothDevice); } - bleSetActiveBluetoothGattServer(0); + bleSetActiveBluetoothGattServer(centralIdx, 0); break; } case BLEP_NOTIFICATION: { @@ -641,14 +647,16 @@ int jsble_exec_pending(IOEvent *event) { break; #endif #ifdef LINK_SECURITY - case BLEP_TASK_PASSKEY_DISPLAY: { + case BLEP_TASK_PASSKEY_DISPLAY: { // data = connection handle + uint16_t conn_handle = data; /* TODO: yes/no passkey uint8_t match_request : 1; If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ + int centralIdx = jsble_get_central_connection_idx(conn_handle); if (bufferLen==BLE_GAP_PASSKEY_LEN) { buffer[BLE_GAP_PASSKEY_LEN] = 0; - JsVar *gattServer = bleGetActiveBluetoothGattServer(); + JsVar *gattServer = bleGetActiveBluetoothGattServer(centralIdx); if (gattServer) { JsVar *passkey = jsvNewFromString((char*)buffer); JsVar *bluetoothDevice = jsvObjectGetChild(gattServer, "device", 0); @@ -661,23 +669,22 @@ uint8_t match_request : 1; If 1 requires the application to report } break; } - case BLEP_TASK_AUTH_KEY_REQUEST: { + case BLEP_TASK_AUTH_KEY_REQUEST: { // data = connection handle //jsiConsolePrintf("BLEP_TASK_AUTH_KEY_REQUEST\n"); uint16_t conn_handle = data; #if CENTRAL_LINK_COUNT>0 - if (conn_handle == m_central_conn_handle) { - JsVar *gattServer = bleGetActiveBluetoothGattServer(); - if (gattServer) { - jsvObjectSetChildAndUnLock(gattServer, "connected", jsvNewFromBool(false)); - JsVar *bluetoothDevice = jsvObjectGetChild(gattServer, "device", 0); - if (bluetoothDevice) { - // HCI error code, see BLE_HCI_STATUS_CODES in ble_hci.h - jsiQueueObjectCallbacks(bluetoothDevice, JS_EVENT_PREFIX"passkeyRequest", 0, 0); - jshHadEvent(); - } - jsvUnLock2(gattServer, bluetoothDevice); + int centralIdx = jsble_get_central_connection_idx(conn_handle); + JsVar *gattServer = bleGetActiveBluetoothGattServer(centralIdx); + if (gattServer) { + jsvObjectSetChildAndUnLock(gattServer, "connected", jsvNewFromBool(false)); + JsVar *bluetoothDevice = jsvObjectGetChild(gattServer, "device", 0); + if (bluetoothDevice) { + // HCI error code, see BLE_HCI_STATUS_CODES in ble_hci.h + jsiQueueObjectCallbacks(bluetoothDevice, JS_EVENT_PREFIX"passkeyRequest", 0, 0); + jshHadEvent(); } - } else + jsvUnLock2(gattServer, bluetoothDevice); + } #endif if (conn_handle == m_peripheral_conn_handle) { bool ok = false; @@ -789,21 +796,29 @@ uint32_t jsble_set_periph_connection_interval(JsVarFloat min, JsVarFloat max) { /** Is BLE connected to any device at all? */ bool jsble_has_connection() { -#if CENTRAL_LINK_COUNT>0 - return (m_central_conn_handle != BLE_CONN_HANDLE_INVALID) || - (m_peripheral_conn_handle != BLE_CONN_HANDLE_INVALID); -#else + if (jsble_has_central_connection()) + return true; return m_peripheral_conn_handle != BLE_CONN_HANDLE_INVALID; -#endif } /** Is BLE connected to a central device at all? */ bool jsble_has_central_connection() { #if CENTRAL_LINK_COUNT>0 - return (m_central_conn_handle != BLE_CONN_HANDLE_INVALID); -#else + for (int i=0;i0 + for (int i=0;i0 if (p_ble_evt->evt.gap_evt.params.connected.role == BLE_GAP_ROLE_CENTRAL) { - m_central_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; + int centralIdx; + for (centralIdx=0;centralIdxevt.gap_evt.conn_handle; + break; + } + } + if (centralIdx==CENTRAL_LINK_COUNT) { + jsWarn("BLE_GAP_EVT_CONNECTED, but no m_central_conn_handles\n"); + break; // no connection allocated?? + } #ifdef EXTENSIBLE_MTU m_central_effective_mtu = GATT_MTU_SIZE_DEFAULT; #endif @@ -1224,8 +1249,8 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { APP_ERROR_CHECK_NOT_URGENT(err_code); #endif #endif - bleSetActiveBluetoothGattServer(bleTaskInfo); - jsble_queue_pending(BLEP_TASK_CENTRAL_CONNECTED, 0); + bleSetActiveBluetoothGattServer(centralIdx, bleTaskInfo); /* bleTaskInfo = instance of BluetoothRemoteGATTServer */ + jsble_queue_pending(BLEP_TASK_CENTRAL_CONNECTED, centralIdx); // index in m_central_conn_handles } #endif break; @@ -1249,19 +1274,19 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ble_update_whitelist(); #endif + int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.gap_evt.conn_handle); #if CENTRAL_LINK_COUNT>0 - if (m_central_conn_handle == p_ble_evt->evt.gap_evt.conn_handle) { - jsble_queue_pending(BLEP_CENTRAL_DISCONNECTED, p_ble_evt->evt.gap_evt.params.disconnected.reason); - - m_central_conn_handle = BLE_CONN_HANDLE_INVALID; + if (centralIdx>=0) { + jsble_queue_pending(BLEP_CENTRAL_DISCONNECTED, p_ble_evt->evt.gap_evt.params.disconnected.reason | (centralIdx<<8)); + m_central_conn_handles[centralIdx] = BLE_CONN_HANDLE_INVALID; BleTask task = bleGetCurrentTask(); if (BLETASK_IS_CENTRAL(task)) { jsble_queue_pending(BLEP_TASK_FAIL_DISCONNECTED, 0); } - } else + } #endif - { + if (centralIdx<0) { bleStatus &= ~BLE_IS_RSSI_SCANNING; // scanning will have stopped now we're disconnected m_peripheral_conn_handle = BLE_CONN_HANDLE_INVALID; // if we were on bluetooth and we disconnected, clear the input line so we're fresh next time (#2219) @@ -1280,16 +1305,17 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { break; - case BLE_GAP_EVT_RSSI_CHANGED: + case BLE_GAP_EVT_RSSI_CHANGED: { + int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.gap_evt.conn_handle); #if CENTRAL_LINK_COUNT>0 - if (m_central_conn_handle == p_ble_evt->evt.gap_evt.conn_handle) { - jsble_queue_pending(BLEP_RSSI_CENTRAL, p_ble_evt->evt.gap_evt.params.rssi_changed.rssi); - } else + if (centralIdx) { + jsble_queue_pending(BLEP_RSSI_CENTRAL, (p_ble_evt->evt.gap_evt.params.rssi_changed.rssi&255) | (centralIdx<<8)); + } #endif - { + if (centralIdx < 0) { jsble_queue_pending(BLEP_RSSI_PERIPH, p_ble_evt->evt.gap_evt.params.rssi_changed.rssi); } - break; + } break; #if PEER_MANAGER_ENABLED==0 case BLE_GAP_EVT_SEC_PARAMS_REQUEST:{ @@ -1402,24 +1428,24 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { uint16_t effective_mtu = p_ble_evt->evt.gattc_evt.params.exchange_mtu_rsp.server_rx_mtu; effective_mtu = MIN(MAX(GATT_MTU_SIZE_DEFAULT,effective_mtu),NRF_BLE_MAX_MTU_SIZE); #if CENTRAL_LINK_COUNT>0 - if (m_central_conn_handle == conn_handle) { - m_central_effective_mtu = effective_mtu; + int centralIdx = jsble_get_central_connection_idx(data); + if (centralIdx >= 0) { + m_central_effective_mtu = effective_mtu; #if (NRF_SD_BLE_API_VERSION > 3) - if (effective_mtu > GATT_MTU_SIZE_DEFAULT){ - ble_gap_data_length_params_t const dlp = - { - .max_rx_octets = effective_mtu + 4, - .max_tx_octets = effective_mtu + 4, - }; - err_code = sd_ble_gap_data_length_update(conn_handle, &dlp, NULL); - APP_ERROR_CHECK_NOT_URGENT(err_code); - - } + if (effective_mtu > GATT_MTU_SIZE_DEFAULT) { + ble_gap_data_length_params_t const dlp = + { + .max_rx_octets = effective_mtu + 4, + .max_tx_octets = effective_mtu + 4, + }; + err_code = sd_ble_gap_data_length_update(conn_handle, &dlp, NULL); + APP_ERROR_CHECK_NOT_URGENT(err_code); + } #endif - } else + } #endif if (m_peripheral_conn_handle == conn_handle){ - m_peripheral_effective_mtu = effective_mtu; + m_peripheral_effective_mtu = effective_mtu; } } break; // BLE_GATTC_EVT_EXCHANGE_MTU_RSP #endif @@ -1429,9 +1455,10 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { uint16_t effective_mtu = p_ble_evt->evt.gatts_evt.params.exchange_mtu_request.client_rx_mtu; effective_mtu = MIN(MAX(GATT_MTU_SIZE_DEFAULT,effective_mtu),NRF_BLE_MAX_MTU_SIZE); #if CENTRAL_LINK_COUNT>0 - if (m_central_conn_handle == conn_handle) { - m_central_effective_mtu = effective_mtu; - } else + int centralIdx = jsble_get_central_connection_idx(conn_handle); + if (centralIdx >= 0) { + m_central_effective_mtu = effective_mtu; + } #endif if (m_peripheral_conn_handle == conn_handle){ m_peripheral_effective_mtu = effective_mtu; @@ -1486,9 +1513,11 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { case BLE_GATTS_EVT_HVN_TX_COMPLETE: // Handle Value Notification transmission complete // FIXME: was just BLE_EVT_TX_COMPLETE - do we now get called twice in some cases? #endif + { // BLE transmit finished - reset flags #if CENTRAL_LINK_COUNT>0 - if (p_ble_evt->evt.common_evt.conn_handle == m_central_conn_handle) { + int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.common_evt.conn_handle); + if (centralIdx>=0) { if (bleInTask(BLETASK_CHARACTERISTIC_WRITE)) jsble_queue_pending(BLEP_TASK_CHARACTERISTIC_WRITE, 0); } @@ -1512,7 +1541,7 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { } #endif } - break; + } break; case BLE_GAP_EVT_ADV_REPORT: { // Advertising data received @@ -2431,6 +2460,12 @@ static void ble_stack_init() { #endif }; +#if CENTRAL_LINK_COUNT>0 + for (int i=0;i0 -uint32_t jsble_set_central_rssi_scan(bool enabled) { +uint32_t jsble_set_central_rssi_scan(uint16_t central_conn_handle, bool enabled) { uint32_t err_code = 0; if (enabled) { - if (jsble_has_central_connection()) - err_code = sd_ble_gap_rssi_start(m_central_conn_handle, 0, 0); + err_code = sd_ble_gap_rssi_start(central_conn_handle, 0, 0); } else { - if (jsble_has_central_connection()) - err_code = sd_ble_gap_rssi_stop(m_central_conn_handle); + err_code = sd_ble_gap_rssi_stop(central_conn_handle); } if (err_code == NRF_ERROR_INVALID_STATE) { // We either tried to start when already started, or stop when @@ -3168,8 +3201,9 @@ void jsble_set_tx_power(int8_t pwr) { #if NRF_SD_BLE_API_VERSION > 5 if (m_peripheral_conn_handle != BLE_CONN_HANDLE_INVALID) err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, m_peripheral_conn_handle, pwr); - if (m_central_conn_handle != BLE_CONN_HANDLE_INVALID) - err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, m_central_conn_handle, pwr); + for (int i=0;i Date: Thu, 16 Jun 2022 12:22:15 +0100 Subject: [PATCH 0138/1183] SDK15 support, show APP_RAM_BASE if not correct, docs --- libs/bluetooth/bluetooth.h | 15 +++++++++++---- src/jswrap_process.c | 27 +++++++++++++++++++++------ targets/nrf5x/bluetooth.c | 21 ++++++++++++--------- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/libs/bluetooth/bluetooth.h b/libs/bluetooth/bluetooth.h index b9ea8ed22a..2f00ceedb5 100644 --- a/libs/bluetooth/bluetooth.h +++ b/libs/bluetooth/bluetooth.h @@ -68,14 +68,21 @@ typedef struct { #define BLE_NUS_MAX_DATA_LEN 20 //GATT_MTU_SIZE_DEFAULT - 3 #endif -#if defined(NRF52_SERIES) || defined(ESP32) -// nRF52 gets the ability to connect to other -#define CENTRAL_LINK_COUNT 1 /**evt.gattc_evt.params.exchange_mtu_rsp.server_rx_mtu; effective_mtu = MIN(MAX(GATT_MTU_SIZE_DEFAULT,effective_mtu),NRF_BLE_MAX_MTU_SIZE); #if CENTRAL_LINK_COUNT>0 - int centralIdx = jsble_get_central_connection_idx(data); + int centralIdx = jsble_get_central_connection_idx(conn_handle); if (centralIdx >= 0) { m_central_effective_mtu = effective_mtu; #if (NRF_SD_BLE_API_VERSION > 3) @@ -2436,13 +2436,20 @@ uint32_t app_ram_base; static void ble_stack_init() { #if defined ( __GNUC__ ) extern uint32_t __data_start__; - app_ram_base = (uint32_t) &__data_start__; + uint32_t orig_app_ram_base = (uint32_t) &__data_start__; + app_ram_base = orig_app_ram_base; #else #error "unsupported compiler" #endif -#if NRF_SD_BLE_API_VERSION<5 +#if CENTRAL_LINK_COUNT>0 + for (int i=0;i0 - for (int i=0;i GATT_MTU_SIZE_DEFAULT) { From eb08011b5f5d2eb8f289a07f3fab4696b884eee8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Jun 2022 13:23:22 +0100 Subject: [PATCH 0139/1183] nRF52: Added support for 2 concurrent Bluetooth Central connections to Puck.js, Pixl.js, MDBT42Q (fix #1360) --- ChangeLog | 1 + boards/MDBT42Q.py | 7 ++++--- boards/NRF52832DK.py | 5 ++++- boards/PIXLJS.py | 7 ++++--- boards/PUCKJS.py | 7 ++++--- boards/PUCKJS_MINIMAL.py | 7 ++++--- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5f0cc35de..ac8882a820 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ let/const now don't add a scope if executed in a function outside a block (fix #2225) When executing a function, ensure the scope doesn't include a `return` var Rename internal return var to fit it inside one JsVar on embedded systems + nRF52: Added support for 2 concurrent Bluetooth Central connections to Puck.js, Pixl.js, MDBT42Q (fix #1360) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/boards/MDBT42Q.py b/boards/MDBT42Q.py index 46bbe2f655..d7dfe61482 100644 --- a/boards/MDBT42Q.py +++ b/boards/MDBT42Q.py @@ -23,7 +23,7 @@ 'default_console_tx' : "D6", 'default_console_rx' : "D8", 'default_console_baudrate' : "9600", - 'variables' : 3076, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'variables' : 2950, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. 'bootloader' : 1, 'binary_name' : 'espruino_%v_mdbt42q.hex', 'build' : { @@ -42,8 +42,9 @@ 'makefile' : [ 'DEFINES+=-DHAL_NFC_ENGINEERING_BC_FTPAN_WORKAROUND=1', # Looks like proper production nRF52s had this issue 'DEFINES+=-DCONFIG_GPIO_AS_PINRESET', # Allow the reset pin to work - 'DEFINES+=-DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 - 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x2c40', # set RAM base to match MTU + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"MDBT42Q"\'', 'DEFINES+=-DNEOPIXEL_SCK_PIN=23 -DNEOPIXEL_LRCK_PIN=13', # see https://github.com/espruino/Espruino/issues/2071 'DFU_PRIVATE_KEY=targets/nrf5x_dfu/dfu_private_key.pem', diff --git a/boards/NRF52832DK.py b/boards/NRF52832DK.py index 41b14b692f..9b8323a85f 100644 --- a/boards/NRF52832DK.py +++ b/boards/NRF52832DK.py @@ -24,7 +24,7 @@ 'default_console_tx' : "D6", 'default_console_rx' : "D8", 'default_console_baudrate' : "9600", - 'variables' : 2756, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'variables' : 2630, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. # 'bootloader' : 1, 'binary_name' : 'espruino_%v_nrf52832.hex', 'build' : { @@ -42,6 +42,9 @@ 'ESPR_BLUETOOTH_ANCS=1', # Enable ANCS (Apple notifications) support #'DEFINES += -DI2C_SLAVE -DTWIS_ENABLED=1 -DTWIS1_ENABLED=1' # enable I2C slave support # I2C slave can then be used with I2C1.setup({sda,scl,addr:42}) + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 ] } }; diff --git a/boards/PIXLJS.py b/boards/PIXLJS.py index c048a6ffd7..d3d595fbac 100644 --- a/boards/PIXLJS.py +++ b/boards/PIXLJS.py @@ -22,7 +22,7 @@ 'default_console_tx' : "D1", 'default_console_rx' : "D0", 'default_console_baudrate' : "9600", - 'variables' : 3076, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'variables' : 2950, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. 'bootloader' : 1, 'binary_name' : 'espruino_%v_pixljs.hex', 'build' : { @@ -44,8 +44,9 @@ 'WIZNET=1','W5100=1', # Add WIZnet support - W5100 is the most common Arduino shield 'DEFINES+=-DHAL_NFC_ENGINEERING_BC_FTPAN_WORKAROUND=1', # Looks like proper production nRF52s had this issue # 'DEFINES+=-DCONFIG_GPIO_AS_PINRESET', # Allow the reset pin to work - 'DEFINES+=-DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 - 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x2c40', # set RAM base to match MTU + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"Pixl.js"\'', 'DEFINES+=-DCUSTOM_GETBATTERY=jswrap_pixljs_getBattery', 'DEFINES+=-DNFC_DEFAULT_URL=\'"https://www.espruino.com/ide"\'', diff --git a/boards/PUCKJS.py b/boards/PUCKJS.py index e543a5a26d..cf84f6ea32 100644 --- a/boards/PUCKJS.py +++ b/boards/PUCKJS.py @@ -22,7 +22,7 @@ 'default_console_tx' : "D28", 'default_console_rx' : "D29", 'default_console_baudrate' : "9600", - 'variables' : 2756, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'variables' : 2630, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. 'bootloader' : 1, 'binary_name' : 'espruino_%v_puckjs.hex', 'build' : { @@ -43,8 +43,9 @@ # 'DEFINES+=-DCONFIG_GPIO_AS_PINRESET', # reset isn't being used, so let's just have an extra IO (needed for Puck.js V2) 'DEFINES+=-DESPR_DCDC_ENABLE', # Ensure DCDC converter is enabled 'DEFINES += -DNEOPIXEL_SCK_PIN=22 -DNEOPIXEL_LRCK_PIN=16', # SCK pin needs defining as something unused for neopixel (HW errata means they can't be disabled) see https://github.com/espruino/Espruino/issues/2071 - 'DEFINES+=-DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 - 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x2c40', # set RAM base to match MTU + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"Puck.js"\'', 'DEFINES+=-DCUSTOM_GETBATTERY=jswrap_puck_getBattery', 'DEFINES+=-DNFC_DEFAULT_URL=\'"https://puck-js.com/go"\'', diff --git a/boards/PUCKJS_MINIMAL.py b/boards/PUCKJS_MINIMAL.py index 21fd4263a0..cda9b2f0c3 100644 --- a/boards/PUCKJS_MINIMAL.py +++ b/boards/PUCKJS_MINIMAL.py @@ -26,7 +26,7 @@ 'default_console_tx' : "D28", 'default_console_rx' : "D29", 'default_console_baudrate' : "9600", - 'variables' : 2756, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'variables' : 2630, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. 'bootloader' : 1, 'binary_name' : 'espruino_%v_puckjs_minimal.hex', 'build' : { @@ -41,8 +41,9 @@ # 'DEFINES+=-DCONFIG_GPIO_AS_PINRESET', # reset isn't being used, so let's just have an extra IO (needed for Puck.js V2) 'DEFINES+=-DESPR_DCDC_ENABLE', # Ensure DCDC converter is enabled 'DEFINES += -DNEOPIXEL_SCK_PIN=22', # SCK pin needs defining as something unused for neopixel (HW errata means they can't be disabled) - 'DEFINES+=-DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 - 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x2c40', # set RAM base to match MTU + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"Puck.js"\'', 'DEFINES+=-DCUSTOM_GETBATTERY=jswrap_puck_getBattery', 'DEFINES+=-DNFC_DEFAULT_URL=\'"https://puck-js.com/go"\'', From 857a25fdd2ba9a4c351a0d5a2541b1f3e8f142bc Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Jun 2022 13:30:33 +0100 Subject: [PATCH 0140/1183] fix micro:bit build --- targets/nrf5x/bluetooth.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 1190796c2b..45f9f4504f 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -1255,7 +1255,7 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { #endif break; - case BLE_GAP_EVT_DISCONNECTED: + case BLE_GAP_EVT_DISCONNECTED: { #ifdef DYNAMIC_INTERVAL_ADJUSTMENT // set to high interval ready for next connection @@ -1274,8 +1274,8 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ble_update_whitelist(); #endif - int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.gap_evt.conn_handle); #if CENTRAL_LINK_COUNT>0 + int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.gap_evt.conn_handle); if (centralIdx>=0) { jsble_queue_pending(BLEP_CENTRAL_DISCONNECTED, p_ble_evt->evt.gap_evt.params.disconnected.reason | (centralIdx<<8)); m_central_conn_handles[centralIdx] = BLE_CONN_HANDLE_INVALID; @@ -1285,6 +1285,8 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { jsble_queue_pending(BLEP_TASK_FAIL_DISCONNECTED, 0); } } +#else + int centralIdx = -1; #endif if (centralIdx<0) { bleStatus &= ~BLE_IS_RSSI_SCANNING; // scanning will have stopped now we're disconnected @@ -1303,7 +1305,7 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { if ((bleStatus & BLE_NEEDS_SOFTDEVICE_RESTART) && !jsble_has_connection()) jsble_restart_softdevice(NULL); - break; + } break; case BLE_GAP_EVT_RSSI_CHANGED: { int centralIdx = jsble_get_central_connection_idx(p_ble_evt->evt.gap_evt.conn_handle); From bfe80282072c952261c811a9eb70355da72ad2d5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Jun 2022 16:23:40 +0100 Subject: [PATCH 0141/1183] Tidy up JIT, fix known memory leaks, add postfix and unary ops Bangle.js2: JIT now built in (only enabled for functions prefixed '"jit"') E.dumpVariables now outputs more info for variable values --- ChangeLog | 2 + README_JIT.md | 26 +++++- boards/BANGLEJS2.py | 3 +- src/jsjit.c | 190 ++++++++++++++++++++---------------------- src/jsjitc.c | 21 +++++ src/jsjitc.h | 4 + src/jsparse.c | 13 ++- src/jsvar.c | 2 + src/jsvar.h | 2 +- src/jswrap_espruino.c | 14 +++- 10 files changed, 166 insertions(+), 111 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac8882a820..b1346afdf2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ When executing a function, ensure the scope doesn't include a `return` var Rename internal return var to fit it inside one JsVar on embedded systems nRF52: Added support for 2 concurrent Bluetooth Central connections to Puck.js, Pixl.js, MDBT42Q (fix #1360) + Bangle.js2: JIT now built in (only enabled for functions prefixed '"jit"') + E.dumpVariables now outputs more info for variable values 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/README_JIT.md b/README_JIT.md index 91cd215133..3b259f3609 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -109,6 +109,17 @@ function jit() {'jit';print(42);} function jit() {'jit';print(42);return 123;} jit()==123 +function jit() {'jit';return !123;} +jit()==false +function jit() {'jit';return !0;} +jit()==true +function jit() {'jit';return ~0;} +jit()==-1 +function jit() {'jit';return -(1);} +jit()==-1 +function jit() {'jit';return +"0123";} +jit()==83 // octal! + function t() { return "Hello"; } function jit() {'jit'; return t()+" world";} jit()=="Hello world" @@ -117,11 +128,17 @@ function jit() {'jit';digitalWrite(LED1,1);} jit(); // LED on +function jit() {'jit';return i++;} +i=0;jit()==0 && i==1 + +function jit() {'jit';return ++i;} +i=0;jit()==1 && i==1 + function jit() {'jit';i=42;} jit();i==42 function jit() {'jit';return 1<2;} -jit();i==true +jit()==true function jit() {"jit";if (i<3) print("T"); else print("X");print("--")} i=2;jit(); // prints T,-- @@ -131,6 +148,13 @@ i=5;jit(); // prints X,-- function jit() {"jit";for (i=0;i<5;i=i+1) print(i);} jit(); // prints 0,1,2,3,4 +function jit() {"jit";for (i=0;i<5;i++) print(i);} // BROKEN? Uncaught ReferenceError: "" is not defined +jit(); // prints 0,1,2,3,4 + +function jit() {"jit";for (i=0;i<5;++i) print(i);} +jit(); // prints 0,1,2,3,4 + + function nojit() {for (i=0;i<1000;i=i+1);} function jit() {"jit";for (i=0;i<1000;i=i+1);} t=getTime();jit();getTime()-t // 0.14 sec diff --git a/boards/BANGLEJS2.py b/boards/BANGLEJS2.py index 2feebae683..69f57b7eaa 100644 --- a/boards/BANGLEJS2.py +++ b/boards/BANGLEJS2.py @@ -36,7 +36,8 @@ 'GRAPHICS', 'CRYPTO','SHA256','SHA512', 'LCD_MEMLCD', - 'TENSORFLOW' + 'TENSORFLOW', + 'JIT' # JIT compiler enabled ], 'makefile' : [ 'DEFINES += -DESPR_HWVERSION=2 -DBANGLEJS -DBANGLEJS_Q3', diff --git a/src/jsjit.c b/src/jsjit.c index f8c4faf0cb..5507874b8f 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -163,6 +163,47 @@ uint64_t _jsjxObjectLookup(JsVar *index, JsVar *parent, JsVar *a) { return ((uint64_t)(size_t)resultA) | (((uint64_t)(size_t)resultParent)<<32); } +// Like jspeFunctionCall but we unlock ALL the vars supplied +NO_INLINE JsVar *_jsjxFunctionCallAndUnLock(JsVar *function, JsVar *functionName, JsVar *thisArg, bool isParsing, int argCount, JsVar **argPtr) { + JsVar *r = jspeFunctionCall(function, functionName, thisArg, isParsing, argCount, argPtr); + jsvUnLockMany(argCount, argPtr); + jsvUnLock3(function, functionName, thisArg); + return r; +} + +// Call jsvReplaceWithOrAddToRoot but unlock the second argument +NO_INLINE void _jsxReplaceWithOrAddToRootUnlockSrc(JsVar *dst, JsVar *src) { + jsvReplaceWithOrAddToRoot(dst, src); + jsvUnLock(src); +} + +// Handle postfix inc and dec nicely - without us having to add a bunch of extra code +NO_INLINE JsVar *_jsxPostfixIncDec(JsVar *var, char op) { + // FIXME: duplicate code in __jspePostfixExpression + JsVar *one = jsvNewFromInteger(1); + JsVar *oldValue = jsvAsNumberAndUnLock(jsvSkipName(var)); // keep the old value (but convert to number) + JsVar *res = jsvMathsOpSkipNames(oldValue, one, op); + jsvReplaceWith(var, res); + jsvUnLock3(var,res,one); + return oldValue; // return the number from before we incremented +} + +// Handle prefix inc and dec nicely - without us having to add a bunch of extra code +NO_INLINE JsVar *_jsxPrefixIncDec(JsVar *var, char op) { + // FIXME: duplicate code in jspePostfixExpression + JsVar *one = jsvNewFromInteger(1); + JsVar *res = jsvMathsOpSkipNames(var, one, op); + jsvReplaceWith(var, res); + jsvUnLock2(res, one); + return var; // return the number from before we incremented +} + +NO_INLINE JsVar *_jsxMathsOpSkipNamesAndUnLock(JsVar *a, JsVar *b, int op) { + JsVar *r = jsvMathsOpSkipNames(a,b,op); + jsvUnLock2(a,b); + return r; +} + // Parse ./[] - return true if the parent of the current item is currently on the stack bool jsjFactorMember() { bool parentOnStack = false; @@ -237,18 +278,18 @@ void jsjFactorFunctionCall() { } JSP_MATCH(')'); // r4=funcName, args on the stack - jsjcMov(3, JSJAR_SP); // r3 = argPtr - jsjcPush(3, JSJVT_INT); // argPtr + jsjcMov(7, JSJAR_SP); // r7 = argPtr + jsjcPush(7, JSJVT_INT); // argPtr (6th arg - on stack) // Args are in the wrong order - we have to swap them around if we have >1! if (argCount>1) { DEBUG_JIT("; FUNCTION CALL reverse arguments\n"); for (int i=0;itk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { int op = lex->tk; // POSFIX expression => i++, i-- JSP_ASSERT_MATCH(op); - // Get the old value - jsjPopAsVar(0); // value -> r0 - jsjcMov(4, 0); // r0 -> r4 (save for later) - jsjcCall(jsvSkipName); - jsjcCall(jsvAsNumberAndUnLock); // convert old value to number + jsjPopAsVar(0); // old value -> r0 + jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation + jsjcCall(_jsxPostfixIncDec); // JsVar *_jsxPostfixIncDec(JsVar *var, char op) jsjcPush(0, JSJVT_JSVAR); // push result (value BEFORE we inc/dec) - // Create number 1 - jsjcLiteral32(0, (uint32_t)1); - jsjcCall(jsvNewFromInteger); - jsjcMov(5, 0); // r0(one) -> r5 ready for UnLock - jsjcMov(1, 0); // r0(one) -> r1 ready for MathsOp - jsjcMov(0, 4); // r4(value) -> r0 ready for MathsOp - jsjcLiteral32(2, op==LEX_PLUSPLUS ? '+' : '-'); - jsjcCall(jsvMathsOpSkipNames); - // r0 = result - jsjcMov(1, 0); // 2nd arg = result - jsjcMov(6, 0); // r6 = result - for unlock later - jsjcMov(0, 4); // 1st arg = value - jsjcCall(jsvReplaceWith); - // now unlock - jsjcMov(0, 6); // result - jsjcMov(1, 5); // one - jsjcMov(2, 4); // value - jsjcCall(jsvUnLock3); } } void jsjPostfixExpression() { if (lex->tk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { - /*// PREFIX expression => ++i, --i + // PREFIX expression => ++i, --i int op = lex->tk; JSP_ASSERT_MATCH(op); - - a = jsjPostfixExpression(); - if (JSP_SHOULD_EXECUTE) { - JsVar *one = jsvNewFromInteger(1); - JsVar *res = jsvMathsOpSkipNames(a, one, op==LEX_PLUSPLUS ? '+' : '-'); - jsvUnLock(one); - // in-place add/subtract - jsvReplaceWith(a, res); - jsvUnLock(res); - } - *//* - jsjPostfixExpression(); - jsjcLiteral32(0, 1); - jsjcCall(jsvNewFromInteger); - jsjcMov(1, 0); - jsjcMov(4, 0); // preserve 'one' for call - jsjcPop(1); - jsjcMov(5, 0); // preserve 'a' for call - jsjcLiteral32(3, op==LEX_PLUSPLUS ? '+' : '-'); - jsjcCall(jsvMathsOpSkipNames); - jsjcMov(0, 4); // one -> r0 - jsjcCall(jsvUnLock); // jsvUnLock(one) - jsjcMov(1, 0); // res -> r1 - jsjcMov(4, 0); // res -> r0 - jsjcMov(0, 5); // a -> r0 - jsjcCall(jsvReplaceWith); - jsjcMov(0, 4); // res -> r0 - jsjcCall(jsvUnLock); // jsvUnLock(res) - */ + jsjPostfixExpression(); // recurse to get our var... + jsjPopAsVar(0); // old value -> r0 + jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation + jsjcCall(_jsxPrefixIncDec); // JsVar *_jsxPrefixIncDec(JsVar *var, char op) + jsjcPush(0, JSJVT_JSVAR); // push result (value AFTER we inc/dec) } else jsjFactorFunctionCall(); __jsjPostfixExpression(); @@ -352,21 +344,26 @@ void jsjPostfixExpression() { void jsjUnaryExpression() { if (lex->tk=='!' || lex->tk=='~' || lex->tk=='-' || lex->tk=='+') { -/* short tk = lex->tk; - JSP_ASSERT_MATCH(tk); - if (tk=='!') { // logical not - return jsvNewFromBool(!jsvGetBoolAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); - } else if (tk=='~') { // bitwise not - return jsvNewFromInteger(~jsvGetIntegerAndUnLock(jsvSkipNameAndUnLock(jsjUnaryExpression()))); - } else if (tk=='-') { // unary minus - return jsvNegateAndUnLock(jsjUnaryExpression()); // names already skipped - } else if (tk=='+') { // unary plus (convert to number) - JsVar *v = jsvSkipNameAndUnLock(jsjUnaryExpression()); - JsVar *r = jsvAsNumber(v); // names already skipped - jsvUnLock(v); - return r; - }*/ - assert(0); + int op = lex->tk; + JSP_ASSERT_MATCH(op); + jsjUnaryExpression(); + jsjPopNoName(0); // value -> r0 (but ensure it's not a name) + if (op=='!') { // logical not + jsjcCall(jsvGetBoolAndUnLock); + jsjcMVN(0,0); // ~ + jsjcLiteral32(1, 1); + jsjcAND(0,1); // &1 -> convert it back to a boolean + jsjcCall(jsvNewFromBool); + } else if (op=='~') { // bitwise not + jsjcCall(jsvGetIntegerAndUnLock); + jsjcMVN(0,0); // ~ + jsjcCall(jsvNewFromInteger); + } else if (op=='-') { // unary minus + jsjcCall(jsvNegateAndUnLock); + } else if (op=='+') { // unary plus (convert to number) + jsjcCall(jsvAsNumberAndUnLock); + } else assert(0); + jsjcPush(0, JSJVT_JSVAR); } else jsjPostfixExpression(); } @@ -467,15 +464,10 @@ void __jsjBinaryExpression(unsigned int lastPrecedence) { jsvUnLock2(av, bv); } else */{ // --------------------------------------------- NORMAL jsjPopAsVar(1); // b -> r1 - jsjcMov(5, 0); // b -> r5 (for unlock later) jsjPopAsVar(0); // a -> r0 - jsjcMov(4, 0); // a -> r4 (for unlock later) jsjcLiteral32(2, op); - jsjcCall(jsvMathsOpSkipNames); + jsjcCall(_jsxMathsOpSkipNamesAndUnLock); // unlocks arguments jsjcPush(0, JSJVT_JSVAR); // push result - jsjcMov(1, 5); // b -> r1 - jsjcMov(0, 4); // a -> r0 - jsjcCall(jsvUnLock2); } } precedence = jsjGetBinaryExpressionPrecedence(lex->tk); @@ -512,11 +504,10 @@ NO_INLINE void jsjAssignmentExpression() { if (op=='=') { - jsjcCall(jsvReplaceWithOrAddToRoot); - // FIXME - the unlock causes a crash, but it looks like we are leaking locks... Maybe AssignmentExpression doesn't always lock? - //jsjPopAndUnLock(); // Unlock RHS, that we pushed earlier + // this is like jsvReplaceWithOrAddToRoot but it unlocks the RHS for us + jsjcCall(_jsxReplaceWithOrAddToRootUnlockSrc); // void _jsxReplaceWithOrAddToRootUnlockSrc(JsVar *dst, JsVar *src) } else { -#if 0 +/* if (op==LEX_PLUSEQUAL) op='+'; else if (op==LEX_MINUSEQUAL) op='-'; else if (op==LEX_MULEQUAL) op='*'; @@ -531,9 +522,9 @@ NO_INLINE void jsjAssignmentExpression() { if (op=='+' && jsvIsName(lhs)) { JsVar *currentValue = jsvSkipName(lhs); if (jsvIsBasicString(currentValue) && jsvGetRefs(currentValue)==1 && rhs!=currentValue) { - /* A special case for string += where this is the only use of the string - * and we're not appending to ourselves. In this case we can do a - * simple append (rather than clone + append)*/ + // A special case for string += where this is the only use of the string + // and we're not appending to ourselves. In this case we can do a + // simple append (rather than clone + append) JsVar *str = jsvAsString(rhs); jsvAppendStringVarComplete(currentValue, str); jsvUnLock(str); @@ -542,12 +533,12 @@ NO_INLINE void jsjAssignmentExpression() { jsvUnLock(currentValue); } if (op) { - /* Fallback which does a proper add */ + // Fallback which does a proper add JsVar *res = jsvMathsOpSkipNames(lhs,rhs,op); jsvReplaceWith(lhs, res); jsvUnLock(res); } -#endif +*/ } } } @@ -634,6 +625,7 @@ void jsjStatementFor() { // We add a jump to the end after we've parsed everything and know the size } JSP_MATCH(';'); + DEBUG_JIT("; FOR Iterator block\n"); JsVar *oldBlock = jsjcStartBlock(); if (lex->tk != ')') { // we could have 'for (;;)' jsjExpression(); // iterator diff --git a/src/jsjitc.c b/src/jsjitc.c index b720639865..702de97610 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -229,16 +229,37 @@ void jsjcCall(void *c) { void jsjcMov(int regTo, int regFrom) { DEBUG_JIT("MOV r%d <- r%d\n", regTo, regFrom); + assert(regTo>=0 && regTo<16); + assert(regFrom>=0 && regFrom<16); jsjcEmit16((uint16_t)(0b0100011000000000 | ((regTo&8)?128:0) | (regFrom<<3) | (regTo&7))); + // TFFFFTTT +} + +// Move negated register +void jsjcMVN(int regTo, int regFrom) { + DEBUG_JIT("MVNS r%d <- r%d\n", regTo, regFrom); + assert(regTo>=0 && regTo<8); + assert(regFrom>=0 && regFrom<8); + jsjcEmit16((uint16_t)(0b0100001111000000 | (regFrom<<3) | (regTo&7))); +} + +// regTo = regTo & regFrom +void jsjcAND(int regTo, int regFrom) { + DEBUG_JIT("ANDS r%d <- r%d\n", regTo, regFrom); + assert(regTo>=0 && regTo<8); + assert(regFrom>=0 && regFrom<8); + jsjcEmit16((uint16_t)(0b0100000000000000 | (regFrom<<3) | (regTo&7))); } void jsjcPush(int reg, JsjValueType type) { DEBUG_JIT("PUSH {r%d}\n", reg); + assert(reg>=0 && reg<8); jsjcEmit16((uint16_t)(0b1011010000000000 | (1<=0 && reg<8); jsjcEmit16((uint16_t)(0b1011110000000000 | (1<varData.nativeStr.len; + if (f < JSV_NAME_STRING_INT_0) jsiConsolePrintf("F %d\n", f); assert(f >= JSV_NAME_STRING_INT_0); assert((JSV_NAME_STRING_INT_0 < JSV_NAME_STRING_0) && (JSV_NAME_STRING_0 < JSV_STRING_0) && @@ -2000,6 +2001,7 @@ JsVar *jsvAsNumber(JsVar *var) { return jsvNewFromFloat(jsvGetFloat(var)); } +JsVar *jsvAsNumberAndUnLock(JsVar *v) { JsVar *n = jsvAsNumber(v); jsvUnLock(v); return n; } JsVarInt jsvGetIntegerAndUnLock(JsVar *v) { return _jsvGetIntegerAndUnLock(v); } JsVarFloat jsvGetFloatAndUnLock(JsVar *v) { return _jsvGetFloatAndUnLock(v); } bool jsvGetBoolAndUnLock(JsVar *v) { return _jsvGetBoolAndUnLock(v); } diff --git a/src/jsvar.h b/src/jsvar.h index 489a4b2270..2f158d3dc1 100644 --- a/src/jsvar.h +++ b/src/jsvar.h @@ -507,8 +507,8 @@ JsVarFloat jsvGetFloat(const JsVar *v); ///< Get the floating point representati bool jsvGetBool(const JsVar *v); long long jsvGetLongInteger(const JsVar *v); JsVar *jsvAsNumber(JsVar *var); ///< Convert the given variable to a number +JsVar *jsvAsNumberAndUnLock(JsVar *v); ///< Convert the given variable to a number, unlock v after -static ALWAYS_INLINE JsVar *jsvAsNumberAndUnLock(JsVar *v) { JsVar *n = jsvAsNumber(v); jsvUnLock(v); return n; } static ALWAYS_INLINE JsVarInt _jsvGetIntegerAndUnLock(JsVar *v) { JsVarInt i = jsvGetInteger(v); jsvUnLock(v); return i; } static ALWAYS_INLINE JsVarFloat _jsvGetFloatAndUnLock(JsVar *v) { JsVarFloat f = jsvGetFloat(v); jsvUnLock(v); return f; } static ALWAYS_INLINE bool _jsvGetBoolAndUnLock(JsVar *v) { bool b = jsvGetBool(v); jsvUnLock(v); return b; } diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 97cbb68feb..d6ce65266c 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1210,7 +1210,19 @@ void jswrap_e_dumpVariables() { } jsiConsolePrintf("%d,%d,%d,",ref,size,v->flags&JSV_VARTYPEMASK); if (jsvIsName(v)) jsiConsolePrintf("%q,",v); - else jsiConsolePrintf(",",v); + else if (jsvIsNumeric(v)) jsiConsolePrintf("Number %j,",v); + else if (jsvIsString(v)) { + JsVar *s; + if (jsvGetStringLength(v)>20) { + s = jsvNewFromStringVar(v, 0, 17); + jsvAppendString(s,"..."); + } else + s = jsvLockAgain(v); + jsiConsolePrintf("String %j,",s); + jsvUnLock(s); + } else if (jsvIsObject(v)) jsiConsolePrintf("Object,"); + else if (jsvIsArray(v)) jsiConsolePrintf("Array,"); + else jsiConsolePrintf(","); if (jsvHasSingleChild(v) || jsvHasChildren(v)) { JsVarRef childref = jsvGetFirstChild(v); From f3336a8412cabeb7f5d170d16ac036342b1c2be3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Jun 2022 17:02:26 +0100 Subject: [PATCH 0142/1183] update README --- README_JIT.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 3b259f3609..8fb9f74797 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -10,8 +10,11 @@ Works: * Assignments * Maths operators, postfix operators * Function calls +* Member access (with `.` or `[]`) * `for (;;)` loops * `if ()` +* `i++` / `++i` +* `~i`/`!i`/`+i`/`-i` * On the whole functions that can't be JITed will produce a message on the console and will be treated as normal functions. Doesn't work: @@ -19,18 +22,23 @@ Doesn't work: * Everything else * Function arguments * `var/const/let` -* Member access (with `.` or `[]`) Performance: -* Right now, variable accesses search for the variable each time - so this is pretty slow. Maybe they could all be referenced at the start just once? +* Right now, variable accesses search for the variable each time - so this is pretty slow. + * Maybe they could all be referenced at the start just once and stored on the stack? This could be an easy shortcut to get fast local vars too. + * If we did this we'd need to do a first pass, but the first pass *could* be used as quick way to see if the code was JITable + * We can't allocate them as we go because we have flow control though. + * We also have to worry about unlocking them all on exit if we reference them at the start + * We could also extend it to allow caching of constant field access, for instance 'console.log' * Built-in functions could be called directly, which would be a TON faster * Peephole optimisation could still be added (eg. removing `push r0, pop r0`) but this is the least of our worries * Stuff is in place to allow ints to be stored on the stack and converted when needed. This could maybe allow us to keep some vars as ints. +* When a function is called we load up the address as a 32 bit literal each time. We could maybe have a constant pool? +* When we emit code, we just use StringAppend which can be very slow. We should use an iterator (it's an easy win for compile performance) Big stuff to do: -* There seems to be a 'lock leak' - maybe on assignments * When calling a JIT function, using existing FunctionCall code to set up args and an execution scope (so args can be passed in) From 912aecb676c78e8fc0282775b46c7ad48c428a30 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Jun 2022 09:22:07 +0100 Subject: [PATCH 0143/1183] Puck.js Lite support --- ChangeLog | 1 + boards/PUCKJS_LITE.py | 185 +++++++++++++++++++++++++ libs/puckjs/jswrap_puck.c | 261 ++++++++++++++++++++++++----------- libs/puckjs/jswrap_puck.h | 7 +- targets/nrf5x_dfu/hardware.h | 7 +- targets/nrf5x_dfu/main.c | 17 +-- 6 files changed, 375 insertions(+), 103 deletions(-) create mode 100644 boards/PUCKJS_LITE.py diff --git a/ChangeLog b/ChangeLog index b1346afdf2..ec49c3bdb7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ nRF52: Added support for 2 concurrent Bluetooth Central connections to Puck.js, Pixl.js, MDBT42Q (fix #1360) Bangle.js2: JIT now built in (only enabled for functions prefixed '"jit"') E.dumpVariables now outputs more info for variable values + Puck.js Lite support 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/boards/PUCKJS_LITE.py b/boards/PUCKJS_LITE.py new file mode 100644 index 0000000000..7a44d20f1e --- /dev/null +++ b/boards/PUCKJS_LITE.py @@ -0,0 +1,185 @@ +#!/bin/false +# This file is part of Espruino, a JavaScript interpreter for Microcontrollers +# +# Copyright (C) 2013 Gordon Williams +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# ---------------------------------------------------------------------------------------- +# This file contains information for a specific board - the available pins, and where LEDs, +# Buttons, and other in-built peripherals are. It is used to build documentation as well +# as various source and header files for Espruino. +# ---------------------------------------------------------------------------------------- + +import pinutils; + +info = { + 'name' : "Puck.js Lite", + # The Puck.js lite can use the same firmware as normal, but the bootloader needs to know + # there's no LED3, so it can light up red instead of blue when connected + 'boardname' : "PUCKJS", + 'link' : [ "http://www.espruino.com/PuckJS" ], + 'default_console' : "EV_SERIAL1", + 'default_console_tx' : "D28", + 'default_console_rx' : "D29", + 'default_console_baudrate' : "9600", + 'variables' : 2630, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. + 'bootloader' : 1, + 'binary_name' : 'espruino_%v_puckjs_lite.hex', + 'build' : { + 'optimizeflags' : '-Os', + 'libraries' : [ + 'BLUETOOTH', + 'NET', + 'GRAPHICS', + 'CRYPTO','SHA256',#'SHA512', + 'AES', + 'NFC', + 'NEOPIXEL', + #'FILESYSTEM' + #'TLS' + ], + 'makefile' : [ + 'DEFINES+=-DPUCKJS_LITE', + 'DEFINES+=-DHAL_NFC_ENGINEERING_BC_FTPAN_WORKAROUND=1', # Looks like proper production nRF52s had this issue + # 'DEFINES+=-DCONFIG_GPIO_AS_PINRESET', # reset isn't being used, so let's just have an extra IO (needed for Puck.js V2) + 'DEFINES+=-DESPR_DCDC_ENABLE', # Ensure DCDC converter is enabled + 'DEFINES += -DNEOPIXEL_SCK_PIN=22 -DNEOPIXEL_LRCK_PIN=16', # SCK pin needs defining as something unused for neopixel (HW errata means they can't be disabled) see https://github.com/espruino/Espruino/issues/2071 + 'DEFINES += -DNRF_BLE_GATT_MAX_MTU_SIZE=53 -DNRF_BLE_MAX_MTU_SIZE=53', # increase MTU from default of 23 + 'DEFINES += -DCENTRAL_LINK_COUNT=2 -DNRF_SDH_BLE_CENTRAL_LINK_COUNT=2', # allow two outgoing connections at once + 'LDFLAGS += -Xlinker --defsym=LD_APP_RAM_BASE=0x3290', # set RAM base to match MTU=53 + CENTRAL_LINK_COUNT=2 + 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"Puck.js"\'', + 'DEFINES+=-DCUSTOM_GETBATTERY=jswrap_puck_getBattery', + 'DEFINES+=-DNFC_DEFAULT_URL=\'"https://puck-js.com/go"\'', + 'DEFINES+=-DAPP_TIMER_OP_QUEUE_SIZE=3', # Puck.js magnetometer poll + 'DFU_PRIVATE_KEY=targets/nrf5x_dfu/dfu_private_key.pem', + 'DFU_SETTINGS=--application-version 0xff --hw-version 52 --sd-req 0x8C,0x91', + 'INCLUDE += -I$(ROOT)/libs/puckjs', + 'WRAPPERSOURCES += libs/puckjs/jswrap_puck.c' + ] + } +}; + +chip = { + 'part' : "NRF52832", + 'family' : "NRF52", + 'package' : "QFN48", + 'ram' : 64, + 'flash' : 512, + 'speed' : 64, + 'usart' : 1, + 'spi' : 1, + 'i2c' : 1, + 'adc' : 1, + 'dac' : 0, + 'saved_code' : { + 'address' : ((118 - 10) * 4096), # Bootloader takes pages 120-127, FS takes 118-119 + 'page_size' : 4096, + 'pages' : 10, + 'flash_available' : 512 - ((31 + 8 + 2 + 10)*4) # Softdevice uses 31 pages of flash, bootloader 8, FS 2, code 10. Each page is 4 kb. + }, +}; + +devices = { + 'LED1' : { 'pin' : 'D5' }, + 'LED2' : { 'pin' : 'D4' }, +# 'LED3' : { 'pin' : 'D3' }, # Disabled on Puck.js Lite + 'IR' : { 'pin_anode' : 'D25', # on v2 this just goes to a FET + 'pin_cathode' : 'D26' # on v2 this is the powered output named 'FET' + }, + 'BTN1' : { 'pin' : 'D0', 'pinstate' : 'IN_PULLDOWN' }, + 'CAPSENSE' : { 'pin_rx' : 'D11', 'pin_tx' : 'D12' }, + 'NFC': { 'pin_a':'D9', 'pin_b':'D10' }, + 'MAG': { 'device': 'LIS3MDL', 'addr' : 30, # v2.0 + 'pin_pwr':'D18', + 'pin_int':'D17', + 'pin_sda':'D20', + 'pin_scl':'D19', + 'pin_drdy':'D21', + }, + 'ACCEL': { 'device': 'LSM6DS3TR', 'addr' : 106, # v2.0 +# 'pin_pwr':'D16', # can't actually power this from an IO pin due to undocumented, massive power draw on startup + 'pin_int':'D13', + 'pin_sda':'D14', + 'pin_scl':'D15' }, + 'TEMP': { 'device': 'PCT2075TP', 'addr' : 78, # v2.0 + 'pin_pwr':'D8', + 'pin_sda':'D7', + 'pin_scl':'D6' } + + # Pin D22 is used for clock when driving neopixels - as not specifying a pin seems to break things +}; + +# left-right, or top-bottom order +board = { + 'bottom' : [ 'D28', 'D29', 'D30', 'D31'], + 'right' : [ 'GND', '3V', 'D2', 'D1' ], + 'left2' : [ 'D6','D7','D8','D11','D13','D14','D16','D23','D24','D27' ], + 'right2' : [ 'D15' ], + '_notes' : { + 'D11' : "Capacitive sense. D12 is connected to this pin via a 1 MOhm resistor", + 'D28' : "If pulled up to 1 on startup, D28 and D29 become Serial1", + 'D22' : "This is used as SCK when driving Neopixels, and will output a signal when 'require('neopixel').write' is called", + 'D16' : "This is used as LRCK when driving Neopixels, and will output a signal when 'require('neopixel').write' is called" + } +}; + +board["_css"] = """ +#board { + width: 800px; + height: 800px; + top: 0px; + left : 0px; + background-image: url(img/PUCKJS_.jpg); +} +#boardcontainer { + height: 900px; +} +#bottom { + top: 639px; + left: 291px; +} +#right { + top: 304px; + left: 640px; +} + +.bottompin { width: 46px; } +.rightpin { height: 51px; } +.pinD6 { position:absolute; left: 560px; top: 419px;} +.pinD7 { position:absolute; left: 548px; top: 369px;} +.pinD8 { position:absolute; left: 512px; top: 398px;} +.pinD11 { position:absolute; left: 586px; top: 236px;} +.pinD13 { position:absolute; left: 500px; top: 293px;} +.pinD14 { position:absolute; left: 523px; top: 270px;} +.pinD15 { position:absolute; right: -483px; top: 268px;} +.pinD16 { position:absolute; left: 499px; top: 244px;} +.pinD23 { position:absolute; left: 157px; top: 438px;} +.pinD24 { position:absolute; left: 157px; top: 382px;} +.pinD27 { position:absolute; left: 244px; top: 581px;} +"""; + +def get_pins(): + pins = pinutils.generate_pins(0,31) # 32 General Purpose I/O Pins. + pinutils.findpin(pins, "PD0", True)["functions"]["XL1"]=0; + pinutils.findpin(pins, "PD1", True)["functions"]["XL2"]=0; + pinutils.findpin(pins, "PD9", True)["functions"]["NFC1"]=0; + pinutils.findpin(pins, "PD10", True)["functions"]["NFC2"]=0; + pinutils.findpin(pins, "PD2", True)["functions"]["ADC1_IN0"]=0; + pinutils.findpin(pins, "PD3", True)["functions"]["ADC1_IN1"]=0; + pinutils.findpin(pins, "PD4", True)["functions"]["ADC1_IN2"]=0; + pinutils.findpin(pins, "PD5", True)["functions"]["ADC1_IN3"]=0; + pinutils.findpin(pins, "PD28", True)["functions"]["ADC1_IN4"]=0; + pinutils.findpin(pins, "PD28", True)["functions"]["USART1_TX"]=0; + pinutils.findpin(pins, "PD29", True)["functions"]["USART1_RX"]=0; + pinutils.findpin(pins, "PD29", True)["functions"]["ADC1_IN5"]=0; + pinutils.findpin(pins, "PD30", True)["functions"]["ADC1_IN6"]=0; + pinutils.findpin(pins, "PD31", True)["functions"]["ADC1_IN7"]=0; + # everything is non-5v tolerant + for pin in pins: + pin["functions"]["3.3"]=0; + + #The boot/reset button will function as a reset button in normal operation. Pin reset on PD21 needs to be enabled on the nRF52832 device for this to work. + return pins diff --git a/libs/puckjs/jswrap_puck.c b/libs/puckjs/jswrap_puck.c index 2a9cdac728..5c8f6a4fb2 100644 --- a/libs/puckjs/jswrap_puck.c +++ b/libs/puckjs/jswrap_puck.c @@ -49,6 +49,12 @@ const Pin PUCK_IO_PINS[] = {1,2,4,6,7,8,23,24,28,29,30,31}; #define IR_FET_PIN 27 // Puck v2 #define FET_PIN 26 // Puck v2 +// For Puck.js lite we don't define LED3, for the bootloader's sake - but we define it here so we can self-test it's not connected +#ifndef LED3_PININDEX +#define LED3_PININDEX 3 +#define LED3_ONSTATE 1 +#endif + bool mag_enabled = false; //< Has the magnetometer been turned on? int16_t mag_reading[3]; //< magnetometer xyz reading //int mag_zero[3]; //< magnetometer 'zero' reading, only for Puck 2.1 right now @@ -75,10 +81,25 @@ JsVar *jswrap_puck_getHardwareVersion() { case PUCKJS_1V0: return jsvNewFromInteger(1); case PUCKJS_2V0: return jsvNewFromInteger(2); case PUCKJS_2V1: return jsvNewFromFloat(2.1); + case PUCKJS_LITE_1V0: return jsvNewFromString("Lite 1"); default: return NULL; } } +const char *jswrap_puck_getHardwareVersionString() { + switch (puckVersion) { + case PUCKJS_1V0: return "1"; + case PUCKJS_2V0: return "2"; + case PUCKJS_2V1: return "2.1"; + case PUCKJS_LITE_1V0: return "Lite 1"; + default: return "(Unknown Version)"; + } +} + +void jswrap_puck_notAvailableException(const char *hardware) { + jsExceptionHere(JSET_ERROR, "%s not available on Puck.js %s", hardware, jswrap_puck_getHardwareVersionString()); +} + JsVar *to_xyz(int16_t d[3], double scale) { JsVar *obj = jsvNewObject(); if (!obj) return 0; @@ -345,7 +366,7 @@ bool mag_on(int milliHz, bool instant) { if (!instant) // if we're instant, don't start a timer as we just want to read in the main thread app_timer_start(m_poll_timer_id, APP_TIMER_TICKS(1000000 / milliHz, APP_TIMER_PRESCALER), NULL); } else { - jsWarn("Unknown Puck version!"); + // not supported return false; } @@ -601,6 +622,11 @@ varies from around 25-60 uT, so the reading will vary by 250 to 600 depending on location. */ JsVar *jswrap_puck_mag() { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return 0; + } + /* If not enabled, turn on and read. If enabled, * just pass out the last reading */ if (!mag_enabled) { @@ -635,6 +661,10 @@ The reading obtained is an integer (so no decimal places), but the sensitivity i offset isn't - so absolute readings may still need calibrating. */ JsVarFloat jswrap_puck_magTemp() { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return NAN; + } int t; if (!mag_enabled) { mag_on(0, true /*instant*/); // takes a reading right away @@ -725,6 +755,10 @@ for more information. */ void jswrap_puck_magOn(JsVarFloat hz) { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return; + } if (mag_enabled) { jswrap_puck_magOff(); // wait 1ms for power-off @@ -758,6 +792,10 @@ void jswrap_puck_magOn(JsVarFloat hz) { Turn the magnetometer off */ void jswrap_puck_magOff() { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return; + } if (mag_enabled) { if (puckVersion == PUCKJS_1V0) { jshPinWatch(MAG_PIN_INT, false, JSPW_NONE); @@ -786,6 +824,10 @@ Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js for more information and links to modules that use this function. */ void jswrap_puck_magWr(JsVarInt reg, JsVarInt data) { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return; + } mag_wr(reg, data); } @@ -806,6 +848,10 @@ Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js for more information and links to modules that use this function. */ int jswrap_puck_magRd(JsVarInt reg) { + if (!PUCKJS_HAS_MAG) { + jswrap_puck_notAvailableException("Magnetometer"); + return -1; + } unsigned char buf[1]; mag_rd(reg, buf, 1); return buf[0]; @@ -906,7 +952,7 @@ for more information. */ void jswrap_puck_accelOn(JsVarFloat hz) { if (!PUCKJS_HAS_ACCEL) { - jsExceptionHere(JSET_ERROR, "Not available on Puck.js v1"); + jswrap_puck_notAvailableException("Accelerometer"); return; } if (accel_enabled) { @@ -937,7 +983,7 @@ for more information. */ void jswrap_puck_accelOff() { if (!PUCKJS_HAS_ACCEL) { - jsExceptionHere(JSET_ERROR, "Not available on Puck.js v1"); + jswrap_puck_notAvailableException("Accelerometer"); return; } if (accel_enabled) { @@ -965,6 +1011,10 @@ The values reported are the raw values from the chip. In normal configuration: If taking more than one reading, we'd suggest you use `Puck.accelOn()` and the `Puck.accel` event. */ JsVar *jswrap_puck_accel() { + if (!PUCKJS_HAS_ACCEL) { + jswrap_puck_notAvailableException("Accelerometer"); + return 0; + } /* If not enabled, turn on and read. If enabled, * just pass out the last reading */ if (!accel_enabled) { @@ -997,7 +1047,7 @@ for more information and links to modules that use this function. */ void jswrap_puck_accelWr(JsVarInt reg, JsVarInt data) { if (!PUCKJS_HAS_ACCEL) { - jsExceptionHere(JSET_ERROR, "Not available on Puck.js v1"); + jswrap_puck_notAvailableException("Accelerometer"); return; } unsigned char buf[2]; @@ -1024,7 +1074,7 @@ for more information and links to modules that use this function. */ int jswrap_puck_accelRd(JsVarInt reg) { if (!PUCKJS_HAS_ACCEL) { - jsExceptionHere(JSET_ERROR, "Not available on Puck.js v1"); + jswrap_puck_notAvailableException("Accelerometer"); return -1; } unsigned char buf[1]; @@ -1081,6 +1131,10 @@ void _jswrap_puck_IR_done(JsSysTime t, void *data) { jshPinSetState(cathode, JSHPINSTATE_GPIO_IN); } void jswrap_puck_IR(JsVar *data, Pin cathode, Pin anode) { + if (!PUCKJS_HAS_IR) { + jswrap_puck_notAvailableException("IR"); + return; + } if (!jsvIsIterable(data)) { jsExceptionHere(JSET_TYPEERROR, "Expecting an array, got %t", data); return; @@ -1168,6 +1222,10 @@ When not supplying pins, Puck.js uses an internal resistor between D12(tx) and D11(rx). */ int jswrap_puck_capSense(Pin tx, Pin rx) { + if (!PUCKJS_HAS_CAPSENSE) { + jswrap_puck_notAvailableException("Capacitive sense"); + return 0; + } if (jshIsPinValid(tx) && jshIsPinValid(rx)) { return (int)nrf_utils_cap_sense(tx, rx); } @@ -1311,7 +1369,7 @@ bool jswrap_puck_selfTest() { // light up all LEDs white jshPinOutput(LED1_PININDEX, LED1_ONSTATE); jshPinOutput(LED2_PININDEX, LED2_ONSTATE); - jshPinOutput(LED3_PININDEX, LED3_ONSTATE); + if (PUCKJS_HAS_LED3) jshPinOutput(LED3_PININDEX, LED3_ONSTATE); jshPinSetState(BTN1_PININDEX, BTN1_PINSTATE); timeout = 2000; @@ -1325,7 +1383,7 @@ bool jswrap_puck_selfTest() { nrf_delay_ms(100); jshPinInput(LED1_PININDEX); jshPinInput(LED2_PININDEX); - jshPinInput(LED3_PININDEX); + if (PUCKJS_HAS_LED3) jshPinInput(LED3_PININDEX); nrf_delay_ms(500); @@ -1349,68 +1407,74 @@ bool jswrap_puck_selfTest() { ok = false; } - jshPinSetState(LED3_PININDEX, JSHPINSTATE_GPIO_IN_PULLUP); - nrf_delay_ms(1); - v = jshPinAnalog(LED3_PININDEX); - jshPinSetState(LED3_PININDEX, JSHPINSTATE_GPIO_IN); - if (v<0.55 || v>0.90) { - if (!err[0]) strcpy(err,"LD3"); - jsiConsolePrintf("LED3 pullup voltage out of range (%f) - disconnected?\n", v); - ok = false; - } - - jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_IN_PULLDOWN); - jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_OUT); - jshPinSetValue(IR_CATHODE_PIN, 1); - nrf_delay_ms(1); - if (jshPinGetValue(IR_ANODE_PIN)) { - if (!err[0]) strcpy(err,"IRs"); - jsiConsolePrintf("IR LED wrong way around/shorted?\n"); - ok = false; - } - - - if (PUCKJS_HAS_IR_FET) { - jshPinSetValue(IR_FET_PIN, 0); - jshPinSetState(IR_FET_PIN, JSHPINSTATE_GPIO_OUT); - jshPinSetState(IR_INPUT_PIN, JSHPINSTATE_GPIO_IN_PULLUP); + if (PUCKJS_HAS_LED3) { + jshPinSetState(LED3_PININDEX, JSHPINSTATE_GPIO_IN_PULLUP); nrf_delay_ms(1); - if (!jshPinGetValue(IR_INPUT_PIN)) { - if (!err[0]) strcpy(err,"IRs"); - jsiConsolePrintf("IR LED short?\n"); + v = jshPinAnalog(LED3_PININDEX); + jshPinSetState(LED3_PININDEX, JSHPINSTATE_GPIO_IN); + if (v<0.55 || v>0.90) { + if (!err[0]) strcpy(err,"LD3"); + jsiConsolePrintf("LED3 pullup voltage out of range (%f) - disconnected?\n", v); ok = false; } - jshPinSetValue(IR_FET_PIN, 1); + } + + if (PUCKJS_HAS_IR) { + jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_IN_PULLDOWN); + jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_OUT); + jshPinSetValue(IR_CATHODE_PIN, 1); nrf_delay_ms(1); - if (jshPinGetValue(IR_INPUT_PIN)) { - if (!err[0]) strcpy(err,"IRF"); - jsiConsolePrintf("IR FET disconnected?\n"); + if (jshPinGetValue(IR_ANODE_PIN)) { + if (!err[0]) strcpy(err,"IRs"); + jsiConsolePrintf("IR LED wrong way around/shorted?\n"); ok = false; } - jshPinSetState(IR_INPUT_PIN, JSHPINSTATE_GPIO_IN); - jshPinSetValue(IR_FET_PIN, 0); - } else { - jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_IN_PULLDOWN); - jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_OUT); - jshPinSetValue(IR_ANODE_PIN, 1); - nrf_delay_ms(1); - if (!jshPinGetValue(IR_CATHODE_PIN)) { - if (!err[0]) strcpy(err,"IRd"); - jsiConsolePrintf("IR LED disconnected?\n"); - ok = false; + + + if (PUCKJS_HAS_IR_FET) { + jshPinSetValue(IR_FET_PIN, 0); + jshPinSetState(IR_FET_PIN, JSHPINSTATE_GPIO_OUT); + jshPinSetState(IR_INPUT_PIN, JSHPINSTATE_GPIO_IN_PULLUP); + nrf_delay_ms(1); + if (!jshPinGetValue(IR_INPUT_PIN)) { + if (!err[0]) strcpy(err,"IRs"); + jsiConsolePrintf("IR LED short?\n"); + ok = false; + } + jshPinSetValue(IR_FET_PIN, 1); + nrf_delay_ms(1); + if (jshPinGetValue(IR_INPUT_PIN)) { + if (!err[0]) strcpy(err,"IRF"); + jsiConsolePrintf("IR FET disconnected?\n"); + ok = false; + } + jshPinSetState(IR_INPUT_PIN, JSHPINSTATE_GPIO_IN); + jshPinSetValue(IR_FET_PIN, 0); + } else { + jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_IN_PULLDOWN); + jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_OUT); + jshPinSetValue(IR_ANODE_PIN, 1); + nrf_delay_ms(1); + if (!jshPinGetValue(IR_CATHODE_PIN)) { + if (!err[0]) strcpy(err,"IRd"); + jsiConsolePrintf("IR LED disconnected?\n"); + ok = false; + } } - } - jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_IN); - jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_IN); + jshPinSetState(IR_ANODE_PIN, JSHPINSTATE_GPIO_IN); + jshPinSetState(IR_CATHODE_PIN, JSHPINSTATE_GPIO_IN); + } - mag_on(0, true /*instant*/); // takes a reading right away - mag_off(); - mag_enabled = false; - if (mag_reading[0]==-1 && mag_reading[1]==-1 && mag_reading[2]==-1) { - if (!err[0]) strcpy(err,"MAG"); - jsiConsolePrintf("Magnetometer not working?\n"); - ok = false; + if (PUCKJS_HAS_MAG) { + mag_on(0, true /*instant*/); // takes a reading right away + mag_off(); + mag_enabled = false; + if (mag_reading[0]==-1 && mag_reading[1]==-1 && mag_reading[2]==-1) { + if (!err[0]) strcpy(err,"MAG"); + jsiConsolePrintf("Magnetometer not working?\n"); + ok = false; + } } if (PUCKJS_HAS_ACCEL) { @@ -1435,31 +1499,62 @@ bool jswrap_puck_selfTest() { } - jshPinSetState(CAPSENSE_TX_PIN, JSHPINSTATE_GPIO_OUT); - jshPinSetState(CAPSENSE_RX_PIN, JSHPINSTATE_GPIO_IN); - jshPinSetValue(CAPSENSE_TX_PIN, 1); - nrf_delay_ms(1); - if (!jshPinGetValue(CAPSENSE_RX_PIN)) { - if (!err[0]) strcpy(err,"CPu"); - jsiConsolePrintf("Capsense resistor disconnected? (pullup)\n"); - ok = false; - } - jshPinSetValue(CAPSENSE_TX_PIN, 0); - nrf_delay_ms(1); - if (jshPinGetValue(CAPSENSE_RX_PIN)) { - if (!err[0]) strcpy(err,"CPd"); - jsiConsolePrintf("Capsense resistor disconnected? (pulldown)\n"); - ok = false; + if (PUCKJS_HAS_CAPSENSE) { + jshPinSetState(CAPSENSE_TX_PIN, JSHPINSTATE_GPIO_OUT); + jshPinSetState(CAPSENSE_RX_PIN, JSHPINSTATE_GPIO_IN); + jshPinSetValue(CAPSENSE_TX_PIN, 1); + nrf_delay_ms(1); + if (!jshPinGetValue(CAPSENSE_RX_PIN)) { + if (!err[0]) strcpy(err,"CPu"); + jsiConsolePrintf("Capsense resistor disconnected? (pullup)\n"); + ok = false; + } + jshPinSetValue(CAPSENSE_TX_PIN, 0); + nrf_delay_ms(1); + if (jshPinGetValue(CAPSENSE_RX_PIN)) { + if (!err[0]) strcpy(err,"CPd"); + jsiConsolePrintf("Capsense resistor disconnected? (pulldown)\n"); + ok = false; + } + jshPinSetState(CAPSENSE_TX_PIN, JSHPINSTATE_GPIO_IN); } - jshPinSetState(CAPSENSE_TX_PIN, JSHPINSTATE_GPIO_IN); + /* If we don't have hardware here we still check the pins. The idea + * is maybe we have a Puck 2.1 where the Magnetometer is broken, so + * we think we have a Puck.js Lite. But then hopefully we check all + * the pins and we find something else (like LED3) is attached to + * a pin and forcing it low, and so we fail the test (as we should). + */ ok &= selftest_check_pin(1,err); ok &= selftest_check_pin(2,err); + if (!PUCKJS_HAS_LED3) { + ok &= selftest_check_pin(LED3_PININDEX,err); + } + if (!PUCKJS_HAS_IR) { + ok &= selftest_check_pin(IR_ANODE_PIN,err); + ok &= selftest_check_pin(IR_CATHODE_PIN,err); + } + if (!PUCKJS_HAS_CAPSENSE) { + ok &= selftest_check_pin(CAPSENSE_RX_PIN,err); + ok &= selftest_check_pin(CAPSENSE_TX_PIN,err); + } + if (!PUCKJS_HAS_MAG) { + ok &= selftest_check_pin(MAG_PIN_SDA,err); + ok &= selftest_check_pin(MAG_PIN_PWR,err); + ok &= selftest_check_pin(MAG_PIN_SCL,err); + ok &= selftest_check_pin(MAG_PIN_DRDY,err); + ok &= selftest_check_pin(MAG_PIN_INT,err); + } + if (!PUCKJS_HAS_ACCEL) { + ok &= selftest_check_pin(ACCEL_PIN_INT,err); + ok &= selftest_check_pin(ACCEL_PIN_SDA,err); + ok &= selftest_check_pin(ACCEL_PIN_SCL,err); + } if (!PUCKJS_HAS_TEMP_SENSOR) { - ok &= selftest_check_pin(6,err); - ok &= selftest_check_pin(7,err); - ok &= selftest_check_pin(8,err); + ok &= selftest_check_pin(TEMP_PIN_SCL,err); // 6 + ok &= selftest_check_pin(TEMP_PIN_SDA,err); // 7 + ok &= selftest_check_pin(TEMP_PIN_PWR,err); // 8 } ok &= selftest_check_pin(28,err); ok &= selftest_check_pin(29,err); @@ -1511,7 +1606,7 @@ void jswrap_puck_init() { jshDelayMicroseconds(2500); // 1.7ms from power on to ok // MAG3110 WHO_AM_I - for some reason we have to use this slightly odd SW I2C implementation for this unsigned char buf[2]; - puckVersion = PUCKJS_1V0; + puckVersion = PUCKJS_UNKNOWN; mag_rd(0x07, buf, 1); // MAG3110 WHO_AM_I //jsiConsolePrintf("MAG3110 %d\n", buf[0]); if (buf[0]!=0xC4 && buf[0]!=0x00) { // sometimes MAG3110 reports ID 0! @@ -1531,9 +1626,9 @@ void jswrap_puck_init() { if (buf[0] == 16) { puckVersion = PUCKJS_2V1; } else { - // uh-oh, no magnetometer found - jsWarn("No Magnetometer found"); - puckVersion = PUCKJS_UNKNOWN; + //jsiConsolePrintf("No magnetometer\n"); + // no magnetometer found - Puck.js lite! + puckVersion = PUCKJS_LITE_1V0; } } } else { diff --git a/libs/puckjs/jswrap_puck.h b/libs/puckjs/jswrap_puck.h index b24016a17b..4b0ffa838c 100644 --- a/libs/puckjs/jswrap_puck.h +++ b/libs/puckjs/jswrap_puck.h @@ -19,12 +19,17 @@ typedef enum { PUCKJS_1V0, // MAG3110 magnetometer PUCKJS_2V0, // LIS3MDLTR magnetometer, LSM6DS3TR-C accel/gyro, PCT2075TP temperature PUCKJS_2V1, // MMC5603NJ magnetometer, LSM6DS3TR-C accel/gyro, PCT2075TP temperature + PUCKJS_LITE_1V0, // R+G LED } PuckVersion; PuckVersion puckVersion; -#define PUCKJS_HAS_ACCEL (puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) +#define PUCKJS_HAS_LED3 (puckVersion==PUCKJS_1V0 || puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) +#define PUCKJS_HAS_MAG (puckVersion==PUCKJS_1V0 || puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) +#define PUCKJS_HAS_IR (puckVersion==PUCKJS_1V0 || puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) #define PUCKJS_HAS_IR_FET (puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) +#define PUCKJS_HAS_CAPSENSE (puckVersion==PUCKJS_1V0 || puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) +#define PUCKJS_HAS_ACCEL (puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) #define PUCKJS_HAS_TEMP_SENSOR (puckVersion==PUCKJS_2V0 || puckVersion==PUCKJS_2V1) JsVar *jswrap_puck_getHardwareVersion(); diff --git a/targets/nrf5x_dfu/hardware.h b/targets/nrf5x_dfu/hardware.h index e797e1f45f..92bf12a8f5 100644 --- a/targets/nrf5x_dfu/hardware.h +++ b/targets/nrf5x_dfu/hardware.h @@ -60,14 +60,15 @@ static void set_led_state(bool btn, bool progress) { #if defined(PIXLJS) || defined(BANGLEJS) // LED1 is backlight/HRM - don't use it! -#else -#if defined(LED2_PININDEX) && defined(LED3_PININDEX) +#elif defined(PUCKJS_LITE) + jshPinOutput(LED1_PININDEX, progress); + jshPinOutput(LED2_PININDEX, btn); +#elif defined(LED2_PININDEX) && defined(LED3_PININDEX) jshPinOutput(LED3_PININDEX, progress); jshPinOutput(LED2_PININDEX, btn); #elif defined(LED1_PININDEX) jshPinOutput(LED1_PININDEX, progress || btn); #endif -#endif } #ifdef BTN1_PININDEX diff --git a/targets/nrf5x_dfu/main.c b/targets/nrf5x_dfu/main.c index ac0ee1c531..be04ccf37e 100644 --- a/targets/nrf5x_dfu/main.c +++ b/targets/nrf5x_dfu/main.c @@ -45,22 +45,7 @@ #include "dfu_status.h" #endif - -#ifdef LED3_PININDEX -#define UPDATE_IN_PROGRESS_LED LED3_PININDEX /**< Led used to indicate that DFU is active. */ -#define UPDATE_IN_PROGRESS_LED_ONSTATE LED3_ONSTATE /**< Led used to indicate that DFU is active. */ -#else -#define UPDATE_IN_PROGRESS_LED LED1_PININDEX /**< Led used to indicate that DFU is active. */ -#define UPDATE_IN_PROGRESS_LED_ONSTATE LED1_ONSTATE /**< Led used to indicate that DFU is active. */ -#endif -#if defined(LED2_PININDEX) && !defined(LED2_NO_BOOTLOADER) -#define BOOTLOADER_BUTTON_PRESS_LED LED2_PININDEX /**< Led used to indicate that DFU is active. */ -#define BOOTLOADER_BUTTON_PRESS_LED_ONSTATE LED2_ONSTATE /**< Led used to indicate that DFU is active. */ -#else -#define BOOTLOADER_BUTTON_PRESS_LED LED1_PININDEX /**< Led used to indicate that DFU is active. */ -#define BOOTLOADER_BUTTON_PRESS_LED_ONSTATE LED1_ONSTATE /**< Led used to indicate that DFU is active. */ -#endif -// Other LED is set in targetlibs/nrf5x/nrf5_sdk/components/libraries/bootloader_dfu/dfu_transport_ble.c (currently LED1) +// LEDs to use are defined in set_led_state in hardware.h /// Set up when DFU is connected to static bool dfuIsConnected = false; From d61d951ccc96d6e885d487afaa72c48dadc65cf2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Jun 2022 11:59:50 +0100 Subject: [PATCH 0144/1183] Initial commit of code to put variables on the stack (not reference them each time). This works: var test = "Hello ", test2 = "world"; function jit() {'jit';return test+test+test2;} But a for loop asserts with an error about the stack depth being wrong. It's probably some code I didn't gate with EMIT --- README_JIT.md | 15 ++ src/jsjit.c | 499 +++++++++++++++++++++++++++++++------------------- src/jsjitc.c | 126 +++++++++---- src/jsjitc.h | 27 +++ src/jsparse.c | 1 - 5 files changed, 434 insertions(+), 234 deletions(-) diff --git a/README_JIT.md b/README_JIT.md index 8fb9f74797..5bb2a78e0c 100644 --- a/README_JIT.md +++ b/README_JIT.md @@ -190,6 +190,21 @@ echo ASBL8Kz7AbQBvHBH | base64 -d > jit.bin arm-none-eabi-objdump -D -Mforce-thumb -b binary -m cortex-m4 jit.bin ``` +Seeing what GCC does: + +``` +// test.c +void main() { + int data[400]; + volatile int x = data[1]; +} +``` + +``` +arm-none-eabi-gcc -Os -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles test.c +arm-none-eabi-objdump -D -Mforce-thumb -m cortex-m4 a.out +``` + ## Useful links diff --git a/src/jsjit.c b/src/jsjit.c index 5507874b8f..0908523f94 100644 --- a/src/jsjit.c +++ b/src/jsjit.c @@ -62,31 +62,80 @@ void jsjPopNoName(int reg) { if (reg != 0) jsjcMov(reg, 0); } +/// Code to add at the beginning of the function +void jsjFunctionStart() { + jsjcDebugPrintf("; Function start\n"); + jsjcPushAll(); // Function start - push all registers since we're not meant to mess with r4..r7 +} + +/// Code to add right at the end of the function (or when we return) +void jsjFunctionReturn(bool isReturnStatement) { + jsjcDebugPrintf("; Function return\n"); + int oldStackDepth = jit.stackDepth; + if (jit.varCount) { + jsjcMov(4, 0); // save r0 (return value) + jsjcMov(1, JSJAR_SP); + jsjcLiteral32(0, jit.stackDepth); + jsjcCall(jsvUnLockMany); + jsjcAddSP(4*jit.varCount); // pop off anything on the stack + jsjcMov(0, 4); // restore r0 + } + // actual stack depth is stackDepth but at this point varCount==stackDepth we hope + // and if not an assert will catch us + jsjcPopAllAndReturn(); // pop r4...r7 + // If it's a return, put stack depth back where it was + // so it's correct for the rest of the code + if (isReturnStatement) + jit.stackDepth = oldStackDepth; +} + void jsjFactor() { if (lex->tk==LEX_ID) { JsVar *a = jslGetTokenValueAsVar(); - jsjcLiteralString(0, a, true); // null terminated - jsvUnLock(a); JSP_ASSERT_MATCH(LEX_ID); - jsjcCall(jspGetNamedVariable); - jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here + // search for var in our list... + JsVar *varIndex = jsvFindChildFromVar(jit.vars, a, true/*addIfNotFound*/); + JsVar *varIndexVal = jsvSkipName(varIndex); + if (jit.phase == JSJP_SCAN && jsvIsUndefined(varIndexVal)) { + jsjcDebugPrintf("; Find Variable %j\n",a); + // We don't have it yet - create a var list entry + varIndexVal = jsvNewFromInteger(jit.varCount++); + jsvSetValueOfName(varIndex, varIndexVal); + // Add the init code to push the var + jsjcLiteralString(0, a, true); // null terminated + jsjcCall(jspGetNamedVariable); + jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here + } + // Now, we have the var already - just reference it + int varIndexI = jsvGetIntegerAndUnLock(varIndexVal); + if (jit.phase == JSJP_EMIT) { + jsjcDebugPrintf("; Variable %j\n",a); + jsjcLoadImm(0, JSJAR_SP, (jit.stackDepth - (varIndexI+1)) * 4); + jsjcCall(jsvLockAgain); + jsjcPush(0, JSJVT_JSVAR); // We're pushing a NAME here + } + jsvUnLock2(varIndex,a); } else if (lex->tk==LEX_INT) { int64_t v = stringToInt(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_INT); - if (v>>32) { - jsjcLiteral64(0, (uint64_t)v); - jsjcCall(jsvNewFromLongInteger); - } else { - jsjcLiteral32(0, (uint32_t)v); - jsjcCall(jsvNewFromInteger); + if (jit.phase == JSJP_EMIT) { + if (v>>32) { + jsjcLiteral64(0, (uint64_t)v); + jsjcCall(jsvNewFromLongInteger); + } else { + jsjcLiteral32(0, (uint32_t)v); + jsjcCall(jsvNewFromInteger); + } + jsjcPush(0, JSJVT_JSVAR); // FIXME - push an int and convert later } - jsjcPush(0, JSJVT_JSVAR); // FIXME - push an int and convert later } else if (lex->tk==LEX_FLOAT) { double v = stringToFloat(jslGetTokenValueAsString()); JSP_ASSERT_MATCH(LEX_FLOAT); - jsjcLiteral64(0, *((uint64_t*)&v)); - jsjcCall(jsvNewFromFloat); - jsjcPush(0, JSJVT_JSVAR); + if (jit.phase == JSJP_EMIT) { + jsjcLiteral64(0, *((uint64_t*)&v)); + jsjcCall(jsvNewFromFloat); + jsjcPush(0, JSJVT_JSVAR); + } } else if (lex->tk=='(') { JSP_ASSERT_MATCH('('); // Just parse a normal expression (which can include commas) @@ -94,27 +143,35 @@ void jsjFactor() { // FIXME: Arrow functions?? JSP_MATCH(')'); } else if (lex->tk==LEX_R_TRUE || lex->tk==LEX_R_FALSE) { - jsjcLiteral32(0, lex->tk==LEX_R_TRUE); + if (jit.phase == JSJP_EMIT) { + jsjcLiteral32(0, lex->tk==LEX_R_TRUE); + jsjcCall(jsvNewFromBool); + jsjcPush(0, JSJVT_JSVAR); + } JSP_ASSERT_MATCH(lex->tk); - jsjcCall(jsvNewFromBool); - jsjcPush(0, JSJVT_JSVAR); } else if (lex->tk==LEX_R_NULL) { JSP_ASSERT_MATCH(LEX_R_NULL); - jsjcLiteral32(0, JSV_NULL); - jsjcCall(jsvNewWithFlags); - jsjcPush(0, JSJVT_JSVAR); + if (jit.phase == JSJP_EMIT) { + jsjcLiteral32(0, JSV_NULL); + jsjcCall(jsvNewWithFlags); + jsjcPush(0, JSJVT_JSVAR); + } } else if (lex->tk==LEX_R_UNDEFINED) { JSP_ASSERT_MATCH(LEX_R_UNDEFINED); - jsjcLiteral32(0, 0); - jsjcPush(0, JSJVT_JSVAR); + if (jit.phase == JSJP_EMIT) { + jsjcLiteral32(0, 0); + jsjcPush(0, JSJVT_JSVAR); + } } else if (lex->tk==LEX_STR) { JsVar *a = jslGetTokenValueAsVar(); JSP_ASSERT_MATCH(LEX_STR); - int len = jsjcLiteralString(1, a, false); + if (jit.phase == JSJP_EMIT) { + int len = jsjcLiteralString(1, a, false); + jsjcLiteral32(0, len); + jsjcCall(jsvNewStringOfLength); + jsjcPush(0, JSJVT_JSVAR); + } jsvUnLock(a); - jsjcLiteral32(0, len); - jsjcCall(jsvNewStringOfLength); - jsjcPush(0, JSJVT_JSVAR); }/* else if (lex->tk=='{') { if (!jspCheckStackPosition()) return 0; return jsjFactorObject(); @@ -136,10 +193,12 @@ void jsjFactor() { return jsjFactorTypeOf(); } */else if (lex->tk==LEX_R_VOID) { JSP_ASSERT_MATCH(LEX_R_VOID); - jsjUnaryExpression(); - jsjcCall(jsvUnLock); - jsjcLiteral32(0, 0); - jsjcPush(0, JSJVT_JSVAR); + if (jit.phase == JSJP_EMIT) { + jsjUnaryExpression(); + jsjcCall(jsvUnLock); + jsjcLiteral32(0, 0); + jsjcPush(0, JSJVT_JSVAR); + } } else JSP_MATCH(LEX_EOF); } @@ -211,13 +270,16 @@ bool jsjFactorMember() { if (lex->tk == '.') { // ------------------------------------- Record Access JSP_ASSERT_MATCH('.'); if (jslIsIDOrReservedWord()) { - JsVar *a = jslGetTokenValueAsVar(); - jsjcLiteralString(0, a, true); // null terminated - jsvUnLock(a); - // r0 = string pointer + if (jit.phase == JSJP_EMIT) { + JsVar *a = jslGetTokenValueAsVar(); + jsjcLiteralString(0, a, true); // null terminated + jsvUnLock(a); + // r0 = string pointer + jsjcCall(jsvNewFromString); + // r0 = index (as JsVar) + } jslGetNextToken(); // skip over current token (we checked above that it was an ID or reserved word) - jsjcCall(jsvNewFromString); - // r0 = index (as JsVar) + } else { // incorrect token - force a match fail by asking for an ID JSP_MATCH_WITH_RETURN(LEX_ID, false); // if we fail we're stopping compilation anyway @@ -225,21 +287,25 @@ bool jsjFactorMember() { } else if (lex->tk == '[') { // ------------------------------------- Array Access JSP_ASSERT_MATCH('['); jsjAssignmentExpression(); - jsjcPop(0); - jsjcCall(jsvAsArrayIndexAndUnLock); + if (jit.phase == JSJP_EMIT) { + jsjcPop(0); + jsjcCall(jsvAsArrayIndexAndUnLock); + } JSP_MATCH_WITH_RETURN(']', false); // if we fail we're stopping compilation anyway // r0 = index } else { assert(0); } - // r0 currently = index - if (parentOnStack) jsjcPop(1); // r1 = parent - else jsjcLiteral32(1, 0); - jsjcPop(2); // r2 = the variable itself - jsjcCall(_jsjxObjectLookup); // (a,parent) = _jsjxObjectLookup(index, parent, a) - jsjcPush(0, JSJVT_JSVAR); // a - jsjcPush(1, JSJVT_JSVAR); // parent - parentOnStack = true; + if (jit.phase == JSJP_EMIT) { + // r0 currently = index + if (parentOnStack) jsjcPop(1); // r1 = parent + else jsjcLiteral32(1, 0); + jsjcPop(2); // r2 = the variable itself + jsjcCall(_jsjxObjectLookup); // (a,parent) = _jsjxObjectLookup(index, parent, a) + jsjcPush(0, JSJVT_JSVAR); // a + jsjcPush(1, JSJVT_JSVAR); // parent + parentOnStack = true; + } } return parentOnStack; } @@ -250,14 +316,16 @@ void jsjFactorFunctionCall() { // FIXME: what about 'new'? while (lex->tk=='(' /*|| (isConstructor && JSP_SHOULD_EXECUTE))*/ && JSJ_PARSING) { - if (parentOnStack) { - DEBUG_JIT("; FUNCTION CALL r6 = 'this'\n"); - jsjcPop(6); // r6 = this/parent - parentOnStack = false; + if (jit.phase == JSJP_EMIT) { + if (parentOnStack) { + DEBUG_JIT("; FUNCTION CALL r6 = 'this'\n"); + jsjcPop(6); // r6 = this/parent + parentOnStack = false; + } + DEBUG_JIT("; FUNCTION CALL r4 = funcName\n"); + jsjcPop(4); // r4 = funcName + DEBUG_JIT("; FUNCTION CALL arguments\n"); } - DEBUG_JIT("; FUNCTION CALL r4 = funcName\n"); - jsjcPop(4); // r4 = funcName - DEBUG_JIT("; FUNCTION CALL arguments\n"); /* PARSE OUR ARGUMENTS * Push each new argument onto the stack (it grows down) * Args are in the wrong order, so we emit code to swap around the args in the array @@ -272,46 +340,50 @@ void jsjFactorFunctionCall() { while (JSJ_PARSING && lex->tk!=')' && lex->tk!=LEX_EOF) { argCount++; jsjAssignmentExpression(); - jsjPopNoName(0); - jsjcPush(0, JSJVT_JSVAR); // push argument to stack + if (jit.phase == JSJP_EMIT) { + jsjPopNoName(0); + jsjcPush(0, JSJVT_JSVAR); // push argument to stack + } if (lex->tk!=')') JSP_MATCH(','); } JSP_MATCH(')'); - // r4=funcName, args on the stack - jsjcMov(7, JSJAR_SP); // r7 = argPtr - jsjcPush(7, JSJVT_INT); // argPtr (6th arg - on stack) - // Args are in the wrong order - we have to swap them around if we have >1! - if (argCount>1) { - DEBUG_JIT("; FUNCTION CALL reverse arguments\n"); - for (int i=0;i1! + if (argCount>1) { + DEBUG_JIT("; FUNCTION CALL reverse arguments\n"); + for (int i=0;itk==LEX_PLUSPLUS || lex->tk==LEX_MINUSMINUS) { int op = lex->tk; // POSFIX expression => i++, i-- JSP_ASSERT_MATCH(op); - jsjPopAsVar(0); // old value -> r0 - jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation - jsjcCall(_jsxPostfixIncDec); // JsVar *_jsxPostfixIncDec(JsVar *var, char op) - jsjcPush(0, JSJVT_JSVAR); // push result (value BEFORE we inc/dec) + if (jit.phase == JSJP_EMIT) { + jsjPopAsVar(0); // old value -> r0 + jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation + jsjcCall(_jsxPostfixIncDec); // JsVar *_jsxPostfixIncDec(JsVar *var, char op) + jsjcPush(0, JSJVT_JSVAR); // push result (value BEFORE we inc/dec) + } } } @@ -332,11 +406,13 @@ void jsjPostfixExpression() { // PREFIX expression => ++i, --i int op = lex->tk; JSP_ASSERT_MATCH(op); - jsjPostfixExpression(); // recurse to get our var... - jsjPopAsVar(0); // old value -> r0 - jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation - jsjcCall(_jsxPrefixIncDec); // JsVar *_jsxPrefixIncDec(JsVar *var, char op) - jsjcPush(0, JSJVT_JSVAR); // push result (value AFTER we inc/dec) + if (jit.phase == JSJP_EMIT) { + jsjPostfixExpression(); // recurse to get our var... + jsjPopAsVar(0); // old value -> r0 + jsjcLiteral32(1, op==LEX_PLUSPLUS ? '+' : '-'); // add the operation + jsjcCall(_jsxPrefixIncDec); // JsVar *_jsxPrefixIncDec(JsVar *var, char op) + jsjcPush(0, JSJVT_JSVAR); // push result (value AFTER we inc/dec) + } } else jsjFactorFunctionCall(); __jsjPostfixExpression(); @@ -346,24 +422,26 @@ void jsjUnaryExpression() { if (lex->tk=='!' || lex->tk=='~' || lex->tk=='-' || lex->tk=='+') { int op = lex->tk; JSP_ASSERT_MATCH(op); - jsjUnaryExpression(); - jsjPopNoName(0); // value -> r0 (but ensure it's not a name) - if (op=='!') { // logical not - jsjcCall(jsvGetBoolAndUnLock); - jsjcMVN(0,0); // ~ - jsjcLiteral32(1, 1); - jsjcAND(0,1); // &1 -> convert it back to a boolean - jsjcCall(jsvNewFromBool); - } else if (op=='~') { // bitwise not - jsjcCall(jsvGetIntegerAndUnLock); - jsjcMVN(0,0); // ~ - jsjcCall(jsvNewFromInteger); - } else if (op=='-') { // unary minus - jsjcCall(jsvNegateAndUnLock); - } else if (op=='+') { // unary plus (convert to number) - jsjcCall(jsvAsNumberAndUnLock); - } else assert(0); - jsjcPush(0, JSJVT_JSVAR); + if (jit.phase == JSJP_EMIT) { + jsjUnaryExpression(); + jsjPopNoName(0); // value -> r0 (but ensure it's not a name) + if (op=='!') { // logical not + jsjcCall(jsvGetBoolAndUnLock); + jsjcMVN(0,0); // ~ + jsjcLiteral32(1, 1); + jsjcAND(0,1); // &1 -> convert it back to a boolean + jsjcCall(jsvNewFromBool); + } else if (op=='~') { // bitwise not + jsjcCall(jsvGetIntegerAndUnLock); + jsjcMVN(0,0); // ~ + jsjcCall(jsvNewFromInteger); + } else if (op=='-') { // unary minus + jsjcCall(jsvNegateAndUnLock); + } else if (op=='+') { // unary plus (convert to number) + jsjcCall(jsvAsNumberAndUnLock); + } else assert(0); + jsjcPush(0, JSJVT_JSVAR); + } } else jsjPostfixExpression(); } @@ -410,7 +488,6 @@ void __jsjBinaryExpression(unsigned int lastPrecedence) { while (precedence && precedence>lastPrecedence) { int op = lex->tk; JSP_ASSERT_MATCH(op); - // if we have short-circuit ops, then if we know the outcome // we don't bother to execute the other op. Even if not // we need to tell mathsOp it's an & or | @@ -462,7 +539,7 @@ void __jsjBinaryExpression(unsigned int lastPrecedence) { } } jsvUnLock2(av, bv); - } else */{ // --------------------------------------------- NORMAL + } else */if (jit.phase == JSJP_EMIT) { // --------------------------------------------- NORMAL jsjPopAsVar(1); // b -> r1 jsjPopAsVar(0); // a -> r0 jsjcLiteral32(2, op); @@ -496,49 +573,50 @@ NO_INLINE void jsjAssignmentExpression() { int op = lex->tk; JSP_ASSERT_MATCH(op); - jsjAssignmentExpression(); - jsjPopNoName(1); // ensure we get rid of any references on the RHS - jsjcPop(0); // pop LHS - jsjcPush(0, JSJVT_JSVAR); // push LHS back on as this is our result value - //jsjcPush(1, JSJVT_JSVAR); // push RHS back on, so we can pop it off and unlock after jsvReplaceWithOrAddToRoot - - - if (op=='=') { - // this is like jsvReplaceWithOrAddToRoot but it unlocks the RHS for us - jsjcCall(_jsxReplaceWithOrAddToRootUnlockSrc); // void _jsxReplaceWithOrAddToRootUnlockSrc(JsVar *dst, JsVar *src) - } else { -/* - if (op==LEX_PLUSEQUAL) op='+'; - else if (op==LEX_MINUSEQUAL) op='-'; - else if (op==LEX_MULEQUAL) op='*'; - else if (op==LEX_DIVEQUAL) op='/'; - else if (op==LEX_MODEQUAL) op='%'; - else if (op==LEX_ANDEQUAL) op='&'; - else if (op==LEX_OREQUAL) op='|'; - else if (op==LEX_XOREQUAL) op='^'; - else if (op==LEX_RSHIFTEQUAL) op=LEX_RSHIFT; - else if (op==LEX_LSHIFTEQUAL) op=LEX_LSHIFT; - else if (op==LEX_RSHIFTUNSIGNEDEQUAL) op=LEX_RSHIFTUNSIGNED; - if (op=='+' && jsvIsName(lhs)) { - JsVar *currentValue = jsvSkipName(lhs); - if (jsvIsBasicString(currentValue) && jsvGetRefs(currentValue)==1 && rhs!=currentValue) { - // A special case for string += where this is the only use of the string - // and we're not appending to ourselves. In this case we can do a - // simple append (rather than clone + append) - JsVar *str = jsvAsString(rhs); - jsvAppendStringVarComplete(currentValue, str); - jsvUnLock(str); - op = 0; + if (jit.phase == JSJP_EMIT) { + jsjAssignmentExpression(); + jsjPopNoName(1); // ensure we get rid of any references on the RHS + jsjcPop(0); // pop LHS + jsjcPush(0, JSJVT_JSVAR); // push LHS back on as this is our result value + //jsjcPush(1, JSJVT_JSVAR); // push RHS back on, so we can pop it off and unlock after jsvReplaceWithOrAddToRoot + + if (op=='=') { + // this is like jsvReplaceWithOrAddToRoot but it unlocks the RHS for us + jsjcCall(_jsxReplaceWithOrAddToRootUnlockSrc); // void _jsxReplaceWithOrAddToRootUnlockSrc(JsVar *dst, JsVar *src) + } else { + /* + if (op==LEX_PLUSEQUAL) op='+'; + else if (op==LEX_MINUSEQUAL) op='-'; + else if (op==LEX_MULEQUAL) op='*'; + else if (op==LEX_DIVEQUAL) op='/'; + else if (op==LEX_MODEQUAL) op='%'; + else if (op==LEX_ANDEQUAL) op='&'; + else if (op==LEX_OREQUAL) op='|'; + else if (op==LEX_XOREQUAL) op='^'; + else if (op==LEX_RSHIFTEQUAL) op=LEX_RSHIFT; + else if (op==LEX_LSHIFTEQUAL) op=LEX_LSHIFT; + else if (op==LEX_RSHIFTUNSIGNEDEQUAL) op=LEX_RSHIFTUNSIGNED; + if (op=='+' && jsvIsName(lhs)) { + JsVar *currentValue = jsvSkipName(lhs); + if (jsvIsBasicString(currentValue) && jsvGetRefs(currentValue)==1 && rhs!=currentValue) { + // A special case for string += where this is the only use of the string + // and we're not appending to ourselves. In this case we can do a + // simple append (rather than clone + append) + JsVar *str = jsvAsString(rhs); + jsvAppendStringVarComplete(currentValue, str); + jsvUnLock(str); + op = 0; + } + jsvUnLock(currentValue); } - jsvUnLock(currentValue); - } - if (op) { - // Fallback which does a proper add - JsVar *res = jsvMathsOpSkipNames(lhs,rhs,op); - jsvReplaceWith(lhs, res); - jsvUnLock(res); + if (op) { + // Fallback which does a proper add + JsVar *res = jsvMathsOpSkipNames(lhs,rhs,op); + jsvReplaceWith(lhs, res); + jsvUnLock(res); + } + */ } -*/ } } } @@ -549,7 +627,8 @@ void jsjExpression() { jsjAssignmentExpression(); if (lex->tk!=',') return; // if we get a comma, we just unlock this data and parse the next bit... - jsjPopAndUnLock(); + if (jit.phase == JSJP_EMIT) + jsjPopAndUnLock(); JSP_ASSERT_MATCH(','); } } @@ -572,8 +651,10 @@ void jsjStatementIf() { DEBUG_JIT("; IF condition\n"); JSP_MATCH('('); jsjExpression(); - jsjPopAsBool(0); - jsjcCompareImm(0, 0); + if (jit.phase == JSJP_EMIT) { + jsjPopAsBool(0); + jsjcCompareImm(0, 0); + } JSP_MATCH(')'); DEBUG_JIT("; capture IF true block\n"); @@ -589,20 +670,21 @@ void jsjStatementIf() { jsjBlockOrStatement(); falseBlock = jsjcStopBlock(oldBlock); } - DEBUG_JIT("; IF jump after condition\n"); - // if false, jump after true block (if an 'else' we need to jump over the jsjcBranchRelative - jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(trueBlock) + (falseBlock?2:0)); - DEBUG_JIT("; IF true block\n"); - jsjcEmitBlock(trueBlock); - jsvUnLock(trueBlock); - if (falseBlock) { - jsjcBranchRelative(jsvGetStringLength(falseBlock)); // jump over false block - DEBUG_JIT("; IF false block\n"); - jsjcEmitBlock(falseBlock); - jsvUnLock(falseBlock); + if (jit.phase == JSJP_EMIT) { + DEBUG_JIT("; IF jump after condition\n"); + // if false, jump after true block (if an 'else' we need to jump over the jsjcBranchRelative + jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(trueBlock) + (falseBlock?2:0)); + DEBUG_JIT("; IF true block\n"); + jsjcEmitBlock(trueBlock); + jsvUnLock(trueBlock); + if (falseBlock) { + jsjcBranchRelative(jsvGetStringLength(falseBlock)); // jump over false block + DEBUG_JIT("; IF false block\n"); + jsjcEmitBlock(falseBlock); + jsvUnLock(falseBlock); + } + DEBUG_JIT("; IF end\n"); } - DEBUG_JIT("; IF end\n"); - } void jsjStatementFor() { @@ -620,8 +702,10 @@ void jsjStatementFor() { DEBUG_JIT("; FOR condition\n"); if (lex->tk != ';') { jsjExpression(); // condition - jsjPopAsBool(0); - jsjcCompareImm(0, 0); + if (jit.phase == JSJP_EMIT) { + jsjPopAsBool(0); + jsjcCompareImm(0, 0); + } // We add a jump to the end after we've parsed everything and know the size } JSP_MATCH(';'); @@ -629,7 +713,9 @@ void jsjStatementFor() { JsVar *oldBlock = jsjcStartBlock(); if (lex->tk != ')') { // we could have 'for (;;)' jsjExpression(); // iterator - jsjPopAndUnLock(); + if (jit.phase == JSJP_EMIT) { + jsjPopAndUnLock(); + } } JsVar *iteratorBlock = jsjcStopBlock(oldBlock); JSP_MATCH(')'); // FIXME: clean up on exit @@ -638,7 +724,8 @@ void jsjStatementFor() { jsjBlockOrStatement(); JsVar *mainBlock = jsjcStopBlock(oldBlock); // Now figure out the jump length and jump (if condition is false) - jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(iteratorBlock) + jsvGetStringLength(mainBlock) + 2); + if (jit.phase == JSJP_EMIT) + jsjcBranchConditionalRelative(JSJAC_EQ, jsvGetStringLength(iteratorBlock) + jsvGetStringLength(mainBlock) + 2); DEBUG_JIT("; FOR Main block\n"); jsjcEmitBlock(mainBlock); jsvUnLock(mainBlock); @@ -647,7 +734,8 @@ void jsjStatementFor() { jsvUnLock(iteratorBlock); // after the iterator, jump back to condition DEBUG_JIT("; FOR jump back to condition\n"); - jsjcBranchRelative(codePosCondition - jsjcGetByteCount()); + if (jit.phase == JSJP_EMIT) + jsjcBranchRelative(codePosCondition - jsjcGetByteCount()); DEBUG_JIT("; FOR end\n"); } @@ -678,7 +766,8 @@ void jsjStatement() { lex->tk=='(') { /* Execute a simple statement that only contains basic arithmetic... */ jsjExpression(); - jsjPopAndUnLock(); + if (jit.phase == JSJP_EMIT) + jsjPopAndUnLock(); } else if (lex->tk=='{') { /* A block of code */ jsjBlock(); @@ -700,13 +789,15 @@ void jsjStatement() { return jsjStatementTry();*/ } else if (lex->tk==LEX_R_RETURN) { JSP_ASSERT_MATCH(LEX_R_RETURN); - if (lex->tk != ';' && lex->tk != '}') { - jsjExpression(); - jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one - } else { - jsjcLiteral32(0, 0); + if (jit.phase == JSJP_EMIT) { + if (lex->tk != ';' && lex->tk != '}') { + jsjExpression(); + jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one + } else { + jsjcLiteral32(0, 0); + } + jsjFunctionReturn(true/*isReturnStatement*/); } - jsjcPopAllAndReturn(); /*} else if (lex->tk==LEX_R_THROW) { } else if (lex->tk==LEX_R_FUNCTION) { } else if (lex->tk==LEX_R_CONTINUE) { @@ -734,12 +825,23 @@ JsVar *jsjParseFunction() { // FIXME: I guess we need to create a function execution scope and unpack parameters? // Maybe we could use jspeFunctionCall to do all this for us (not creating a native function but a 'normal' one // with native function code... - jsjcPushAll(); // Function start + // Function init code + jsjFunctionStart(); + // Parse the function + JslCharPos codeStartPosition; + jslCharPosFromLex(&codeStartPosition); + jit.phase = JSJP_SCAN; DEBUG_JIT("; ============ SCAN PHASE\n"); jsjBlockNoBrackets(); - // optimisation: if the last statement was a return, no need for this. Could check if last instruction was 'POP {r4,r5,r6,r7,pc}' - // Return 'undefined' from function if no other return statement - jsjcLiteral32(0, 0); - jsjcPopAllAndReturn(); + if (JSJ_PARSING) { // if no error, re-parse and create code + jslSeekToP(&codeStartPosition); + jslCharPosFree(&codeStartPosition); + jit.phase = JSJP_EMIT; DEBUG_JIT("; ============ EMIT PHASE\n"); + jsjBlockNoBrackets(); + // optimisation: if the last statement was a return, no need for this. Could check if last instruction was 'POP {r4,r5,r6,r7,pc}' + // Return 'undefined' from function if no other return statement + jsjcLiteral32(0, 0); + jsjFunctionReturn(false/*isReturnStatement*/); + } JsVar *v = jsjcStop(); JsVar *exception = jspGetException(); if (!exception) return v; @@ -763,10 +865,21 @@ JsVar *jsjEvaluateVar(JsVar *str) { JsLex *oldLex = jslSetLex(&lex); jslInit(str); jsjcStart(); - jsjcPushAll(); + // Function init code + jsjFunctionStart(); + // Parse the expression + JslCharPos codeStartPosition; + jslCharPosFromLex(&codeStartPosition); + jit.phase = JSJP_SCAN; jsjExpression(); - jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one - jsjcPopAllAndReturn(); + if (JSJ_PARSING) { // if no error, re-parse and create code + jslSeekToP(&codeStartPosition); + jslCharPosFree(&codeStartPosition); + jit.phase = JSJP_EMIT; + jsjExpression(); + jsjPopNoName(0); // a -> r0, we only want the value, so skip the name if there was one + jsjFunctionReturn(false/*isReturnStatement*/); + } JsVar *v = jsjcStop(); jslKill(); jslSetLex(oldLex); diff --git a/src/jsjitc.c b/src/jsjitc.c index 702de97610..e4f2003096 100644 --- a/src/jsjitc.c +++ b/src/jsjitc.c @@ -19,7 +19,7 @@ * Allow us to check what the last instruction was, and to replace it. Can then do peephole optimisations: * 'push+pop' is just a 'mov' (or maybe even nothing) * - * Use a String iterator for writing to jitCode - it'll be a lot faster + * Use a String iterator for writing to jit.code - it'll be a lot faster */ #ifdef ESPR_JIT @@ -34,16 +34,15 @@ #ifdef JIT_OUTPUT_FILE #include -FILE *f; #endif -// The ARM Thumb-2 code we're in the process of creating -JsVar *jitCode = 0; -int blockCount = 0; +// JIT state +JsjInfo jit; + void jsjcDebugPrintf(const char *fmt, ...) { if (jsFlags & JSF_JIT_DEBUG) { - if (!blockCount) jsiConsolePrintf("%6x: ", jsjcGetByteCount()); + if (!jit.blockCount) jsiConsolePrintf("%6x: ", jsjcGetByteCount()); else jsiConsolePrintf(" : "); va_list argp; va_start(argp, fmt); @@ -53,48 +52,83 @@ void jsjcDebugPrintf(const char *fmt, ...) { } void jsjcStart() { -#ifdef JIT_OUTPUT_FILE - f = fopen(JIT_OUTPUT_FILE, "wb"); -#endif - jitCode = jsvNewFromEmptyString(); - blockCount = 0; + jit.phase = JSJP_UNKNOWN; + jit.code = jsvNewFromEmptyString(); + jit.initCode = jsvNewFromEmptyString(); // FIXME: maybe we don't need this? + jit.blockCount = 0; + jit.vars = jsvNewObject(); + jit.varCount = 0; + jit.stackDepth = 0; } JsVar *jsjcStop() { - assert(blockCount==0); + jsjcDebugPrintf("VARS: %j\n", jit.vars); + jsvUnLock(jit.vars); + jit.vars = 0; + assert(jit.stackDepth == 0); + + assert(jit.blockCount==0); #ifdef JIT_OUTPUT_FILE + FILE *f = fopen(JIT_OUTPUT_FILE, "wb"); + JSV_GET_AS_CHAR_ARRAY(icPtr, icLen, jit.initCode); + if (icPtr) fwrite(icPtr, 1, icLen, f); + JSV_GET_AS_CHAR_ARRAY(cPtr, cLen, jit.code); + if (cPtr) fwrite(cPtr, 1, cLen, f); fclose(f); #endif - JsVar *v = jsvAsFlatString(jitCode); - jsvUnLock(jitCode); - jitCode = 0; - return v; + // Like AsFlatString but we need to concat two blocks instead + size_t len = jsvGetStringLength(jit.code) + jsvGetStringLength(jit.initCode); + JsVar *flat = jsvNewFlatStringOfLength((unsigned int)len); + if (flat) { + JsvStringIterator src; + JsvStringIterator dst; + jsvStringIteratorNew(&src, jit.initCode, 0); + jsvStringIteratorNew(&dst, flat, 0); + while (jsvStringIteratorHasChar(&src)) { + jsvStringIteratorSetCharAndNext(&dst, jsvStringIteratorGetCharAndNext(&src)); + } + jsvStringIteratorFree(&src); + jsvStringIteratorNew(&src, jit.code, 0); + while (jsvStringIteratorHasChar(&src)) { + jsvStringIteratorSetCharAndNext(&dst, jsvStringIteratorGetCharAndNext(&src)); + } + jsvStringIteratorFree(&src); + jsvStringIteratorFree(&dst); + } + jsvUnLock(jit.code); + jit.code = 0; + jsvUnLock(jit.initCode); + jit.code = 0; + return flat; } // Called before start of a block of code. Returns the old code jsVar that should be passed into jsjcStopBlock JsVar *jsjcStartBlock() { - JsVar *v = jitCode; - jitCode = jsvNewFromEmptyString(); - blockCount++; + JsVar *v = jit.code; + jit.code = jsvNewFromEmptyString(); + jit.blockCount++; return v; } + +// Called to start writing to 'init code' (which is inserted before everything else). Returns the old code jsVar that should be passed into jsjcStopBlock +JsVar *jsjcStartInitCodeBlock() { + JsVar *v = jit.code; + jit.code = jsvLockAgain(jit.initCode); + jit.blockCount++; + return v; +} + // Called when JIT output stops, pass it the return value from jsjcStartBlock. Returns the code parsed in the block JsVar *jsjcStopBlock(JsVar *oldBlock) { - JsVar *v = jitCode; - jitCode = oldBlock; - blockCount--; + JsVar *v = jit.code; + jit.code = oldBlock; + jit.blockCount--; return v; } void jsjcEmit16(uint16_t v) { //DEBUG_JIT("> %04x\n", v); -#ifdef JIT_OUTPUT_FILE - if (!blockCount) { - fputc(v&255, f); - fputc(v>>8, f); - } -#endif - jsvAppendStringBuf(jitCode, (char *)&v, 2); + jsvAppendStringBuf(jit.code, (char *)&v, 2); } // Emit a whole block of code @@ -111,7 +145,7 @@ void jsjcEmitBlock(JsVar *block) { } int jsjcGetByteCount() { - return jsvGetStringLength(jitCode); + return jsvGetStringLength(jit.code); } void jsjcLiteral8(int reg, uint8_t data) { @@ -252,13 +286,15 @@ void jsjcAND(int regTo, int regFrom) { } void jsjcPush(int reg, JsjValueType type) { - DEBUG_JIT("PUSH {r%d}\n", reg); + DEBUG_JIT("PUSH {r%d} (=> stack depth %d)\n", reg, jit.stackDepth); + jit.stackDepth++; assert(reg>=0 && reg<8); jsjcEmit16((uint16_t)(0b1011010000000000 | (1<=0 && reg<8); jsjcEmit16((uint16_t)(0b1011110000000000 | (1<0 && amt<512); - DEBUG_JIT("ADD SP,SP,#%d\n", amt); + jit.stackDepth -= (amt>>2); // stack grows down -> negate + DEBUG_JIT("ADD SP,SP,#%d (stack depth now %d)\n", amt, jit.stackDepth); jsjcEmit16((uint16_t)(0b1011000000000000 | (amt>>2))); } void jsjcSubSP(int amt) { assert((amt&3)==0 && amt>0 && amt<512); - DEBUG_JIT("SUB SP,SP,#%d\n", amt); + jit.stackDepth += (amt>>2); // stack grows down -> negate + DEBUG_JIT("SUB SP,SP,#%d (stack depth now %d)\n", amt, jit.stackDepth); jsjcEmit16((uint16_t)(0b1011000010000000 | (amt>>2))); } - void jsjcLoadImm(int reg, int regAddr, int offset) { - assert((offset&3)==0 && offset>=0 && offset<128); - assert(reg<8); - assert(regAddr<8); - DEBUG_JIT("LDR r%d,r%d,#%d\n", reg, regAddr, offset); - jsjcEmit16((uint16_t)(0b0110100000000000 | ((offset>>2)<<6) | (regAddr<<3) | reg)); + assert((offset&3)==0 && offset>=0); + // https://developer.arm.com/documentation/ddi0308/d/Thumb-Instructions/Alphabetical-list-of-Thumb-instructions/LDR--immediate- + if (regAddr == JSJAR_SP) { + assert(reg<2); + assert(offset<4096); + DEBUG_JIT("LDR r%d,[SP,#%d]\n", reg, offset); + jsjcEmit16((uint16_t)(0b1001100000000000 | (offset>>2) | (reg<<10))); + } else { + assert(reg<8); + assert(regAddr<8); + assert(offset<128); + DEBUG_JIT("LDR r%d,[r%d,#%d]\n", reg, regAddr, offset); + jsjcEmit16((uint16_t)(0b0110100000000000 | ((offset>>2)<<6) | (regAddr<<3) | reg)); + } } void jsjcStoreImm(int reg, int regAddr, int offset) { diff --git a/src/jsjitc.h b/src/jsjitc.h index 1bfe5e06d5..a6d13c45d0 100644 --- a/src/jsjitc.h +++ b/src/jsjitc.h @@ -54,7 +54,32 @@ typedef enum { JSJAR_PC = 15, } JsjAsmReg; +typedef enum { + JSJP_UNKNOWN, + JSJP_SCAN, /// scan for variables used + JSJP_EMIT /// emit code +} JsjPhase; + + +typedef struct { + /// Which compilation phase are we in? + JsjPhase phase; + /// The ARM Thumb-2 code we're in the process of creating + JsVar *code; + /// The ARM Thumb-2 variable init code block (this goes right at the start of our function) + JsVar *initCode; + /// How many blocks deep are we? blockCount=0 means we're writing to the 'code' var + int blockCount; + /// An Object mapping var name -> index on the stack + JsVar *vars; + /// How many words (not bytes) are on the stack reserved for variables? + int varCount; + /// How much stuff has been pushed on the stack so far? (including variables) + int stackDepth; +} JsjInfo; +// JIT state +extern JsjInfo jit; // Called before start of JIT output void jsjcStart(); @@ -62,6 +87,8 @@ void jsjcStart(); JsVar *jsjcStop(); // Called before start of a block of code. Returns the old code jsVar that should be passed into jsjcStopBlock JsVar *jsjcStartBlock(); +// Called to start writing to 'init code' (which is inserted before everything else). Returns the old code jsVar that should be passed into jsjcStopBlock +JsVar *jsjcStartInitCodeBlock(); // Called when JIT output stops, pass it the return value from jsjcStartBlock. Returns the code parsed in the block JsVar *jsjcStopBlock(JsVar *oldBlock); // Emit a whole block of code diff --git a/src/jsparse.c b/src/jsparse.c index 7fa5ad35b4..1ede81aa9c 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2699,7 +2699,6 @@ NO_INLINE JsVar *jspeStatementFor() { #endif ) { jslSeekToP(&forCondStart); - ; if (lex->tk == ';') { loopCond = true; } else { From 615e4dcff9658cc1e9dae632d9947abd5e71abb0 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Wed, 22 Jun 2022 16:06:16 +0100 Subject: [PATCH 0145/1183] Well tested C code for dates and DST --- src/TMP-dst.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/TMP-dst.c diff --git a/src/TMP-dst.c b/src/TMP-dst.c new file mode 100644 index 0000000000..02c68084fd --- /dev/null +++ b/src/TMP-dst.c @@ -0,0 +1,72 @@ +/** + +Temporary file by Deirdre O'Byrne for Daylight Savings Calculations + +*/ + +#include +#include + +int dayNumber(int y, int m, int d) { + int ans; + + if (m < 2) { + y--; + m+=12; + } + ans = (y/100); + ans = 365*y + (y>>2) - ans + (ans>>2) + 30*m + ((3*m+6)/5) + d - 719531; + return ans; +} + +int dstChangeDay(int y, int dow_number, int month, int dow, int day_offset) { + int m = month; + int ans; + if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. + if (++m > 11) { + y++; + m-=12; + } + } + ans = dayNumber(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN + if (dow_number == 4) { + ans -= 7 - (7 - ((ans + 4) % 7) + dow) % 7; + } else { + ans += 7 * dow_number + (14 + dow - ((ans + 4) % 7)) % 7; + } + ans -= day_offset; + return ans; +} + +void getDate(int day, int *y, int *m, int *date) { + int a = day + 135081; + int b,c,d,e; + a = (a-(a/146097)+146095)/36524; + a = day + a - (a>>2); + c = ((a<<2)+2877911)/1461; + d = 365*c + (c>>2); + b = a + 719600 - d; + e = (5*b-1)/153; + *date=b-30*e-((3*e)/5); + if (e<14) + *m=e-1; + else + *m=e-13; + if (e>13) + *y=c+1; + else + *y=c; +} + +int main(int argc, char *argv[]) { + int yr,y,m,d,day; + yr=atoi(argv[1]); + day=dstChangeDay(yr,4,2,0,0); + getDate(day,&y,&m,&d); + printf("Start : %04d/%02d/%02d ",y,m,d); + day=dstChangeDay(yr,4,9,0,0); + getDate(day,&y,&m,&d); + printf("End : %04d/%02d/%02d\n",y,m,d); +} + + From 5575948185b3d4fae2ed2577e534280294eea85b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 27 Jun 2022 17:13:42 +0100 Subject: [PATCH 0146/1183] Puck.js: Immediately after flashing new firmware, Puck.js now does a self-test and sets its BLE to PASS or FAIL --- ChangeLog | 1 + libs/puckjs/jswrap_puck.c | 48 +++++++++++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec49c3bdb7..d73bff3739 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ Bangle.js2: JIT now built in (only enabled for functions prefixed '"jit"') E.dumpVariables now outputs more info for variable values Puck.js Lite support + Puck.js: Immediately after flashing new firmware, Puck.js now does a self-test and sets its BLE to PASS or FAIL 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/puckjs/jswrap_puck.c b/libs/puckjs/jswrap_puck.c index 5c8f6a4fb2..0d558f2c74 100644 --- a/libs/puckjs/jswrap_puck.c +++ b/libs/puckjs/jswrap_puck.c @@ -22,6 +22,7 @@ #include "jshardware.h" #include "jsdevices.h" #include "jspin.h" +#include "jsflags.h" #include "jstimer.h" #include "jswrap_bluetooth.h" #include "nrf_gpio.h" @@ -1360,7 +1361,8 @@ If the self test fails, it'll set the Puck.js Bluetooth advertising name to `Puck.js !ERR` where ERR is a 3 letter error code. */ -bool jswrap_puck_selfTest() { + +bool _jswrap_puck_selfTest(bool advertisePassOrFail) { unsigned int timeout, i; JsVarFloat v; bool ok = true; @@ -1564,10 +1566,19 @@ bool jswrap_puck_selfTest() { for (i=0;i3 secs */ - bool firstStart = jsiStatus & JSIS_FIRST_BOOT; // is this the first time jswrap_puck_init was called?; - if (firstStart && jshPinGetValue(BTN1_PININDEX) == BTN1_ONSTATE) { + bool firstStart = jsiStatus & JSIS_FIRST_BOOT; // is this the first time jswrap_puck_init was called? + bool firstRunAfterFlash = false; + if (firstStart) { + uint32_t firstStartFlagAddr = FLASH_SAVED_CODE_START-4; + // check the 4 bytes *right before* our saved code. If these are 0xFFFFFFFF + // then we have just been programmed... + uint32_t buf; + jshFlashRead(&buf, firstStartFlagAddr, 4); + if (buf==0xFFFFFFFF) { + firstRunAfterFlash = true; + buf = 0; + // set it to 0! + bool oldFlashStatus = jsfGetFlag(JSF_UNSAFE_FLASH); + jsfSetFlag(JSF_UNSAFE_FLASH, true); + jshFlashWrite(&buf, firstStartFlagAddr, 4); + jsfSetFlag(JSF_UNSAFE_FLASH, oldFlashStatus); + } + } + + if (firstStart && (jshPinGetValue(BTN1_PININDEX) == BTN1_ONSTATE || firstRunAfterFlash)) { // don't do it during a software reset - only first hardware reset - bool result = jswrap_puck_selfTest(); + // if we're doing our first run after being flashed with new firmware, we set the advertising name + // up to say PASS or FAIL, to work with the factory test process. + bool result = _jswrap_puck_selfTest(firstRunAfterFlash); // green if good, red if bad Pin indicator = result ? LED2_PININDEX : LED1_PININDEX; int i; From b30d43030f3d905139d939b0c9240ac4731ae8f7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 29 Jun 2022 10:10:14 +0100 Subject: [PATCH 0147/1183] nRF52: Fix recent regression which stopped reconnection after a bluetooth disconnect (fix #2226) --- ChangeLog | 1 + libs/bluetooth/bluetooth.h | 2 +- targets/nrf5x/bluetooth.c | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d73bff3739..fec7d6a002 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,7 @@ E.dumpVariables now outputs more info for variable values Puck.js Lite support Puck.js: Immediately after flashing new firmware, Puck.js now does a self-test and sets its BLE to PASS or FAIL + nRF52: Fix recent regression which stopped reconnection after a bluetooth disconnect (fix #2226) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/bluetooth/bluetooth.h b/libs/bluetooth/bluetooth.h index 2f00ceedb5..8af377e16c 100644 --- a/libs/bluetooth/bluetooth.h +++ b/libs/bluetooth/bluetooth.h @@ -211,7 +211,7 @@ bool jsble_has_connection(); bool jsble_has_central_connection(); /** Return the index of the central connection in m_central_conn_handles, or -1 */ -bool jsble_get_central_connection_idx(uint16_t handle); +int jsble_get_central_connection_idx(uint16_t handle); /** Is BLE connected to a server device at all (eg, the simple, 'slave' mode)? */ bool jsble_has_peripheral_connection(); diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 45f9f4504f..d31f640e4e 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -812,7 +812,7 @@ bool jsble_has_central_connection() { } /** Return the index of the central connection in m_central_conn_handles, or -1 */ -bool jsble_get_central_connection_idx(uint16_t handle) { +int jsble_get_central_connection_idx(uint16_t handle) { #if CENTRAL_LINK_COUNT>0 for (int i=0;i Date: Fri, 1 Jul 2022 08:12:32 +0100 Subject: [PATCH 0148/1183] Bangle.js: Include the 'sched' library in installed apps (needed for alarm) (fix #2229) --- ChangeLog | 1 + libs/banglejs/banglejs1_storage_default.c | 3886 ++++++++------- libs/banglejs/banglejs2_storage_default.c | 5302 +++++++++++---------- 3 files changed, 4955 insertions(+), 4234 deletions(-) diff --git a/ChangeLog b/ChangeLog index fec7d6a002..b55bdbdf39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ Puck.js Lite support Puck.js: Immediately after flashing new firmware, Puck.js now does a self-test and sets its BLE to PASS or FAIL nRF52: Fix recent regression which stopped reconnection after a bluetooth disconnect (fix #2226) + Bangle.js: Include the 'sched' library in installed apps (needed for alarm) (fix #2229) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/banglejs/banglejs1_storage_default.c b/libs/banglejs/banglejs1_storage_default.c index 82a8d60986..ef53eab2df 100644 --- a/libs/banglejs/banglejs1_storage_default.c +++ b/libs/banglejs/banglejs1_storage_default.c @@ -1,7 +1,7 @@ // Initial storage contents for Bangle.js 2.0 // Generated by BangleApps/bin/build_bangles_c.js -const int jsfStorageInitialContentLength = 68956; +const int jsfStorageInitialContentLength = 80536; const char jsfStorageInitialContents[] = { 48,0,0,0,46,98,111,111,116,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 10,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98, @@ -338,7 +338,7 @@ const char jsfStorageInitialContents[] = { 101,100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108, 111,99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107, 101,100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100, -40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,29,3,0,0,108,97,117,110,99,104,46,115,101,116,116,105, +40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,241,2,0,0,108,97,117,110,99,104,46,115,101,116,116,105, 110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, 103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102, 117,108,108,115,99,114,101,101,110,58,181,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, @@ -358,1804 +358,2166 @@ const char jsfStorageInitialContents[] = { 114,115,105,122,101,160,49,48,44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114, 97,112,58,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115, 105,122,101,34,44,109,41,125,125,44,34,83,104,111,119,32,67,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115, -101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63, -34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115, -104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115,99,114,101,101,110,34,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,138,180,44,102,111,114,109,97,116, -58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97, -118,101,40,34,102,117,108,108,115,99,114,101,101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117, -40,97,112,112,77,101,110,117,41,59,125,41,59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34, -110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34, -44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101, -114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,51,34,44,34,116,97,103,115,34,58,34, -116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108, -97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46, -115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110, -34,125,255,255,133,11,0,0,109,99,108,111,99,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,172,105,115,49,50,72,111,117,114,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34, -41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41, -91,34,49,50,104,111,117,114,34,93,59,10,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99, -97,108,101,34,41,59,10,172,67,72,65,82,87,61,51,52,59,10,172,67,72,65,82,80,61,50,59,10,172,89,61,53, -48,59,10,172,98,117,102,61,71,114,97,112,104,105,99,115,46,99,114,101,97,116,101,65,114,114,97,121,66,117,102,102, -101,114,40,67,72,65,82,87,43,67,72,65,82,80,42,50,44,67,72,65,82,87,42,50,43,67,72,65,82,80,42,50, -44,49,44,123,109,115,98,58,180,125,41,59,10,172,98,117,102,105,109,103,61,123,119,105,100,116,104,58,98,117,102,46, -103,101,116,87,105,100,116,104,40,41,44,104,101,105,103,104,116,58,98,117,102,46,103,101,116,72,101,105,103,104,116,40, -41,44,98,117,102,102,101,114,58,98,117,102,46,98,117,102,102,101,114,125,59,10,172,108,97,115,116,84,105,109,101,61, -34,45,45,45,45,45,34,59,10,172,97,110,105,109,73,110,116,101,114,118,97,108,59,10,172,116,105,109,101,73,110,116, -101,114,118,97,108,59,10,174,68,73,71,73,84,83,61,123,34,32,34,58,110,162,91,93,44,34,48,34,58,110,162,91, -91,110,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110, -44,50,44,49,44,50,93,44,91,110,44,49,44,110,44,50,93,44,91,110,44,48,44,110,44,49,93,93,44,34,49,34, -58,110,162,91,91,49,45,110,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49, -44,49,44,49,93,44,91,49,45,110,44,49,44,49,45,110,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93, -44,34,50,34,58,110,162,91,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49, -44,49,44,49,93,44,91,48,44,49,43,110,44,48,44,50,93,44,91,49,44,50,45,110,44,49,44,50,93,44,91,48, -44,50,44,49,44,50,93,93,44,34,51,34,58,110,162,91,91,48,44,48,44,49,45,110,44,48,93,44,91,48,44,48, -44,48,44,110,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49, -44,50,93,44,91,110,44,50,44,49,44,50,93,93,44,34,52,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, -91,49,44,48,44,49,45,110,44,48,93,44,91,49,44,48,44,49,44,49,45,110,93,44,91,48,44,49,44,49,44,49, -93,44,91,49,44,49,44,49,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93,44,34,53,116,111,48,34,58, -110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93, -44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,50,44,48,44,50,93,44,91, -49,44,49,45,110,44,49,44,49,93,44,91,48,44,49,44,48,44,49,43,110,93,93,44,34,53,116,111,54,34,58,110, -162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,48,44,49,44,49,44,49,93,44, -91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,50,45,110,44,48,44,50,93,93, -44,34,54,34,58,110,162,91,91,48,44,48,44,48,44,49,45,110,93,44,91,48,44,48,44,49,44,48,93,44,91,110, -44,49,44,49,44,49,93,44,91,49,44,49,45,110,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110, -44,50,44,49,44,50,93,44,91,48,44,49,45,110,44,48,44,50,45,50,42,110,93,93,44,34,55,34,58,110,162,91, -91,48,44,48,44,48,44,110,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49, -45,110,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,44, -91,49,45,110,44,49,44,49,45,110,44,50,93,93,44,34,56,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, -91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49, -44,49,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,44,91,48,44,49,44,48,44,50,45,110,93,93,44,34, -57,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49, -44,49,93,44,91,48,44,49,44,49,45,110,44,49,93,44,91,48,44,49,44,48,44,49,43,110,93,44,91,49,44,49, -44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,93,44,34,58,34,58,110,162,91,91,48,46,52,44,48,46,52, -44,48,46,54,44,48,46,52,93,44,91,48,46,54,44,48,46,52,44,48,46,54,44,48,46,54,93,44,91,48,46,54, -44,48,46,54,44,48,46,52,44,48,46,54,93,44,91,48,46,52,44,48,46,52,44,48,46,52,44,48,46,54,93,44, -91,48,46,52,44,49,46,52,44,48,46,54,44,49,46,52,93,44,91,48,46,54,44,49,46,52,44,48,46,54,44,49, -46,54,93,44,91,48,46,54,44,49,46,54,44,48,46,52,44,49,46,54,93,44,91,48,46,52,44,49,46,52,44,48, -46,52,44,49,46,54,93,93,125,59,10,170,100,114,97,119,68,105,103,105,116,115,40,108,97,115,116,84,101,120,116,44, -116,104,105,115,84,101,120,116,44,110,41,123,34,114,97,109,34,174,112,61,67,72,65,82,80,59,174,115,61,67,72,65, -82,87,59,172,120,61,48,59,103,46,114,101,115,101,116,40,41,59,167,40,172,105,61,48,59,105,60,108,97,115,116,84, -101,120,116,46,108,101,110,103,116,104,59,105,152,41,123,172,108,97,115,116,67,104,61,108,97,115,116,84,101,120,116,91, -105,93,59,172,116,104,105,115,67,104,61,116,104,105,115,84,101,120,116,91,105,93,59,163,40,116,104,105,115,67,104,138, -34,58,34,41,120,151,52,59,163,40,108,97,115,116,67,104,140,116,104,105,115,67,104,41,123,172,99,104,44,99,104,110, -61,110,59,163,40,40,116,104,105,115,67,104,45,49,138,108,97,115,116,67,104,160,40,116,104,105,115,67,104,138,48,158, -108,97,115,116,67,104,138,53,41,160,40,116,104,105,115,67,104,138,48,158,108,97,115,116,67,104,138,57,41,41,41,99, -104,61,108,97,115,116,67,104,59,164,123,99,104,61,116,104,105,115,67,104,59,99,104,110,61,48,59,125,98,117,102,46, -99,108,101,97,114,40,41,59,163,40,99,104,138,34,53,34,41,99,104,61,40,108,97,115,116,67,104,138,53,158,116,104, -105,115,67,104,138,48,41,63,34,53,116,111,48,34,58,34,53,116,111,54,34,59,172,108,61,68,73,71,73,84,83,91, -99,104,93,40,99,104,110,41,59,108,46,102,111,114,69,97,99,104,40,99,162,123,163,40,99,91,48,93,140,99,91,50, -93,41,98,117,102,46,102,105,108,108,82,101,99,116,40,112,43,99,91,48,93,42,115,44,99,91,49,93,42,115,44,112, -43,99,91,50,93,42,115,44,50,42,112,43,99,91,51,93,42,115,41,59,164,163,40,99,91,49,93,140,99,91,51,93, -41,98,117,102,46,102,105,108,108,82,101,99,116,40,99,91,48,93,42,115,44,112,43,99,91,49,93,42,115,44,50,42, -112,43,99,91,50,93,42,115,44,112,43,99,91,51,93,42,115,41,59,125,41,59,103,46,100,114,97,119,73,109,97,103, -101,40,98,117,102,105,109,103,44,120,44,89,41,59,125,163,40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59, -120,150,115,43,112,43,55,59,125,125,10,170,100,114,97,119,69,118,101,114,121,116,104,105,110,103,69,108,115,101,40,41, -123,172,120,61,40,67,72,65,82,87,43,67,72,65,82,80,43,54,41,42,53,59,172,121,61,89,43,50,42,67,72,65, -82,87,43,67,72,65,82,80,59,172,100,61,184,68,97,116,101,40,41,59,103,46,114,101,115,101,116,40,41,59,103,46, -115,101,116,70,111,110,116,40,34,54,120,56,34,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49, -44,45,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,40,34,48,34,43,100,46,103,101,116,83,101,99,111, -110,100,115,40,41,41,46,115,117,98,115,116,114,40,45,50,41,44,120,44,121,45,56,44,180,41,59,163,40,105,115,49, -50,72,111,117,114,41,103,46,100,114,97,119,83,116,114,105,110,103,40,40,100,46,103,101,116,72,111,117,114,115,40,41, -60,49,50,41,63,34,65,77,34,58,34,80,77,34,44,120,44,89,43,52,44,180,41,59,103,46,115,101,116,70,111,110, -116,65,108,105,103,110,40,48,44,45,49,41,59,172,100,97,116,101,61,108,111,99,97,108,101,46,100,97,116,101,40,100, -44,181,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,97,116,101,44,103,46,103,101,116,87,105,100,116,104, -40,41,47,50,44,121,43,56,44,180,41,59,125,10,170,115,104,111,119,84,105,109,101,40,41,123,163,40,97,110,105,109, -73,110,116,101,114,118,97,108,41,171,59,172,100,61,184,68,97,116,101,40,41,59,172,104,111,117,114,115,61,100,46,103, -101,116,72,111,117,114,115,40,41,59,163,40,105,115,49,50,72,111,117,114,41,104,111,117,114,115,61,40,40,104,111,117, -114,115,43,49,49,41,37,49,50,41,43,49,59,172,116,61,40,34,32,34,43,104,111,117,114,115,41,46,115,117,98,115, -116,114,40,45,50,41,43,34,58,34,43,40,34,48,34,43,100,46,103,101,116,77,105,110,117,116,101,115,40,41,41,46, -115,117,98,115,116,114,40,45,50,41,59,172,108,61,108,97,115,116,84,105,109,101,59,163,40,116,138,108,160,108,138,34, -45,45,45,45,45,34,41,123,100,114,97,119,68,105,103,105,116,115,40,108,44,116,44,48,41,59,100,114,97,119,69,118, -101,114,121,116,104,105,110,103,69,108,115,101,40,41,59,108,97,115,116,84,105,109,101,61,116,59,171,59,125,172,110,61, -48,59,97,110,105,109,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110, -150,49,47,49,48,59,163,40,110,145,49,41,123,110,61,49,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97, -110,105,109,73,110,116,101,114,118,97,108,41,59,97,110,105,109,73,110,116,101,114,118,97,108,61,183,59,125,100,114,97, -119,68,105,103,105,116,115,40,108,44,116,44,110,41,59,125,44,50,48,41,59,108,97,115,116,84,105,109,101,61,116,59, -125,10,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,97, -110,105,109,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73, -110,116,101,114,118,97,108,41,59,97,110,105,109,73,110,116,101,114,118,97,108,61,183,59,125,163,40,116,105,109,101,73, -110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,116,105,109,101,73,110,116,101,114, -118,97,108,41,59,116,105,109,101,73,110,116,101,114,118,97,108,61,183,59,125,163,40,111,110,41,123,115,104,111,119,84, -105,109,101,40,41,59,116,105,109,101,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115, -104,111,119,84,105,109,101,44,49,48,48,48,41,59,125,164,123,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45, -34,59,125,125,41,59,10,103,46,99,108,101,97,114,40,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100, -103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,116,105, -109,101,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44, -49,48,48,48,41,59,10,115,104,111,119,84,105,109,101,40,41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40, -34,99,108,111,99,107,34,41,59,255,255,255,131,4,0,0,109,99,108,111,99,107,46,105,109,103,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,48,48,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,111,110,99,104,97,110,103,101,58,40,109, +41,162,123,115,97,118,101,40,34,115,104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115, +99,114,101,101,110,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101, +110,138,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,102,117,108,108,115,99,114,101, +101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117,40,97,112,112,77,101,110,117,41,59,125,41, +59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34,110,97,109,101,34,58,34,76,97,117,110,99, +104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34,44,34,115,114,99,34,58,34,108,97,117,110, +99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115, +105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44, +108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108,97,117,110,99,104,46,105,110,102,111,44,108, +97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46,106,115,34, +44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110,34,125,255,255,133,11,0,0,109,99,108,111, +99,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,105,115,49,50,72,111,117, +114,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34, +115,101,116,116,105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41,91,34,49,50,104,111,117,114,34,93,59,10, +172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,10,172,67,72,65,82, +87,61,51,52,59,10,172,67,72,65,82,80,61,50,59,10,172,89,61,53,48,59,10,172,98,117,102,61,71,114,97,112, +104,105,99,115,46,99,114,101,97,116,101,65,114,114,97,121,66,117,102,102,101,114,40,67,72,65,82,87,43,67,72,65, +82,80,42,50,44,67,72,65,82,87,42,50,43,67,72,65,82,80,42,50,44,49,44,123,109,115,98,58,180,125,41,59, +10,172,98,117,102,105,109,103,61,123,119,105,100,116,104,58,98,117,102,46,103,101,116,87,105,100,116,104,40,41,44,104, +101,105,103,104,116,58,98,117,102,46,103,101,116,72,101,105,103,104,116,40,41,44,98,117,102,102,101,114,58,98,117,102, +46,98,117,102,102,101,114,125,59,10,172,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45,34,59,10,172,97,110, +105,109,73,110,116,101,114,118,97,108,59,10,172,116,105,109,101,73,110,116,101,114,118,97,108,59,10,174,68,73,71,73, +84,83,61,123,34,32,34,58,110,162,91,93,44,34,48,34,58,110,162,91,91,110,44,48,44,49,44,48,93,44,91,49, +44,48,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50,93,44,91,110,44,49, +44,110,44,50,93,44,91,110,44,48,44,110,44,49,93,93,44,34,49,34,58,110,162,91,91,49,45,110,44,48,44,49, +44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49,44,49,44,49,93,44,91,49,45,110,44,49, +44,49,45,110,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,93,44,34,50,34,58,110,162,91,91,48,44,48, +44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,48,44,49,43,110, +44,48,44,50,93,44,91,49,44,50,45,110,44,49,44,50,93,44,91,48,44,50,44,49,44,50,93,93,44,34,51,34, +58,110,162,91,91,48,44,48,44,49,45,110,44,48,93,44,91,48,44,48,44,48,44,110,93,44,91,49,44,48,44,49, +44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50, +93,93,44,34,52,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,49,44,48,44,49,45,110,44,48,93,44, +91,49,44,48,44,49,44,49,45,110,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44, +91,49,45,110,44,50,44,49,44,50,93,93,44,34,53,116,111,48,34,58,110,162,91,91,48,44,48,44,48,44,49,93, +44,91,48,44,48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91, +48,44,50,44,49,44,50,93,44,91,48,44,50,44,48,44,50,93,44,91,49,44,49,45,110,44,49,44,49,93,44,91, +48,44,49,44,48,44,49,43,110,93,93,44,34,53,116,111,54,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44, +91,48,44,48,44,49,44,48,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,48, +44,50,44,49,44,50,93,44,91,48,44,50,45,110,44,48,44,50,93,93,44,34,54,34,58,110,162,91,91,48,44,48, +44,48,44,49,45,110,93,44,91,48,44,48,44,49,44,48,93,44,91,110,44,49,44,49,44,49,93,44,91,49,44,49, +45,110,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,110,44,50,44,49,44,50,93,44,91,48,44,49, +45,110,44,48,44,50,45,50,42,110,93,93,44,34,55,34,58,110,162,91,91,48,44,48,44,48,44,110,93,44,91,48, +44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,49,45,110,44,49,44,49,44,49,93,44,91,49, +44,49,44,49,44,50,93,44,91,49,45,110,44,50,44,49,44,50,93,44,91,49,45,110,44,49,44,49,45,110,44,50, +93,93,44,34,56,34,58,110,162,91,91,48,44,48,44,48,44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,49, +44,48,44,49,44,49,93,44,91,48,44,49,44,49,44,49,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50, +44,49,44,50,93,44,91,48,44,49,44,48,44,50,45,110,93,93,44,34,57,34,58,110,162,91,91,48,44,48,44,48, +44,49,93,44,91,48,44,48,44,49,44,48,93,44,91,49,44,48,44,49,44,49,93,44,91,48,44,49,44,49,45,110, +44,49,93,44,91,48,44,49,44,48,44,49,43,110,93,44,91,49,44,49,44,49,44,50,93,44,91,48,44,50,44,49, +44,50,93,93,44,34,58,34,58,110,162,91,91,48,46,52,44,48,46,52,44,48,46,54,44,48,46,52,93,44,91,48, +46,54,44,48,46,52,44,48,46,54,44,48,46,54,93,44,91,48,46,54,44,48,46,54,44,48,46,52,44,48,46,54, +93,44,91,48,46,52,44,48,46,52,44,48,46,52,44,48,46,54,93,44,91,48,46,52,44,49,46,52,44,48,46,54, +44,49,46,52,93,44,91,48,46,54,44,49,46,52,44,48,46,54,44,49,46,54,93,44,91,48,46,54,44,49,46,54, +44,48,46,52,44,49,46,54,93,44,91,48,46,52,44,49,46,52,44,48,46,52,44,49,46,54,93,93,125,59,10,170, +100,114,97,119,68,105,103,105,116,115,40,108,97,115,116,84,101,120,116,44,116,104,105,115,84,101,120,116,44,110,41,123, +34,114,97,109,34,174,112,61,67,72,65,82,80,59,174,115,61,67,72,65,82,87,59,172,120,61,48,59,103,46,114,101, +115,101,116,40,41,59,167,40,172,105,61,48,59,105,60,108,97,115,116,84,101,120,116,46,108,101,110,103,116,104,59,105, +152,41,123,172,108,97,115,116,67,104,61,108,97,115,116,84,101,120,116,91,105,93,59,172,116,104,105,115,67,104,61,116, +104,105,115,84,101,120,116,91,105,93,59,163,40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59,163,40,108,97, +115,116,67,104,140,116,104,105,115,67,104,41,123,172,99,104,44,99,104,110,61,110,59,163,40,40,116,104,105,115,67,104, +45,49,138,108,97,115,116,67,104,160,40,116,104,105,115,67,104,138,48,158,108,97,115,116,67,104,138,53,41,160,40,116, +104,105,115,67,104,138,48,158,108,97,115,116,67,104,138,57,41,41,41,99,104,61,108,97,115,116,67,104,59,164,123,99, +104,61,116,104,105,115,67,104,59,99,104,110,61,48,59,125,98,117,102,46,99,108,101,97,114,40,41,59,163,40,99,104, +138,34,53,34,41,99,104,61,40,108,97,115,116,67,104,138,53,158,116,104,105,115,67,104,138,48,41,63,34,53,116,111, +48,34,58,34,53,116,111,54,34,59,172,108,61,68,73,71,73,84,83,91,99,104,93,40,99,104,110,41,59,108,46,102, +111,114,69,97,99,104,40,99,162,123,163,40,99,91,48,93,140,99,91,50,93,41,98,117,102,46,102,105,108,108,82,101, +99,116,40,112,43,99,91,48,93,42,115,44,99,91,49,93,42,115,44,112,43,99,91,50,93,42,115,44,50,42,112,43, +99,91,51,93,42,115,41,59,164,163,40,99,91,49,93,140,99,91,51,93,41,98,117,102,46,102,105,108,108,82,101,99, +116,40,99,91,48,93,42,115,44,112,43,99,91,49,93,42,115,44,50,42,112,43,99,91,50,93,42,115,44,112,43,99, +91,51,93,42,115,41,59,125,41,59,103,46,100,114,97,119,73,109,97,103,101,40,98,117,102,105,109,103,44,120,44,89, +41,59,125,163,40,116,104,105,115,67,104,138,34,58,34,41,120,151,52,59,120,150,115,43,112,43,55,59,125,125,10,170, +100,114,97,119,69,118,101,114,121,116,104,105,110,103,69,108,115,101,40,41,123,172,120,61,40,67,72,65,82,87,43,67, +72,65,82,80,43,54,41,42,53,59,172,121,61,89,43,50,42,67,72,65,82,87,43,67,72,65,82,80,59,172,100,61, +184,68,97,116,101,40,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56, +34,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,100,114,97,119,83, +116,114,105,110,103,40,40,34,48,34,43,100,46,103,101,116,83,101,99,111,110,100,115,40,41,41,46,115,117,98,115,116, +114,40,45,50,41,44,120,44,121,45,56,44,180,41,59,163,40,105,115,49,50,72,111,117,114,41,103,46,100,114,97,119, +83,116,114,105,110,103,40,40,100,46,103,101,116,72,111,117,114,115,40,41,60,49,50,41,63,34,65,77,34,58,34,80, +77,34,44,120,44,89,43,52,44,180,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41, +59,172,100,97,116,101,61,108,111,99,97,108,101,46,100,97,116,101,40,100,44,181,41,59,103,46,100,114,97,119,83,116, +114,105,110,103,40,100,97,116,101,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,121,43,56,44,180,41,59, +125,10,170,115,104,111,119,84,105,109,101,40,41,123,163,40,97,110,105,109,73,110,116,101,114,118,97,108,41,171,59,172, +100,61,184,68,97,116,101,40,41,59,172,104,111,117,114,115,61,100,46,103,101,116,72,111,117,114,115,40,41,59,163,40, +105,115,49,50,72,111,117,114,41,104,111,117,114,115,61,40,40,104,111,117,114,115,43,49,49,41,37,49,50,41,43,49, +59,172,116,61,40,34,32,34,43,104,111,117,114,115,41,46,115,117,98,115,116,114,40,45,50,41,43,34,58,34,43,40, +34,48,34,43,100,46,103,101,116,77,105,110,117,116,101,115,40,41,41,46,115,117,98,115,116,114,40,45,50,41,59,172, +108,61,108,97,115,116,84,105,109,101,59,163,40,116,138,108,160,108,138,34,45,45,45,45,45,34,41,123,100,114,97,119, +68,105,103,105,116,115,40,108,44,116,44,48,41,59,100,114,97,119,69,118,101,114,121,116,104,105,110,103,69,108,115,101, +40,41,59,108,97,115,116,84,105,109,101,61,116,59,171,59,125,172,110,61,48,59,97,110,105,109,73,110,116,101,114,118, +97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,49,47,49,48,59,163,40,110,145,49,41, +123,110,61,49,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73,110,116,101,114,118,97,108,41, +59,97,110,105,109,73,110,116,101,114,118,97,108,61,183,59,125,100,114,97,119,68,105,103,105,116,115,40,108,44,116,44, +110,41,59,125,44,50,48,41,59,108,97,115,116,84,105,109,101,61,116,59,125,10,66,97,110,103,108,101,46,111,110,40, +39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,97,110,105,109,73,110,116,101,114,118,97,108,41, +123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,97,110,105,109,73,110,116,101,114,118,97,108,41,59,97,110,105, +109,73,110,116,101,114,118,97,108,61,183,59,125,163,40,116,105,109,101,73,110,116,101,114,118,97,108,41,123,99,108,101, +97,114,73,110,116,101,114,118,97,108,40,116,105,109,101,73,110,116,101,114,118,97,108,41,59,116,105,109,101,73,110,116, +101,114,118,97,108,61,183,59,125,163,40,111,110,41,123,115,104,111,119,84,105,109,101,40,41,59,116,105,109,101,73,110, +116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44,49,48,48,48, +41,59,125,164,123,108,97,115,116,84,105,109,101,61,34,45,45,45,45,45,34,59,125,125,41,59,10,103,46,99,108,101, +97,114,40,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103, +108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,116,105,109,101,73,110,116,101,114,118,97,108,61,115, +101,116,73,110,116,101,114,118,97,108,40,115,104,111,119,84,105,109,101,44,49,48,48,48,41,59,10,115,104,111,119,84, +105,109,101,40,41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40,34,99,108,111,99,107,34,41,59,255,255,255, +131,4,0,0,109,99,108,111,99,107,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +48,48,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0, -0,0,0,0,0,8,136,136,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,136,136,136, -136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136, -136,136,0,0,0,0,0,0,0,0,0,8,136,136,136,131,255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0, -0,0,0,136,136,136,131,255,255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0,0,0,0,136,136,136,63,255, -255,255,240,15,255,255,255,243,136,136,136,0,0,0,0,0,0,0,8,136,136,143,255,255,255,255,240,15,255,255,255,255, -248,136,136,128,0,0,0,0,0,0,136,136,136,255,255,255,255,255,240,15,255,255,255,255,255,136,136,136,0,0,0,0, -0,0,136,136,131,255,255,255,255,255,240,15,255,255,255,255,255,56,136,136,0,0,0,0,0,8,136,136,63,255,255,255, -255,255,240,15,255,255,255,255,255,243,136,136,128,0,0,0,0,8,136,136,255,255,255,255,255,255,240,15,255,255,255,255, -255,255,136,136,128,0,0,0,0,136,136,131,255,255,255,255,255,255,240,15,255,255,255,255,255,255,56,136,136,0,0,0, -0,136,136,143,255,255,255,255,255,255,240,15,255,255,255,255,255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255, -255,255,240,15,255,255,255,255,255,255,248,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,240,15,255,255,255,255, -255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,32,2,255,255,255,255,255,255,243,136,136,0,0,0, -0,136,136,255,255,255,255,255,255,242,0,0,47,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255, -255,240,8,128,15,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255, -255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,242,0,0,3,255,255,255,255,255,255,136,136,0,0,0, -0,136,136,63,255,255,255,255,255,255,32,0,0,63,255,255,255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255, -255,255,255,243,0,3,255,255,255,255,243,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,255,255,48,0,63,255, -255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,255,255,243,0,3,255,255,255,248,136,136,0,0,0, -0,136,136,131,255,255,255,255,255,255,255,255,255,48,47,255,255,255,56,136,136,0,0,0,0,8,136,136,255,255,255,255, -255,255,255,255,255,243,255,255,255,255,136,136,128,0,0,0,0,8,136,136,63,255,255,255,255,255,255,255,255,255,255,255, -255,243,136,136,128,0,0,0,0,0,136,136,131,255,255,255,255,255,255,255,255,255,255,255,255,56,136,136,0,0,0,0, -0,0,136,136,136,255,255,255,255,255,255,255,255,255,255,255,255,136,136,136,0,0,0,0,0,0,8,136,136,143,255,255, -255,255,255,255,255,255,255,255,248,136,136,128,0,0,0,0,0,0,0,136,136,136,63,255,255,255,255,255,255,255,255,243, -136,136,136,0,0,0,0,0,0,0,0,136,136,136,131,255,255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0, -0,0,0,8,136,136,136,131,255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0,0,0,0,0,136,136,136,136, -136,51,255,255,51,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136, -136,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, -136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136, +136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0, +0,0,0,0,0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136,136,136,0,0,0,0,0,0,0,0,0,8, +136,136,136,131,255,255,255,255,255,255,56,136,136,136,128,0,0,0,0,0,0,0,0,136,136,136,131,255,255,255,255,255, +255,255,255,56,136,136,136,0,0,0,0,0,0,0,0,136,136,136,63,255,255,255,240,15,255,255,255,243,136,136,136,0, +0,0,0,0,0,0,8,136,136,143,255,255,255,255,240,15,255,255,255,255,248,136,136,128,0,0,0,0,0,0,136,136, +136,255,255,255,255,255,240,15,255,255,255,255,255,136,136,136,0,0,0,0,0,0,136,136,131,255,255,255,255,255,240,15, +255,255,255,255,255,56,136,136,0,0,0,0,0,8,136,136,63,255,255,255,255,255,240,15,255,255,255,255,255,243,136,136, +128,0,0,0,0,8,136,136,255,255,255,255,255,255,240,15,255,255,255,255,255,255,136,136,128,0,0,0,0,136,136,131, +255,255,255,255,255,255,240,15,255,255,255,255,255,255,56,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,240,15, +255,255,255,255,255,255,248,136,136,0,0,0,0,136,136,143,255,255,255,255,255,255,240,15,255,255,255,255,255,255,248,136, +136,0,0,0,0,136,136,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,136,136,0,0,0,0,136,136,63, +255,255,255,255,255,255,32,2,255,255,255,255,255,255,243,136,136,0,0,0,0,136,136,255,255,255,255,255,255,242,0,0, +47,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255,255,255,255,136, +136,0,0,0,0,136,136,255,255,255,255,255,255,240,8,128,15,255,255,255,255,255,255,136,136,0,0,0,0,136,136,255, +255,255,255,255,255,242,0,0,3,255,255,255,255,255,255,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,32,0, +0,63,255,255,255,255,243,136,136,0,0,0,0,136,136,63,255,255,255,255,255,255,255,243,0,3,255,255,255,255,243,136, +136,0,0,0,0,136,136,143,255,255,255,255,255,255,255,255,48,0,63,255,255,255,248,136,136,0,0,0,0,136,136,143, +255,255,255,255,255,255,255,255,243,0,3,255,255,255,248,136,136,0,0,0,0,136,136,131,255,255,255,255,255,255,255,255, +255,48,47,255,255,255,56,136,136,0,0,0,0,8,136,136,255,255,255,255,255,255,255,255,255,243,255,255,255,255,136,136, +128,0,0,0,0,8,136,136,63,255,255,255,255,255,255,255,255,255,255,255,255,243,136,136,128,0,0,0,0,0,136,136, +131,255,255,255,255,255,255,255,255,255,255,255,255,56,136,136,0,0,0,0,0,0,136,136,136,255,255,255,255,255,255,255, +255,255,255,255,255,136,136,136,0,0,0,0,0,0,8,136,136,143,255,255,255,255,255,255,255,255,255,255,248,136,136,128, +0,0,0,0,0,0,0,136,136,136,63,255,255,255,255,255,255,255,255,243,136,136,136,0,0,0,0,0,0,0,0,136, +136,136,131,255,255,255,255,255,255,255,255,56,136,136,136,0,0,0,0,0,0,0,0,8,136,136,136,131,255,255,255,255, +255,255,56,136,136,136,128,0,0,0,0,0,0,0,0,0,136,136,136,136,136,51,255,255,51,136,136,136,136,136,0,0, +0,0,0,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0, +0,8,136,136,136,136,136,136,136,136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136, +136,136,136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,136,136,136,136,136,128,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,190,0,0,0,109,99,108,111,99,107,46,105,110,102,111,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,109,99,108,111,99,107,34,44,34, -110,97,109,101,34,58,34,77,111,114,112,104,105,110,103,32,67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99, -108,111,99,107,34,44,34,115,114,99,34,58,34,109,99,108,111,99,107,46,97,112,112,46,106,115,34,44,34,105,99,111, -110,34,58,34,109,99,108,111,99,107,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,57,44,34, -118,101,114,115,105,111,110,34,58,34,48,46,48,55,34,44,34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34, -102,105,108,101,115,34,58,34,109,99,108,111,99,107,46,105,110,102,111,44,109,99,108,111,99,107,46,97,112,112,46,106, -115,44,109,99,108,111,99,107,46,105,109,103,34,125,255,255,95,38,0,0,97,98,111,117,116,46,97,112,112,46,106,115, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,69,78,86,61,112,114,111,99,101,115,115,46,101,110,118, -59,10,172,77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114,121,40,41,59,10,172,115,61,114,101,113,117, -105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,103,46,99,108,101,97,114,40,49,41,59,10,103,46,115,101, -116,70,111,110,116,40,34,54,120,56,34,41,59,10,172,121,61,50,52,44,104,61,56,59,10,163,40,103,46,103,101,116, -87,105,100,116,104,40,41,145,50,52,48,41,123,103,46,100,114,97,119,73,109,97,103,101,40,114,101,113,117,105,114,101, -40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34, -118,69,52,103,81,90,87,103,47,47,65,65,73,51,90,104,52,100,67,111,65,100,54,119,65,100,54,52,65,100,50,106, -52,100,54,108,52,100,99,110,52,100,67,54,65,100,99,43,65,100,89,118,52,100,85,103,103,72,71,47,47,107,103,78, -47,47,65,71,66,49,87,107,68,112,107,79,65,119,115,72,47,103,68,66,103,74,52,67,84,82,119,100,71,108,54,82, -68,108,47,48,103,72,81,103,74,101,77,68,111,50,47,65,103,99,68,73,65,73,107,66,110,65,100,82,103,74,121,67, -65,65,81,100,68,108,103,100,82,103,90,80,68,103,98,87,66,68,111,85,99,68,113,77,80,82,89,99,74,103,69,102, -111,65,55,85,104,57,65,65,103,81,49,66,69,103,73,100,66,110,103,100,82,75,81,73,65,67,109,66,98,66,54,65, -100,66,50,103,100,82,110,111,69,68,121,66,43,67,56,116,98,98,81,86,112,103,78,65,113,79,107,65,119,77,71,121, -69,81,68,111,77,66,49,65,73,66,118,103,100,68,80,89,77,67,43,72,47,47,55,122,66,103,47,47,43,102,65,65, -52,79,65,103,72,47,47,116,119,68,111,77,118,47,52,87,66,51,105,121,69,65,65,80,119,72,73,78,118,84,89,77, -65,118,47,65,47,115,67,54,66,109,66,104,47,119,68,111,80,52,103,73,117,66,100,119,97,121,66,65,65,80,47,68, -111,77,72,52,70,52,84,111,81,83,66,43,69,80,74,81,85,79,103,75,109,68,66,103,73,65,66,104,65,100,70,66, -52,76,55,66,103,102,65,65,89,78,119,106,112,75,67,104,119,74,66,84,73,81,100,68,105,65,100,70,103,72,103,65, -89,73,100,68,109,68,97,67,79,52,77,68,57,87,113,49,52,100,77,43,67,100,67,68,111,85,48,110,68,106,67,104, -121,104,66,65,65,73,100,70,115,103,100,84,90,103,97,86,68,109,80,89,76,74,107,48,76,73,111,100,68,97,73,99, -120,99,73,76,82,68,83,111,56,48,106,105,86,69,67,103,85,65,118,103,68,67,109,71,48,89,81,84,82,72,68,111, -84,82,66,103,76,82,67,77,119,74,68,66,110,111,100,68,101,65,77,68,75,111,85,118,65,73,85,47,68,111,99,68, -54,69,76,68,111,75,82,67,65,73,77,47,76,73,99,71,71,52,80,81,85,73,75,67,66,85,52,80,122,68,111,97, -69,66,47,112,51,66,70,81,75,75,67,104,57,65,68,111,88,115,75,73,86,86,113,111,110,67,116,86,66,111,70,81, -99,65,85,75,121,70,119,103,104,100,66,51,73,80,66,67,119,74,90,67,65,81,77,102,69,103,81,65,76,50,65,71, -70,103,90,74,66,68,111,90,103,68,65,66,69,77,87,89,81,74,70,103,76,119,67,107,65,67,66,47,103,100,76,87, -89,77,67,102,111,81,65,69,51,53,66,69,68,112,107,72,56,69,102,100,103,89,65,68,108,52,109,68,108,54,56,66, -65,66,97,122,66,70,66,65,50,67,103,75,56,67,65,66,99,66,85,90,80,47,56,107,66,118,53,56,67,65,67,49, -47,47,52,65,66,85,81,119,65,83,110,52,100,103,79,120,111,65,76,108,52,100,67,52,65,100,89,106,52,100,54,104, -52,100,43,119,65,100,54,111,65,100,50,103,52,100,67,65,119,81,65,61,34,41,41,44,49,50,48,44,121,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74,83,46,67,79,77,34,44,49,50,48,44,121, -45,52,41,59,125,164,123,121,61,45,40,52,43,104,41,59,125,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -80,111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105,110,111,34,44,48,44,121,150,52,43,104,41,59,10,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105,111,110,32,34,43,69,78,86,46,86,69,82,83,73, -79,78,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,111,109,109,105,116,32, -34,43,69,78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44,121,150,104,41,59,10,170,103,101,116,86,101,114, -115,105,111,110,40,110,97,109,101,44,102,105,108,101,41,123,172,106,61,115,46,114,101,97,100,74,83,79,78,40,102,105, -108,101,44,49,41,59,172,118,61,40,34,111,98,106,101,99,116,34,138,191,106,41,63,106,46,118,101,114,115,105,111,110, -58,181,59,103,46,100,114,97,119,83,116,114,105,110,103,40,118,63,40,110,97,109,101,43,34,32,34,43,40,118,63,34, -118,34,43,118,58,34,85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34,43,110,97,109,101,44,48,44,121,150, -104,41,59,125,10,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111, -111,116,46,105,110,102,111,34,41,59,10,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34, -44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,10,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116, -116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,59,10,121,150,104,59,10,103,46,100, -114,97,119,83,116,114,105,110,103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114,105,97,98,108, -101,115,32,97,118,97,105,108,97,98,108,101,34,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114,105, -110,103,40,34,83,116,111,114,97,103,101,58,32,34,43,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, -34,41,46,103,101,116,70,114,101,101,40,41,146,49,48,41,43,34,107,32,102,114,101,101,34,44,48,44,121,150,104,41, -59,10,163,40,69,78,86,46,83,84,79,82,65,71,69,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,32,32, -32,32,32,32,32,32,32,34,43,40,69,78,86,46,83,84,79,82,65,71,69,146,49,48,41,43,34,107,32,116,111,116, -97,108,34,44,48,44,121,150,104,41,59,10,163,40,69,78,86,46,83,80,73,70,76,65,83,72,41,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,83,80,73,32,70,108,97,115,104,58,32,34,43,40,69,78,86,46,83,80,73,70,76, -65,83,72,146,49,48,41,43,34,107,34,44,48,44,121,150,104,41,59,10,103,46,115,101,116,70,111,110,116,65,108,105, -103,110,40,48,44,45,49,41,59,10,103,46,102,108,105,112,40,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40, -114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115, -40,97,116,111,98,40,34,43,70,81,103,108,43,120,110,117,56,65,73,66,119,71,81,103,72,117,65,111,78,51,103,70, -47,104,99,76,103,69,72,117,57,52,51,71,51,104,119,85,67,68,119,73,66,67,65,65,86,51,117,69,65,104,111,66, -66,104,115,79,57,48,79,103,72,103,111,65,67,66,104,48,73,104,80,53,65,65,81,88,66,103,56,72,56,72,119,43, -71,119,69,65,88,110,52,65,69,67,120,71,65,104,48,77,69,65,79,101,74,65,77,80,51,43,47,104,117,73,71,52, -99,77,103,49,109,77,111,103,56,66,104,110,115,65,81,73,66,67,47,47,47,74,52,77,78,54,72,99,66,73,79,73, -65,65,80,115,56,72,108,57,110,77,53,103,99,66,48,72,103,56,53,50,66,65,73,77,65,73,52,89,65,67,73,73, -73,65,67,104,56,65,75,65,99,65,118,65,54,68,55,118,100,55,119,84,66,84,89,74,51,66,57,101,43,104,69,65, -104,65,52,67,121,72,117,121,56,72,88,119,50,57,78,103,73,65,66,120,43,65,83,81,75,115,66,89,103,82,51,68, -103,72,81,67,73,88,77,115,69,65,65,73,79,90,121,71,90,122,120,51,68,104,47,65,53,55,73,68,80,111,88,78, -52,72,78,72,119,81,111,66,57,119,65,66,121,68,118,66,79,52,76,104,68,79,119,82,52,70,100,52,99,80,47,52, -111,66,48,68,87,67,100,52,53,86,67,103,70,70,65,89,80,117,79,52,81,65,67,103,69,101,100,52,80,119,101,65, -73,76,66,78,52,78,112,119,69,77,88,73,76,118,66,79,52,98,118,68,47,102,47,100,52,99,80,67,89,74,49,66, -65,65,75,83,67,122,112,51,69,47,104,78,66,74,119,80,122,105,69,80,43,72,56,104,114,118,68,57,68,116,67,53, -77,74,100,52,82,84,66,71,111,76,118,66,104,101,55,66,81,74,83,66,65,65,101,65,73,52,73,111,67,79,52,84, -50,67,104,56,78,54,68,118,68,101,65,80,103,113,70,81,100,52,56,77,105,66,51,66,69,52,99,73,47,65,118,67, -53,110,115,52,65,75,67,100,103,81,65,68,47,47,119,85,119,77,77,104,104,103,66,79,52,78,109,100,52,120,69,68, -53,55,118,68,43,69,119,70,103,75,84,67,89,111,79,78,47,43,118,47,47,47,47,79,90,119,71,88,103,70,53,53, -118,81,73,52,84,97,66,69,81,82,120,66,54,72,119,55,68,82,67,65,65,80,103,79,52,52,65,67,75,89,108,70, -111,66,51,67,72,73,99,65,105,69,65,105,57,51,73,52,74,112,67,100,65,82,109,66,100,52,73,65,70,100,52,81, -65,69,52,72,65,53,47,47,104,104,49,66,65,73,73,80,66,121,65,53,66,69,81,85,77,47,110,56,79,52,84,122, -67,65,65,81,116,66,104,118,100,47,88,56,100,52,89,89,66,118,119,79,66,79,52,76,118,66,89,73,111,75,66,104, -47,89,101,119,102,65,54,66,51,68,76,111,80,47,100,52,74,88,71,65,66,77,66,105,75,107,69,65,65,119,75,72, -57,76,121,70,79,52,102,119,79,111,82,51,68,100,52,84,68,68,53,47,65,74,81,99,119,68,103,99,79,57,122,118, -67,49,118,100,55,111,99,66,120,117,65,118,104,51,67,117,69,72,104,53,106,67,69,111,79,80,103,72,102,47,53,51, -67,71,103,77,65,111,71,103,98,103,88,47,67,103,74,90,69,65,73,89,65,66,53,72,73,98,120,82,67,66,65,89, -85,76,104,90,102,66,65,65,77,65,47,71,65,47,52,55,66,100,52,52,65,66,104,52,67,66,103,49,109,103,56,65, -51,89,65,66,51,118,116,79,52,99,77,87,120,118,71,53,118,100,90,89,87,73,119,56,65,118,80,81,100,52,78,119, -82,119,85,119,65,89,73,108,66,104,115,78,71,111,82,51,67,113,66,51,66,73,65,82,52,66,70,65,88,72,65,73, -103,47,67,82,65,73,68,66,73,103,116,72,72,73,82,51,68,51,90,104,67,90,89,88,119,119,66,114,67,79,65,88, -80,53,110,56,53,53,107,78,79,52,79,65,66,73,121,120,67,72,89,99,68,109,100,117,116,79,90,65,52,86,65,65, -89,85,78,113,66,48,68,65,65,81,102,68,75,73,86,109,115,51,65,65,103,74,51,66,104,66,77,66,74,119,103,65, -72,104,105,55,68,68,73,81,65,66,103,108,57,67,73,114,118,67,101,65,74,51,74,65,66,80,77,52,65,111,66,104, -113,98,68,73,103,73,48,67,77,81,102,100,79,103,82,51,69,53,110,71,53,77,122,73,65,73,66,66,65,81,73,65, -66,119,65,53,66,103,85,103,107,69,105,69,65,101,55,104,119,69,67,116,103,67,66,50,66,51,66,98,119,77,74,57, -79,101,121,66,76,73,104,51,103,70,65,84,118,67,80,73,84,117,68,104,111,67,69,103,70,86,113,113,48,66,47,47, -119,47,47,47,77,81,87,73,98,89,74,107,70,65,65,73,106,66,69,111,82,51,68,67,111,79,65,56,65,51,67,89, -65,79,118,104,47,119,69,52,76,118,69,75,111,76,118,67,111,69,69,47,55,120,68,65,65,121,47,67,50,71,43,103, -119,50,68,78,81,50,101,57,73,48,68,66,103,120,73,66,120,71,65,87,103,83,49,68,65,65,102,100,55,112,89,69, -54,66,114,66,87,119,85,73,104,50,79,65,119,76,99,71,78,81,79,65,53,106,98,67,100,52,103,65,67,79,52,79, -103,65,103,77,72,117,52,97,66,68,111,107,75,103,71,73,90,52,76,116,66,111,103,65,66,66,103,88,119,52,72,119, -104,110,76,53,108,119,69,81,88,103,100,52,86,51,66,65,73,100,66,98,52,106,118,66,79,52,47,117,73,65,102,81, -75,65,74,51,71,104,55,115,67,54,47,88,55,111,103,66,85,73,76,48,66,67,119,74,51,67,104,72,111,79,52,81, -101,67,79,52,89,72,66,88,65,81,67,66,79,52,120,81,66,74,111,89,86,66,78,119,73,66,66,104,87,113,48,72, -68,119,69,79,67,73,80,117,111,68,116,73,72,52,76,117,67,65,65,79,119,77,73,82,51,66,85,65,84,110,73,102, -103,90,57,66,70,89,75,72,66,100,53,110,81,75,119,73,67,66,66,89,87,65,80,111,74,51,66,47,47,47,100,53, -72,77,53,106,118,68,52,68,120,66,100,52,80,81,71,119,73,66,67,72,73,77,65,101,65,81,65,69,104,81,73,67, -52,71,73,98,111,81,65,66,66,52,105,102,66,87,52,90,101,67,65,65,79,43,69,119,74,121,66,78,81,86,50,115, -68,118,67,65,65,119,54,68,65,65,97,76,70,68,103,80,119,66,52,107,78,71,73,85,74,53,73,51,67,99,111,111, -65,72,79,52,79,90,122,73,76,72,43,65,65,66,70,103,99,75,101,65,97,43,68,100,52,112,51,74,100,52,43,76, -100,52,106,117,67,104,110,77,117,122,48,68,78,81,81,65,66,66,65,77,79,77,52,82,113,68,117,70,119,89,52,73, -85,69,71,112,76,119,66,56,68,106,66,43,65,67,66,67,52,107,74,121,65,69,67,57,51,117,121,65,65,66,68,111, -120,76,66,56,72,119,70,89,84,108,66,65,73,77,77,70,73,74,108,69,81,81,74,51,66,67,111,73,89,66,68,103, -85,76,67,73,112,90,67,81,52,89,71,66,117,53,112,66,104,110,47,117,52,85,69,120,66,50,66,78,111,77,79,57, -119,66,66,57,120,113,68,79,52,74,101,69,69,81,75,84,70,120,65,66,66,119,72,74,104,51,101,120,50,80,57,43, -74,120,110,99,90,65,74,99,66,104,77,74,79,52,109,90,79,52,100,103,88,89,82,80,67,87,81,81,122,70,52,65, -65,66,82,73,104,72,66,53,103,65,67,66,89,80,101,83,65,99,65,120,79,65,65,89,73,67,67,100,119,75,48,67, -81,89,102,99,47,73,54,66,78,89,101,65,79,119,73,65,75,66,103,77,77,81,73,73,72,67,56,69,80,47,47,47, -65,111,76,107,66,103,72,52,43,65,77,67,100,52,117,111,120,87,73,49,66,51,69,65,65,79,81,122,73,68,66,115, -119,67,66,99,73,119,65,71,66,111,115,79,104,55,100,67,104,117,78,65,89,88,118,76,52,73,80,67,104,71,89,103, -69,80,43,65,110,70,70,111,120,51,66,57,118,116,79,52,76,118,66,71,52,55,47,67,99,111,102,79,80,111,89,65, -66,87,73,73,122,67,100,52,98,89,67,66,52,78,119,103,119,70,66,100,52,73,66,66,104,73,48,66,104,54,52,67, -100,119,73,72,66,100,119,74,73,66,100,65,113,55,66,69,103,84,119,68,65,103,97,120,66,65,81,77,74,104,118,100, -66,65,76,117,66,66,65,73,81,68,101,65,77,80,104,47,65,68,81,79,72,50,43,73,104,112,101,68,102,103,98,118, -68,90,65,77,80,53,52,65,67,77,111,74,99,67,115,65,89,67,53,110,79,86,52,79,88,99,103,81,65,68,100,52, -81,65,68,115,56,72,115,70,50,103,49,81,83,119,81,65,69,43,65,99,71,82,73,76,104,68,47,53,99,68,69,52, -121,83,68,65,103,99,71,119,71,100,120,113,118,68,100,52,106,51,66,67,73,77,80,53,105,83,67,118,102,81,99,65, -54,83,66,57,119,76,66,120,66,109,66,65,65,88,47,72,52,76,107,68,83,65,99,79,70,111,79,88,103,71,55,50, -65,103,69,100,52,73,65,68,113,69,70,65,81,107,76,57,51,114,104,122,72,67,76,103,82,73,66,67,119,98,119,67, -66,103,83,70,66,79,111,76,118,66,119,69,77,103,54,88,66,66,103,73,88,68,79,52,87,74,104,117,78,72,81,121, -79,70,43,68,118,67,117,43,119,50,47,81,72,111,81,65,67,66,89,80,116,55,113,115,67,65,65,80,103,79,81,76, -118,74,65,65,101,88,104,89,100,67,90,89,73,66,66,75,89,79,65,65,73,73,47,73,51,121,77,66,54,67,111,66, -100,52,85,68,103,98,118,68,79,52,52,103,66,80,73,81,43,66,87,52,89,65,68,68,52,84,118,66,79,111,73,50, -70,75,65,48,65,48,65,65,66,65,119,102,117,57,111,79,70,79,119,80,103,65,81,76,103,66,68,111,113,119,66,65, -81,73,74,70,79,53,81,65,67,74,73,80,47,74,81,73,68,67,43,65,86,67,79,52,76,114,66,100,103,106,117,69, -50,52,117,66,47,55,117,70,100,52,110,119,81,111,98,48,68,120,69,78,55,117,73,86,120,74,51,69,49,82,51,66, -104,48,79,78,111,90,43,69,57,51,103,65,73,73,80,67,86,81,55,102,68,103,69,78,65,119,82,104,67,56,65,87, -66,69,52,76,118,78,65,65,88,100,97,81,115,65,109,65,72,69,79,52,81,65,66,104,79,90,121,66,54,66,120,66, -51,66,73,103,51,81,72,52,80,81,47,71,73,69,73,73,65,71,81,73,77,80,84,81,77,65,104,84,117,66,49,68, -97,69,57,120,78,67,65,81,84,118,67,76,103,81,65,67,121,68,99,68,65,65,87,73,70,65,82,98,68,51,101,119, -57,121,99,69,75,73,76,118,67,65,66,107,77,65,65,77,65,103,90,75,67,65,65,89,108,66,72,111,103,56,66,65, -65,114,113,68,79,52,109,80,120,53,98,66,117,67,84,68,67,89,87,102,104,47,80,54,65,101,70,78,103,86,119,103, -55,70,69,97,73,84,118,67,52,66,73,66,52,66,51,72,77,103,88,100,69,119,80,47,86,119,121,67,66,79,52,81, -112,66,56,65,52,71,65,66,105,85,67,65,67,66,50,67,79,111,73,66,67,120,72,52,119,69,77,50,56,65,53,104, -89,67,103,69,71,115,122,118,67,54,70,51,78,111,106,75,66,117,70,51,79,52,103,43,68,80,81,80,65,65,65,87, -81,47,55,71,66,53,110,77,72,52,56,68,43,65,115,67,71,52,82,68,67,70,52,89,70,67,80,52,79,65,119,68, -52,71,74,103,81,67,66,104,107,74,66,89,103,56,66,66,81,73,109,67,67,103,103,65,66,66,65,81,67,66,78,103, -73,65,66,100,52,85,76,53,100,119,66,65,83,90,81,120,71,65,75,81,99,78,65,103,80,117,81,103,74,117,66,104, -110,65,122,56,65,47,107,77,53,53,51,71,70,119,77,119,79,52,80,80,104,99,65,47,51,119,68,52,83,98,69,100, -52,77,73,71,65,76,52,67,65,65,78,119,72,52,121,111,66,82,81,83,99,68,79,89,52,65,77,47,71,73,43,69, -77,51,103,88,67,83,73,90,101,66,103,56,65,117,55,118,69,79,52,118,81,74,103,73,65,66,43,66,84,66,56,68, -118,73,47,47,56,70,81,76,122,66,70,89,80,76,53,89,68,66,75,81,118,81,100,53,90,51,70,89,111,85,80,79, -52,90,85,66,67,81,79,102,47,53,89,68,86,111,73,70,68,73,119,78,119,43,67,85,72,66,103,81,65,68,69,65, -79,73,85,81,110,72,103,57,119,103,43,56,55,49,52,122,85,81,67,89,98,118,66,79,52,112,68,70,88,119,82,80, -66,100,52,85,79,102,119,73,122,66,53,101,55,85,52,103,65,77,79,52,82,52,66,65,52,83,52,72,104,103,105,66, -79,52,53,50,68,82,81,99,80,53,52,69,67,121,69,74,122,74,51,68,107,89,88,68,71,73,73,65,66,82,81,84, -118,67,86,111,73,48,69,104,118,99,90,103,104,70,67,117,52,81,66,97,81,104,75,69,100,89,73,73,70,79,52,109, -55,104,101,119,71,73,73,82,70,69,74,65,65,70,77,89,82,81,67,82,81,90,51,70,88,89,85,79,67,89,88,103, -100,52,99,74,104,74,53,66,66,73,77,79,103,69,57,109,65,89,67,120,71,65,100,52,107,65,100,119,74,51,68,122, -73,89,66,104,117,57,79,119,98,118,68,80,119,113,84,67,99,73,56,76,65,89,85,56,51,103,69,67,50,66,52,66, -67,111,80,56,53,110,115,52,90,54,66,79,53,85,80,47,53,108,67,65,65,122,43,68,70,52,107,80,79,111,73,66, -66,67,52,101,103,103,71,112,100,111,74,101,66,104,51,103,103,69,68,107,76,118,71,72,82,79,101,68,65,77,73,55, -114,70,69,84,89,76,86,66,51,101,119,54,65,77,68,74,119,120,75,69,103,99,65,81,103,90,51,68,53,47,47,53, -51,79,110,107,56,79,52,97,43,66,65,73,79,54,50,68,118,73,75,81,77,74,75,73,77,73,90,111,102,81,104,51, -117,79,81,73,65,66,82,52,88,47,66,103,76,116,66,100,52,104,51,66,52,43,81,105,70,50,103,122,106,67,101,103, -103,65,66,53,118,109,119,71,114,100,52,89,65,68,83,89,77,71,121,50,87,100,52,106,79,68,100,52,106,53,69,65, -65,53,50,66,77,119,76,118,66,53,51,117,79,52,77,78,84,73,85,66,103,73,82,66,49,84,79,66,65,65,74,108, -66,65,66,107,72,74,65,88,103,72,89,73,57,67,88,65,75,54,67,98,119,118,103,104,120,51,66,65,111,78,103,65, -81,73,49,66,105,77,65,119,53,51,69,120,74,51,66,65,65,85,77,104,87,81,104,112,116,67,100,52,84,51,68,78, -119,122,71,66,104,104,53,66,104,110,77,80,111,81,69,68,66,65,110,77,53,106,118,66,52,89,73,66,70,81,85,81, -43,69,81,100,52,112,108,66,70,89,90,76,67,71,103,118,81,117,68,118,67,79,52,47,103,100,111,87,90,122,73,87, -68,79,52,84,118,68,71,89,73,66,66,120,71,76,119,43,72,79,52,79,75,79,52,110,65,49,87,81,52,71,119,70, -89,77,71,66,73,77,76,51,97,54,73,47,53,51,67,103,69,79,90,120,111,65,70,79,52,77,80,103,80,120,83,119, -73,65,69,57,51,103,83,73,81,65,67,113,115,70,113,69,77,70,52,77,76,101,65,98,106,70,87,52,85,65,48,65, -66,67,65,65,109,79,83,119,112,51,68,120,101,55,104,65,105,71,104,97,51,66,104,79,81,104,65,78,67,100,52,87, -47,108,55,69,68,121,71,81,122,73,76,66,71,52,76,52,71,80,52,90,51,79,68,103,75,86,66,76,103,89,104,66, -76,52,77,77,47,107,65,47,76,99,66,111,72,119,111,67,65,70,54,72,117,101,65,76,100,66,104,51,43,101,65,81, -65,66,117,69,72,99,103,75,100,70,98,103,81,66,66,52,74,116,68,51,89,65,71,103,71,119,85,111,73,105,68,65, -89,84,100,66,50,88,121,50,68,105,67,79,103,74,52,66,79,52,118,81,80,89,102,77,71,81,74,100,66,53,110,77, -53,53,114,69,76,89,103,57,67,65,52,102,118,79,52,99,73,120,69,65,122,74,111,66,104,52,117,66,79,52,115,76, -72,52,81,79,66,67,52,88,47,80,65,77,72,65,65,81,83,67,103,47,117,100,52,85,77,65,65,89,77,67,122,79, -73,119,66,50,71,79,52,111,65,66,74,81,98,118,70,65,65,103,51,66,72,65,80,103,70,73,75,112,68,79,52,84, -103,66,47,47,53,122,77,76,49,99,65,106,85,65,104,85,81,101,65,89,65,66,120,65,101,67,55,113,87,68,65,65, -76,118,67,65,65,102,65,75,52,98,98,66,57,50,81,65,65,74,67,70,103,57,51,100,52,103,71,66,65,103,83,86, -66,79,52,115,74,120,98,118,73,50,69,73,66,119,80,89,65,81,79,113,86,111,89,79,66,88,65,73,67,68,98,73, -53,89,68,79,52,99,74,122,79,90,122,110,77,104,81,105,67,75,89,88,81,79,52,80,77,67,81,76,67,66,76,89, -111,114,73,65,66,71,81,104,112,51,67,101,119,84,118,68,75,73,98,118,66,53,52,84,66,100,52,53,51,72,100,52, -115,78,80,81,87,90,71,73,84,110,68,98,81,77,80,88,52,106,76,70,65,66,69,79,78,81,77,75,51,81,71,66, -70,65,82,51,67,103,56,71,100,52,74,119,82,68,89,82,119,68,85,81,74,72,67,56,72,103,67,103,50,119,100,52, -88,65,43,66,51,68,101,89,79,47,66,103,77,74,120,68,118,72,104,89,77,66,100,52,108,51,97,103,82,67,73,55, -115,78,65,65,74,69,69,70,103,76,116,67,74,52,110,77,53,103,98,71,104,113,82,66,103,57,103,77,103,85,80,100, -111,89,66,68,102,119,73,97,69,120,65,65,66,119,68,118,69,65,73,85,79,104,73,66,66,81,65,77,74,65,89,74, -51,68,57,51,65,104,55,82,68,65,65,79,55,43,65,82,66,69,81,103,65,68,66,65,98,118,66,65,111,80,117,79, -52,56,79,87,52,82,50,70,65,65,90,50,71,67,111,80,79,69,65,77,76,88,52,103,68,67,78,89,84,118,66,43, -72,119,47,56,65,117,65,73,66,65,81,83,99,66,68,81,81,66,66,71,52,83,111,66,70,52,79,81,65,65,76,118, -68,79,52,90,81,67,100,52,101,90,79,119,98,68,67,100,52,87,90,119,69,80,71,119,81,65,76,55,112,51,66,104, -79,81,68,65,76,77,66,81,81,80,103,78,89,47,98,79,52,82,52,68,67,65,88,120,47,68,79,71,65,65,90,110, -66,65,65,77,80,100,52,74,67,66,103,52,65,66,84,103,111,52,66,65,73,80,117,69,119,88,116,101,65,104,108,68, -74,103,79,81,100,52,85,76,51,89,77,67,47,80,119,65,103,87,53,50,69,74,47,103,114,68,104,47,47,79,52,73, -112,68,101,81,48,65,53,105,76,66,71,73,79,119,99,52,90,66,66,53,110,65,71,52,79,90,109,55,49,66,73,111, -82,51,68,104,121,114,67,47,56,81,69,103,89,105,66,117,53,48,66,82,73,100,119,85,119,76,118,66,65,65,112,51, -68,100,119,89,108,66,69,119,83,51,67,65,67,76,118,71,79,52,102,77,53,104,51,67,66,81,73,112,68,103,69,73, -120,65,70,68,113,111,101,67,68,52,80,100,104,118,81,82,89,79,65,47,47,119,56,67,115,66,77,73,77,76,55,122, -97,67,77,111,89,65,67,105,77,102,70,52,80,119,88,52,79,81,117,70,119,100,103,90,51,66,54,66,103,66,101,65, -77,65,100,52,111,82,66,51,99,76,86,103,76,70,70,104,111,69,66,104,97,55,67,104,56,80,104,65,65,66,65,103, -74,52,71,43,121,99,67,100,52,118,72,118,106,66,66,86,73,90,53,69,100,52,103,65,66,83,111,81,120,67,104,115, -73,100,89,87,81,56,72,112,104,79,110,86,119,52,105,67,84,52,104,81,66,79,52,84,118,68,77,89,82,51,68,100, -81,86,119,66,73,82,51,67,104,99,76,80,65,76,118,68,72,119,88,65,70,81,81,83,67,65,66,88,119,80,111,80, -47,115,66,67,72,79,52,83,77,67,119,66,120,69,104,65,70,66,53,110,99,68,89,73,115,77,69,111,75,70,67,97, -52,89,68,67,56,68,67,66,65,81,79,90,53,110,77,66,73,76,118,73,65,111,80,100,72,52,85,80,100,103,73,66, -68,83,65,81,65,67,74,103,77,73,72,89,122,118,68,100,111,81,65,68,66,119,101,90,122,77,65,115,120,51,67,75, -103,90,73,66,73,111,102,65,77,65,111,77,66,119,66,75,66,54,65,77,69,76,65,81,67,66,73,73,73,65,75,88, -82,71,90,47,54,89,68,73,81,78,119,103,55,118,66,79,52,98,117,66,65,66,101,119,65,65,75,43,68,71,104,52, -65,69,122,51,112,101,103,90,116,66,71,119,76,121,67,52,67,49,68,79,119,106,47,68,79,53,66,89,66,104,79,81, -51,74,67,66,104,55,76,66,103,72,117,65,65,77,65,53,118,103,118,73,57,72,86,65,75,112,67,65,66,68,107,66, -79,52,122,116,68,103,69,69,100,119,89,65,74,100,52,84,113,68,103,119,70,69,79,52,115,80,57,53,65,66,79,52, -84,105,66,98,89,112,52,69,75,111,110,99,103,69,75,65,73,80,100,82,111,77,74,67,111,74,67,68,98,89,81,106, -66,68,81,80,65,56,70,119,48,66,81,76,65,89,121,89,66,65,65,117,73,119,65,65,66,103,55,53,68,67,65,73, -83,69,43,68,86,66,65,81,84,118,72,115,70,103,90,81,50,90,100,52,53,84,67,71,119,103,73,67,56,72,117,65, -81,73,78,68,100,52,87,103,48,72,81,53,106,52,66,121,65,97,69,72,111,84,118,70,79,52,79,119,77,111,117,89, -109,99,119,104,47,47,65,73,73,75,68,89,103,89,65,68,104,52,73,66,80,73,77,72,103,55,100,66,103,120,111,70, -67,65,77,65,119,65,67,66,69,73,103,65,67,100,119,77,71,65,119,89,87,68,104,118,76,68,52,115,79,101,111,77, -72,65,119,87,74,119,68,118,73,79,52,74,120,66,101,65,76,118,66,53,106,100,75,65,66,102,52,82,65,79,73,109, -67,78,66,75,111,86,81,65,81,79,79,71,52,89,65,67,47,53,85,66,100,52,89,55,66,66,89,81,52,83,100,52, -115,80,106,54,79,67,76,81,73,65,72,79,52,99,73,72,52,82,50,66,80,65,119,65,67,104,99,79,88,89,77,77, -103,89,78,72,104,112,79,68,65,65,55,88,66,79,52,114,118,66,77,119,77,73,57,72,111,101,89,90,66,67,53,107, -77,52,65,71,66,100,52,84,80,67,52,68,53,67,117,43,90,104,53,105,66,51,101,119,50,72,80,53,110,65,100,65, -98,119,66,65,111,99,80,43,74,51,67,104,73,116,67,79,73,89,116,67,65,111,89,79,66,103,72,103,79,119,85,77, -100,89,73,65,68,66,73,79,119,56,70,119,54,71,81,76,119,73,65,71,54,71,90,122,76,118,75,70,89,74,54,66, -100,52,97,114,67,55,113,82,67,79,52,99,77,53,103,65,66,65,119,73,121,66,56,68,118,68,67,65,82,75,67,43, -67,56,66,65,103,80,47,47,52,71,66,65,66,69,66,105,74,51,66,113,65,99,67,117,70,51,79,52,108,51,65,119, -103,65,70,52,65,65,66,73,81,74,51,67,104,55,119,68,121,89,73,66,49,77,75,55,103,79,67,89,119,79,81,68, -103,99,77,78,89,80,47,78,119,81,77,67,121,68,116,66,66,65,81,72,66,104,118,57,47,112,51,70,79,119,84,90, -66,88,81,99,74,120,51,117,103,70,51,117,69,72,118,75,110,68,79,52,76,118,68,100,81,89,65,68,76,52,107,80, -56,49,119,100,65,49,52,75,81,109,119,99,111,113,51,67,65,81,80,56,66,89,102,119,101,65,84,118,67,121,71,81, -54,69,77,73,52,74,51,66,100,53,85,65,104,81,69,68,120,69,73,100,111,79,103,79,52,77,80,68,81,74,51,71, -77,73,80,73,76,81,104,69,66,56,66,88,67,74,81,82,51,69,71,112,73,65,70,104,47,103,56,65,116,67,76,119, -81,108,66,72,111,73,103,67,65,81,98,119,70,80,81,99,65,103,103,76,69,100,52,83,85,66,54,65,82,66,117,70, -57,54,69,65,104,77,76,51,89,65,66,68,89,77,74,67,119,81,119,67,78,89,87,65,65,81,74,86,66,55,118,119, -47,111,97,66,79,52,89,48,66,53,105,117,68,52,43,81,104,120,51,75,104,52,68,67,87,111,73,71,66,104,55,116, -67,65,103,73,85,69,43,72,117,65,89,74,51,68,47,56,65,55,105,84,68,104,103,101,67,101,103,81,65,69,66,73, -100,69,111,66,111,66,57,73,73,68,79,52,80,99,68,81,78,119,117,68,118,68,50,67,97,67,52,72,65,67,65,76, -117,69,100,52,105,82,66,55,118,122,79,52,74,84,66,103,53,74,67,101,65,88,111,104,69,77,118,76,118,71,65,103, -77,68,47,47,121,79,65,76,86,66,66,103,73,68,67,65,65,56,79,66,89,76,118,68,65,65,86,81,43,65,66,66, -99,111,111,66,66,101,81,53,52,67,103,103,65,66,69,103,75,90,67,81,89,103,65,66,79,52,81,88,68,79,52,119, -65,74,100,81,77,78,55,118,100,100,119,79,73,103,57,51,88,73,88,77,104,51,103,119,68,117,66,76,103,81,51,67, -78,111,74,100,66,43,72,119,47,55,105,67,104,110,115,70,73,107,78,104,115,77,72,111,85,79,67,65,74,51,66,101, -103,81,65,66,103,116,86,78,81,119,110,66,65,89,77,76,87,89,73,65,68,78,103,86,65,79,119,78,65,100,52,85, -78,53,112,102,70,75,119,82,51,71,103,69,74,103,66,107,66,76,73,88,47,86,111,75,111,67,88,81,103,65,72,66, -52,81,65,70,79,65,80,119,76,89,73,66,66,79,52,81,68,66,65,73,73,106,66,83,73,80,77,68,89,120,121,68, -104,97,67,66,98,52,122,118,74,57,119,65,69,50,67,52,66,101,65,75,108,70,79,52,107,73,65,81,78,116,53,110, -79,68,111,74,51,66,51,98,56,69,72,119,73,47,66,74,73,82,110,73,79,81,107,77,99,89,103,65,72,66,81,73, -77,72,67,52,85,80,47,54,108,67,78,103,74,116,67,55,112,53,67,50,71,119,54,71,119,51,111,73,66,68,65,77, -76,104,76,68,66,65,111,73,102,67,97,73,81,65,69,83,119,90,51,70,103,71,81,66,89,85,79,104,89,68,66,79, -52,89,65,72,118,70,52,104,51,101,103,71,90,121,66,88,66,77,119,47,81,76,52,107,78,55,111,50,67,103,99,119, -109,99,119,99,103,81,65,68,51,101,119,75,89,74,86,70,103,57,51,117,54,114,66,65,65,104,117,66,82,119,76,118, -67,80,81,83,114,67,52,71,119,121,69,71,82,89,84,56,75,100,52,53,98,66,79,52,73,65,67,104,56,80,79,53, -72,118,118,97,86,66,117,69,73,77,65,81,107,67,57,119,82,69,47,53,109,66,70,111,73,67,67,79,52,77,78,67, -119,82,48,66,65,73,73,65,71,49,87,103,76,81,74,83,74,100,52,81,48,69,65,65,73,84,75,100,81,103,71,70, -104,65,100,69,100,52,122,84,67,100,52,107,75,69,103,56,80,104,51,51,117,69,76,103,57,52,66,89,106,75,69,67, -73,80,47,98,111,77,78,65,119,80,101,54,72,77,100,52,81,56,66,120,71,65,65,73,75,70,66,101,65,103,73,66, -104,50,79,77,111,88,103,99,89,73,65,74,53,106,118,67,102,81,118,100,101,73,81,65,78,98,103,76,118,75,82,90, -73,121,66,100,52,108,53,121,67,51,66,66,52,79,65,119,72,77,90,89,51,47,120,66,107,67,57,112,50,66,72,111, -56,119,100,52,117,81,80,73,109,73,69,103,82,67,66,68,89,82,114,66,117,69,72,117,56,73,120,69,65,52,72,65, -82,65,77,72,69,65,105,98,68,111,65,72,67,81,52,73,103,66,67,52,73,66,66,67,73,81,88,69,79,52,107,71, -82,120,85,77,88,81,81,74,70,104,68,82,66,65,81,82,51,68,104,67,68,66,47,55,118,67,88,103,80,117,79,52, -56,122,80,65,74,66,68,104,110,53,66,103,98,118,70,104,111,90,70,103,56,72,88,119,82,51,66,66,73,84,119,69, -117,52,70,66,77,81,75,74,67,104,51,117,66,89,76,70,66,74,119,73,65,66,50,66,52,70,65,65,102,103,87,119, -103,65,68,72,103,75,112,66,73,103,88,100,66,52,43,65,73,73,106,101,67,69,119,106,84,67,56,54,85,71,65,65, -119,52,70,69,89,111,43,68,100,119,76,118,67,65,52,80,77,81,73,103,50,71,98,81,82,118,66,104,103,83,67,100, -52,117,47,70,81,115,79,81,89,82,51,66,104,80,56,103,71,79,50,65,73,66,47,107,78,54,72,77,79,119,82,57, -66,97,52,102,115,57,110,103,120,71,65,104,104,84,68,104,98,119,67,79,119,104,78,70,65,65,54,52,67,79,52,81, -97,66,104,103,65,67,100,52,115,79,117,72,110,100,52,82,100,68,100,119,89,66,66,79,52,105,43,68,82,73,79,73, -74,65,76,117,66,83,81,85,80,73,81,86,51,68,73,73,65,66,104,71,90,119,66,51,69,80,52,85,71,79,73,74, -52,66,79,119,74,102,67,54,69,78,65,119,76,71,74,72,52,118,117,80,65,73,90,66,56,65,109,67,103,71,55,65, -65,74,117,67,100,65,101,81,80,65,79,119,86,52,81,65,85,85,73,48,72,103,120,87,66,100,52,87,77,100,52,121, -115,67,117,67,98,66,68,65,89,77,66,68,65,76,118,68,79,52,84,118,66,79,73,74,119,66,101,65,102,100,112,120, -106,67,71,52,105,103,66,104,76,119,67,66,81,110,117,85,111,86,81,72,65,82,113,66,65,65,82,67,68,104,110,53, -68,81,73,65,66,68,73,85,69,89,65,90,73,66,115,65,66,67,65,66,70,119,103,99,119,109,69,122,74,52,73,90, -70,104,110,77,82,53,82,51,70,111,69,65,121,66,104,68,100,52,103,65,66,104,119,65,67,100,119,81,73,67,100,52, -85,72,117,57,119,79,52,74,111,67,65,65,107,79,100,52,99,119,98,111,103,69,66,100,119,103,65,66,100,119,76,118, -74,73,65,79,65,115,56,72,79,53,76,117,70,104,67,120,66,117,65,84,70,120,66,103,67,65,65,83,65,67,117,52, -65,66,73,73,81,57,68,79,52,103,75,67,100,52,80,100,54,68,110,67,104,48,78,85,111,98,118,67,79,111,74,51, -67,47,53,51,72,65,111,106,56,66,100,52,104,51,66,78,119,54,66,67,70,65,76,118,68,79,52,100,51,77,89,77, -80,104,55,117,71,65,89,85,119,89,73,80,103,74,81,103,101,68,68,52,81,72,68,90,111,75,83,72,120,69,74,104, -77,75,83,119,73,65,86,79,52,81,70,67,84,52,74,70,67,57,119,86,74,100,52,47,77,47,76,119,67,83,65,75, -82,70,120,68,82,66,104,57,53,65,119,77,80,43,65,110,74,79,52,76,118,67,77,111,82,100,68,120,65,75,66,120, -66,51,78,104,66,51,67,49,65,113,72,101,73,76,115,66,65,81,77,78,98,111,116,119,69,73,88,47,65,65,73,72, -66,65,65,73,100,70,115,51,77,53,107,65,75,52,77,76,51,99,65,51,98,117,67,86,89,47,103,65,65,76,81,69, -65,73,77,72,85,65,73,65,73,48,65,71,70,100,119,106,114,67,65,89,81,70,67,47,103,56,66,79,52,81,65,69, -43,68,118,70,82,89,101,116,70,89,119,65,68,89,89,111,65,67,104,47,47,70,89,74,47,66,79,52,110,80,47,108, -109,57,120,51,66,65,66,71,65,80,89,81,113,69,70,89,112,51,67,70,65,73,50,72,84,81,79,113,70,66,76,90, -66,85,81,74,117,67,79,52,88,65,52,69,77,73,65,74,76,69,104,47,118,67,103,80,81,121,65,102,70,55,97,99, -67,57,119,65,67,90,73,88,103,73,65,76,69,71,65,65,55,49,66,71,111,77,77,79,52,97,71,66,65,65,78,65, -74,111,99,76,101,66,66,111,68,79,52,103,48,70,75,103,77,80,104,99,122,57,122,69,75,79,73,77,77,72,89,77, -77,66,65,88,56,65,89,85,72,103,56,65,120,65,112,67,73,119,73,72,66,65,65,122,118,69,79,73,85,65,117,57, -119,79,52,48,73,79,53,69,74,122,73,111,66,100,52,88,77,79,52,100,65,112,56,69,99,103,80,100,103,71,119,68, -103,81,55,69,104,54,84,67,117,68,70,69,104,120,82,68,100,52,117,117,51,81,70,66,111,107,69,85,65,80,113,73, -52,83,103,66,79,111,76,111,67,78,103,84,50,67,117,71,65,118,67,119,68,70,52,74,108,66,72,52,86,51,71,89, -79,79,65,119,79,55,104,101,119,79,73,73,111,66,74,111,74,51,70,43,47,51,43,67,111,66,121,66,76,66,74,111, -85,74,47,76,110,70,103,99,65,109,69,65,119,109,65,79,52,80,117,54,66,78,67,103,53,116,66,65,81,83,55,68, -102,89,76,119,66,65,65,98,68,70,52,72,79,57,51,117,57,84,119,67,111,65,65,66,75,119,79,117,67,73,98,118, -71,65,65,108,103,104,65,53,66,103,49,109,115,49,51,65,65,73,54,67,65,81,77,73,53,65,70,66,50,65,65,66, -100,52,89,70,66,71,52,80,117,79,52,86,47,118,52,87,66,53,43,81,120,118,81,65,73,76,118,69,79,52,57,78, -74,119,77,79,100,52,82,108,67,79,119,73,67,66,87,73,74,51,67,100,52,120,71,67,65,65,102,77,52,72,103,56, -72,117,49,50,113,70,119,81,66,66,101,65,106,118,68,79,52,56,71,103,48,65,120,69,65,79,119,74,51,68,117,49, -109,72,119,76,118,69,50,65,66,66,79,52,111,105,70,83,73,84,118,72,104,47,47,121,66,51,69,103,69,105,65,111, -86,69,89,119,83,75,66,98,111,89,50,66,79,65,81,98,66,75,89,76,117,76,77,111,77,65,79,119,73,65,61,34, -41,41,44,48,44,121,43,56,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,78,82,70,46,103,101,116,65, -100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,103,46,103,101,116,72,101,105, -103,104,116,40,41,45,56,44,180,41,59,10,103,46,102,108,105,112,40,41,59,10,115,101,116,87,97,116,99,104,40,95, -162,108,111,97,100,40,41,44,66,84,78,49,41,59,10,163,40,103,108,111,98,97,108,46,66,84,78,50,41,123,115,101, -116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,50,41,59,115,101,116,87,97,116,99,104,40,95, -162,108,111,97,100,40,41,44,66,84,78,51,41,59,125,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,255,190,0,0,0,109,99,108,111,99,107,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,109,99,108,111,99,107,34,44,34,110,97,109,101,34,58,34,77,111,114,112,104, +105,110,103,32,67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34,44,34,115,114,99,34,58, +34,109,99,108,111,99,107,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,109,99,108,111,99,107,46,105, +109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,57,44,34,118,101,114,115,105,111,110,34,58,34,48,46, +48,55,34,44,34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,109,99,108,111, +99,107,46,105,110,102,111,44,109,99,108,111,99,107,46,97,112,112,46,106,115,44,109,99,108,111,99,107,46,105,109,103, +34,125,255,255,95,38,0,0,97,98,111,117,116,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,172,69,78,86,61,112,114,111,99,101,115,115,46,101,110,118,59,10,172,77,69,77,61,112,114,111,99,101, +115,115,46,109,101,109,111,114,121,40,41,59,10,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, +34,41,59,10,103,46,99,108,101,97,114,40,49,41,59,10,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,41, +59,10,172,121,61,50,52,44,104,61,56,59,10,163,40,103,46,103,101,116,87,105,100,116,104,40,41,145,50,52,48,41, +123,103,46,100,114,97,119,73,109,97,103,101,40,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107, +34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,118,69,52,103,81,90,87,103,47,47,65,65, +73,51,90,104,52,100,67,111,65,100,54,119,65,100,54,52,65,100,50,106,52,100,54,108,52,100,99,110,52,100,67,54, +65,100,99,43,65,100,89,118,52,100,85,103,103,72,71,47,47,107,103,78,47,47,65,71,66,49,87,107,68,112,107,79, +65,119,115,72,47,103,68,66,103,74,52,67,84,82,119,100,71,108,54,82,68,108,47,48,103,72,81,103,74,101,77,68, +111,50,47,65,103,99,68,73,65,73,107,66,110,65,100,82,103,74,121,67,65,65,81,100,68,108,103,100,82,103,90,80, +68,103,98,87,66,68,111,85,99,68,113,77,80,82,89,99,74,103,69,102,111,65,55,85,104,57,65,65,103,81,49,66, +69,103,73,100,66,110,103,100,82,75,81,73,65,67,109,66,98,66,54,65,100,66,50,103,100,82,110,111,69,68,121,66, +43,67,56,116,98,98,81,86,112,103,78,65,113,79,107,65,119,77,71,121,69,81,68,111,77,66,49,65,73,66,118,103, +100,68,80,89,77,67,43,72,47,47,55,122,66,103,47,47,43,102,65,65,52,79,65,103,72,47,47,116,119,68,111,77, +118,47,52,87,66,51,105,121,69,65,65,80,119,72,73,78,118,84,89,77,65,118,47,65,47,115,67,54,66,109,66,104, +47,119,68,111,80,52,103,73,117,66,100,119,97,121,66,65,65,80,47,68,111,77,72,52,70,52,84,111,81,83,66,43, +69,80,74,81,85,79,103,75,109,68,66,103,73,65,66,104,65,100,70,66,52,76,55,66,103,102,65,65,89,78,119,106, +112,75,67,104,119,74,66,84,73,81,100,68,105,65,100,70,103,72,103,65,89,73,100,68,109,68,97,67,79,52,77,68, +57,87,113,49,52,100,77,43,67,100,67,68,111,85,48,110,68,106,67,104,121,104,66,65,65,73,100,70,115,103,100,84, +90,103,97,86,68,109,80,89,76,74,107,48,76,73,111,100,68,97,73,99,120,99,73,76,82,68,83,111,56,48,106,105, +86,69,67,103,85,65,118,103,68,67,109,71,48,89,81,84,82,72,68,111,84,82,66,103,76,82,67,77,119,74,68,66, +110,111,100,68,101,65,77,68,75,111,85,118,65,73,85,47,68,111,99,68,54,69,76,68,111,75,82,67,65,73,77,47, +76,73,99,71,71,52,80,81,85,73,75,67,66,85,52,80,122,68,111,97,69,66,47,112,51,66,70,81,75,75,67,104, +57,65,68,111,88,115,75,73,86,86,113,111,110,67,116,86,66,111,70,81,99,65,85,75,121,70,119,103,104,100,66,51, +73,80,66,67,119,74,90,67,65,81,77,102,69,103,81,65,76,50,65,71,70,103,90,74,66,68,111,90,103,68,65,66, +69,77,87,89,81,74,70,103,76,119,67,107,65,67,66,47,103,100,76,87,89,77,67,102,111,81,65,69,51,53,66,69, +68,112,107,72,56,69,102,100,103,89,65,68,108,52,109,68,108,54,56,66,65,66,97,122,66,70,66,65,50,67,103,75, +56,67,65,66,99,66,85,90,80,47,56,107,66,118,53,56,67,65,67,49,47,47,52,65,66,85,81,119,65,83,110,52, +100,103,79,120,111,65,76,108,52,100,67,52,65,100,89,106,52,100,54,104,52,100,43,119,65,100,54,111,65,100,50,103, +52,100,67,65,119,81,65,61,34,41,41,44,49,50,48,44,121,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,66,65,78,71,76,69,74,83,46,67,79,77,34,44,49,50,48,44,121,45,52,41,59,125,164,123,121,61,45,40,52, +43,104,41,59,125,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,111,119,101,114,101,100,32,98,121,32,69, +115,112,114,117,105,110,111,34,44,48,44,121,150,52,43,104,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,86,101,114,115,105,111,110,32,34,43,69,78,86,46,86,69,82,83,73,79,78,44,48,44,121,150,104,41,59,10,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,67,111,109,109,105,116,32,34,43,69,78,86,46,71,73,84,95,67,79, +77,77,73,84,44,48,44,121,150,104,41,59,10,170,103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44,102,105, +108,101,41,123,172,106,61,115,46,114,101,97,100,74,83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40,34,111, +98,106,101,99,116,34,138,191,106,41,63,106,46,118,101,114,115,105,111,110,58,181,59,103,46,100,114,97,119,83,116,114, +105,110,103,40,118,63,40,110,97,109,101,43,34,32,34,43,40,118,63,34,118,34,43,118,58,34,85,110,107,110,111,119, +110,34,41,41,58,34,78,79,32,34,43,110,97,109,101,44,48,44,121,150,104,41,59,125,10,103,101,116,86,101,114,115, +105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,59,10,103, +101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102, +111,34,41,59,10,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116, +105,110,103,46,105,110,102,111,34,41,59,10,121,150,104,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,77,69, +77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114,105,97,98,108,101,115,32,97,118,97,105,108,97,98,108,101, +34,44,48,44,121,150,104,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114,97,103,101,58, +32,34,43,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114,101,101,40,41, +146,49,48,41,43,34,107,32,102,114,101,101,34,44,48,44,121,150,104,41,59,10,163,40,69,78,86,46,83,84,79,82, +65,71,69,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43,40,69,78, +86,46,83,84,79,82,65,71,69,146,49,48,41,43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104,41,59,10, +163,40,69,78,86,46,83,80,73,70,76,65,83,72,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,80,73, +32,70,108,97,115,104,58,32,34,43,40,69,78,86,46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107,34,44, +48,44,121,150,104,41,59,10,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,10,103,46, +102,108,105,112,40,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40,114,101,113,117,105,114,101,40,34,104,101,97, +116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,43,70,81,103,108, +43,120,110,117,56,65,73,66,119,71,81,103,72,117,65,111,78,51,103,70,47,104,99,76,103,69,72,117,57,52,51,71, +51,104,119,85,67,68,119,73,66,67,65,65,86,51,117,69,65,104,111,66,66,104,115,79,57,48,79,103,72,103,111,65, +67,66,104,48,73,104,80,53,65,65,81,88,66,103,56,72,56,72,119,43,71,119,69,65,88,110,52,65,69,67,120,71, +65,104,48,77,69,65,79,101,74,65,77,80,51,43,47,104,117,73,71,52,99,77,103,49,109,77,111,103,56,66,104,110, +115,65,81,73,66,67,47,47,47,74,52,77,78,54,72,99,66,73,79,73,65,65,80,115,56,72,108,57,110,77,53,103, +99,66,48,72,103,56,53,50,66,65,73,77,65,73,52,89,65,67,73,73,73,65,67,104,56,65,75,65,99,65,118,65, +54,68,55,118,100,55,119,84,66,84,89,74,51,66,57,101,43,104,69,65,104,65,52,67,121,72,117,121,56,72,88,119, +50,57,78,103,73,65,66,120,43,65,83,81,75,115,66,89,103,82,51,68,103,72,81,67,73,88,77,115,69,65,65,73, +79,90,121,71,90,122,120,51,68,104,47,65,53,55,73,68,80,111,88,78,52,72,78,72,119,81,111,66,57,119,65,66, +121,68,118,66,79,52,76,104,68,79,119,82,52,70,100,52,99,80,47,52,111,66,48,68,87,67,100,52,53,86,67,103, +70,70,65,89,80,117,79,52,81,65,67,103,69,101,100,52,80,119,101,65,73,76,66,78,52,78,112,119,69,77,88,73, +76,118,66,79,52,98,118,68,47,102,47,100,52,99,80,67,89,74,49,66,65,65,75,83,67,122,112,51,69,47,104,78, +66,74,119,80,122,105,69,80,43,72,56,104,114,118,68,57,68,116,67,53,77,74,100,52,82,84,66,71,111,76,118,66, +104,101,55,66,81,74,83,66,65,65,101,65,73,52,73,111,67,79,52,84,50,67,104,56,78,54,68,118,68,101,65,80, +103,113,70,81,100,52,56,77,105,66,51,66,69,52,99,73,47,65,118,67,53,110,115,52,65,75,67,100,103,81,65,68, +47,47,119,85,119,77,77,104,104,103,66,79,52,78,109,100,52,120,69,68,53,55,118,68,43,69,119,70,103,75,84,67, +89,111,79,78,47,43,118,47,47,47,47,79,90,119,71,88,103,70,53,53,118,81,73,52,84,97,66,69,81,82,120,66, +54,72,119,55,68,82,67,65,65,80,103,79,52,52,65,67,75,89,108,70,111,66,51,67,72,73,99,65,105,69,65,105, +57,51,73,52,74,112,67,100,65,82,109,66,100,52,73,65,70,100,52,81,65,69,52,72,65,53,47,47,104,104,49,66, +65,73,73,80,66,121,65,53,66,69,81,85,77,47,110,56,79,52,84,122,67,65,65,81,116,66,104,118,100,47,88,56, +100,52,89,89,66,118,119,79,66,79,52,76,118,66,89,73,111,75,66,104,47,89,101,119,102,65,54,66,51,68,76,111, +80,47,100,52,74,88,71,65,66,77,66,105,75,107,69,65,65,119,75,72,57,76,121,70,79,52,102,119,79,111,82,51, +68,100,52,84,68,68,53,47,65,74,81,99,119,68,103,99,79,57,122,118,67,49,118,100,55,111,99,66,120,117,65,118, +104,51,67,117,69,72,104,53,106,67,69,111,79,80,103,72,102,47,53,51,67,71,103,77,65,111,71,103,98,103,88,47, +67,103,74,90,69,65,73,89,65,66,53,72,73,98,120,82,67,66,65,89,85,76,104,90,102,66,65,65,77,65,47,71, +65,47,52,55,66,100,52,52,65,66,104,52,67,66,103,49,109,103,56,65,51,89,65,66,51,118,116,79,52,99,77,87, +120,118,71,53,118,100,90,89,87,73,119,56,65,118,80,81,100,52,78,119,82,119,85,119,65,89,73,108,66,104,115,78, +71,111,82,51,67,113,66,51,66,73,65,82,52,66,70,65,88,72,65,73,103,47,67,82,65,73,68,66,73,103,116,72, +72,73,82,51,68,51,90,104,67,90,89,88,119,119,66,114,67,79,65,88,80,53,110,56,53,53,107,78,79,52,79,65, +66,73,121,120,67,72,89,99,68,109,100,117,116,79,90,65,52,86,65,65,89,85,78,113,66,48,68,65,65,81,102,68, +75,73,86,109,115,51,65,65,103,74,51,66,104,66,77,66,74,119,103,65,72,104,105,55,68,68,73,81,65,66,103,108, +57,67,73,114,118,67,101,65,74,51,74,65,66,80,77,52,65,111,66,104,113,98,68,73,103,73,48,67,77,81,102,100, +79,103,82,51,69,53,110,71,53,77,122,73,65,73,66,66,65,81,73,65,66,119,65,53,66,103,85,103,107,69,105,69, +65,101,55,104,119,69,67,116,103,67,66,50,66,51,66,98,119,77,74,57,79,101,121,66,76,73,104,51,103,70,65,84, +118,67,80,73,84,117,68,104,111,67,69,103,70,86,113,113,48,66,47,47,119,47,47,47,77,81,87,73,98,89,74,107, +70,65,65,73,106,66,69,111,82,51,68,67,111,79,65,56,65,51,67,89,65,79,118,104,47,119,69,52,76,118,69,75, +111,76,118,67,111,69,69,47,55,120,68,65,65,121,47,67,50,71,43,103,119,50,68,78,81,50,101,57,73,48,68,66, +103,120,73,66,120,71,65,87,103,83,49,68,65,65,102,100,55,112,89,69,54,66,114,66,87,119,85,73,104,50,79,65, +119,76,99,71,78,81,79,65,53,106,98,67,100,52,103,65,67,79,52,79,103,65,103,77,72,117,52,97,66,68,111,107, +75,103,71,73,90,52,76,116,66,111,103,65,66,66,103,88,119,52,72,119,104,110,76,53,108,119,69,81,88,103,100,52, +86,51,66,65,73,100,66,98,52,106,118,66,79,52,47,117,73,65,102,81,75,65,74,51,71,104,55,115,67,54,47,88, +55,111,103,66,85,73,76,48,66,67,119,74,51,67,104,72,111,79,52,81,101,67,79,52,89,72,66,88,65,81,67,66, +79,52,120,81,66,74,111,89,86,66,78,119,73,66,66,104,87,113,48,72,68,119,69,79,67,73,80,117,111,68,116,73, +72,52,76,117,67,65,65,79,119,77,73,82,51,66,85,65,84,110,73,102,103,90,57,66,70,89,75,72,66,100,53,110, +81,75,119,73,67,66,66,89,87,65,80,111,74,51,66,47,47,47,100,53,72,77,53,106,118,68,52,68,120,66,100,52, +80,81,71,119,73,66,67,72,73,77,65,101,65,81,65,69,104,81,73,67,52,71,73,98,111,81,65,66,66,52,105,102, +66,87,52,90,101,67,65,65,79,43,69,119,74,121,66,78,81,86,50,115,68,118,67,65,65,119,54,68,65,65,97,76, +70,68,103,80,119,66,52,107,78,71,73,85,74,53,73,51,67,99,111,111,65,72,79,52,79,90,122,73,76,72,43,65, +65,66,70,103,99,75,101,65,97,43,68,100,52,112,51,74,100,52,43,76,100,52,106,117,67,104,110,77,117,122,48,68, +78,81,81,65,66,66,65,77,79,77,52,82,113,68,117,70,119,89,52,73,85,69,71,112,76,119,66,56,68,106,66,43, +65,67,66,67,52,107,74,121,65,69,67,57,51,117,121,65,65,66,68,111,120,76,66,56,72,119,70,89,84,108,66,65, +73,77,77,70,73,74,108,69,81,81,74,51,66,67,111,73,89,66,68,103,85,76,67,73,112,90,67,81,52,89,71,66, +117,53,112,66,104,110,47,117,52,85,69,120,66,50,66,78,111,77,79,57,119,66,66,57,120,113,68,79,52,74,101,69, +69,81,75,84,70,120,65,66,66,119,72,74,104,51,101,120,50,80,57,43,74,120,110,99,90,65,74,99,66,104,77,74, +79,52,109,90,79,52,100,103,88,89,82,80,67,87,81,81,122,70,52,65,65,66,82,73,104,72,66,53,103,65,67,66, +89,80,101,83,65,99,65,120,79,65,65,89,73,67,67,100,119,75,48,67,81,89,102,99,47,73,54,66,78,89,101,65, +79,119,73,65,75,66,103,77,77,81,73,73,72,67,56,69,80,47,47,47,65,111,76,107,66,103,72,52,43,65,77,67, +100,52,117,111,120,87,73,49,66,51,69,65,65,79,81,122,73,68,66,115,119,67,66,99,73,119,65,71,66,111,115,79, +104,55,100,67,104,117,78,65,89,88,118,76,52,73,80,67,104,71,89,103,69,80,43,65,110,70,70,111,120,51,66,57, +118,116,79,52,76,118,66,71,52,55,47,67,99,111,102,79,80,111,89,65,66,87,73,73,122,67,100,52,98,89,67,66, +52,78,119,103,119,70,66,100,52,73,66,66,104,73,48,66,104,54,52,67,100,119,73,72,66,100,119,74,73,66,100,65, +113,55,66,69,103,84,119,68,65,103,97,120,66,65,81,77,74,104,118,100,66,65,76,117,66,66,65,73,81,68,101,65, +77,80,104,47,65,68,81,79,72,50,43,73,104,112,101,68,102,103,98,118,68,90,65,77,80,53,52,65,67,77,111,74, +99,67,115,65,89,67,53,110,79,86,52,79,88,99,103,81,65,68,100,52,81,65,68,115,56,72,115,70,50,103,49,81, +83,119,81,65,69,43,65,99,71,82,73,76,104,68,47,53,99,68,69,52,121,83,68,65,103,99,71,119,71,100,120,113, +118,68,100,52,106,51,66,67,73,77,80,53,105,83,67,118,102,81,99,65,54,83,66,57,119,76,66,120,66,109,66,65, +65,88,47,72,52,76,107,68,83,65,99,79,70,111,79,88,103,71,55,50,65,103,69,100,52,73,65,68,113,69,70,65, +81,107,76,57,51,114,104,122,72,67,76,103,82,73,66,67,119,98,119,67,66,103,83,70,66,79,111,76,118,66,119,69, +77,103,54,88,66,66,103,73,88,68,79,52,87,74,104,117,78,72,81,121,79,70,43,68,118,67,117,43,119,50,47,81, +72,111,81,65,67,66,89,80,116,55,113,115,67,65,65,80,103,79,81,76,118,74,65,65,101,88,104,89,100,67,90,89, +73,66,66,75,89,79,65,65,73,73,47,73,51,121,77,66,54,67,111,66,100,52,85,68,103,98,118,68,79,52,52,103, +66,80,73,81,43,66,87,52,89,65,68,68,52,84,118,66,79,111,73,50,70,75,65,48,65,48,65,65,66,65,119,102, +117,57,111,79,70,79,119,80,103,65,81,76,103,66,68,111,113,119,66,65,81,73,74,70,79,53,81,65,67,74,73,80, +47,74,81,73,68,67,43,65,86,67,79,52,76,114,66,100,103,106,117,69,50,52,117,66,47,55,117,70,100,52,110,119, +81,111,98,48,68,120,69,78,55,117,73,86,120,74,51,69,49,82,51,66,104,48,79,78,111,90,43,69,57,51,103,65, +73,73,80,67,86,81,55,102,68,103,69,78,65,119,82,104,67,56,65,87,66,69,52,76,118,78,65,65,88,100,97,81, +115,65,109,65,72,69,79,52,81,65,66,104,79,90,121,66,54,66,120,66,51,66,73,103,51,81,72,52,80,81,47,71, +73,69,73,73,65,71,81,73,77,80,84,81,77,65,104,84,117,66,49,68,97,69,57,120,78,67,65,81,84,118,67,76, +103,81,65,67,121,68,99,68,65,65,87,73,70,65,82,98,68,51,101,119,57,121,99,69,75,73,76,118,67,65,66,107, +77,65,65,77,65,103,90,75,67,65,65,89,108,66,72,111,103,56,66,65,65,114,113,68,79,52,109,80,120,53,98,66, +117,67,84,68,67,89,87,102,104,47,80,54,65,101,70,78,103,86,119,103,55,70,69,97,73,84,118,67,52,66,73,66, +52,66,51,72,77,103,88,100,69,119,80,47,86,119,121,67,66,79,52,81,112,66,56,65,52,71,65,66,105,85,67,65, +67,66,50,67,79,111,73,66,67,120,72,52,119,69,77,50,56,65,53,104,89,67,103,69,71,115,122,118,67,54,70,51, +78,111,106,75,66,117,70,51,79,52,103,43,68,80,81,80,65,65,65,87,81,47,55,71,66,53,110,77,72,52,56,68, +43,65,115,67,71,52,82,68,67,70,52,89,70,67,80,52,79,65,119,68,52,71,74,103,81,67,66,104,107,74,66,89, +103,56,66,66,81,73,109,67,67,103,103,65,66,66,65,81,67,66,78,103,73,65,66,100,52,85,76,53,100,119,66,65, +83,90,81,120,71,65,75,81,99,78,65,103,80,117,81,103,74,117,66,104,110,65,122,56,65,47,107,77,53,53,51,71, +70,119,77,119,79,52,80,80,104,99,65,47,51,119,68,52,83,98,69,100,52,77,73,71,65,76,52,67,65,65,78,119, +72,52,121,111,66,82,81,83,99,68,79,89,52,65,77,47,71,73,43,69,77,51,103,88,67,83,73,90,101,66,103,56, +65,117,55,118,69,79,52,118,81,74,103,73,65,66,43,66,84,66,56,68,118,73,47,47,56,70,81,76,122,66,70,89, +80,76,53,89,68,66,75,81,118,81,100,53,90,51,70,89,111,85,80,79,52,90,85,66,67,81,79,102,47,53,89,68, +86,111,73,70,68,73,119,78,119,43,67,85,72,66,103,81,65,68,69,65,79,73,85,81,110,72,103,57,119,103,43,56, +55,49,52,122,85,81,67,89,98,118,66,79,52,112,68,70,88,119,82,80,66,100,52,85,79,102,119,73,122,66,53,101, +55,85,52,103,65,77,79,52,82,52,66,65,52,83,52,72,104,103,105,66,79,52,53,50,68,82,81,99,80,53,52,69, +67,121,69,74,122,74,51,68,107,89,88,68,71,73,73,65,66,82,81,84,118,67,86,111,73,48,69,104,118,99,90,103, +104,70,67,117,52,81,66,97,81,104,75,69,100,89,73,73,70,79,52,109,55,104,101,119,71,73,73,82,70,69,74,65, +65,70,77,89,82,81,67,82,81,90,51,70,88,89,85,79,67,89,88,103,100,52,99,74,104,74,53,66,66,73,77,79, +103,69,57,109,65,89,67,120,71,65,100,52,107,65,100,119,74,51,68,122,73,89,66,104,117,57,79,119,98,118,68,80, +119,113,84,67,99,73,56,76,65,89,85,56,51,103,69,67,50,66,52,66,67,111,80,56,53,110,115,52,90,54,66,79, +53,85,80,47,53,108,67,65,65,122,43,68,70,52,107,80,79,111,73,66,66,67,52,101,103,103,71,112,100,111,74,101, +66,104,51,103,103,69,68,107,76,118,71,72,82,79,101,68,65,77,73,55,114,70,69,84,89,76,86,66,51,101,119,54, +65,77,68,74,119,120,75,69,103,99,65,81,103,90,51,68,53,47,47,53,51,79,110,107,56,79,52,97,43,66,65,73, +79,54,50,68,118,73,75,81,77,74,75,73,77,73,90,111,102,81,104,51,117,79,81,73,65,66,82,52,88,47,66,103, +76,116,66,100,52,104,51,66,52,43,81,105,70,50,103,122,106,67,101,103,103,65,66,53,118,109,119,71,114,100,52,89, +65,68,83,89,77,71,121,50,87,100,52,106,79,68,100,52,106,53,69,65,65,53,50,66,77,119,76,118,66,53,51,117, +79,52,77,78,84,73,85,66,103,73,82,66,49,84,79,66,65,65,74,108,66,65,66,107,72,74,65,88,103,72,89,73, +57,67,88,65,75,54,67,98,119,118,103,104,120,51,66,65,111,78,103,65,81,73,49,66,105,77,65,119,53,51,69,120, +74,51,66,65,65,85,77,104,87,81,104,112,116,67,100,52,84,51,68,78,119,122,71,66,104,104,53,66,104,110,77,80, +111,81,69,68,66,65,110,77,53,106,118,66,52,89,73,66,70,81,85,81,43,69,81,100,52,112,108,66,70,89,90,76, +67,71,103,118,81,117,68,118,67,79,52,47,103,100,111,87,90,122,73,87,68,79,52,84,118,68,71,89,73,66,66,120, +71,76,119,43,72,79,52,79,75,79,52,110,65,49,87,81,52,71,119,70,89,77,71,66,73,77,76,51,97,54,73,47, +53,51,67,103,69,79,90,120,111,65,70,79,52,77,80,103,80,120,83,119,73,65,69,57,51,103,83,73,81,65,67,113, +115,70,113,69,77,70,52,77,76,101,65,98,106,70,87,52,85,65,48,65,66,67,65,65,109,79,83,119,112,51,68,120, +101,55,104,65,105,71,104,97,51,66,104,79,81,104,65,78,67,100,52,87,47,108,55,69,68,121,71,81,122,73,76,66, +71,52,76,52,71,80,52,90,51,79,68,103,75,86,66,76,103,89,104,66,76,52,77,77,47,107,65,47,76,99,66,111, +72,119,111,67,65,70,54,72,117,101,65,76,100,66,104,51,43,101,65,81,65,66,117,69,72,99,103,75,100,70,98,103, +81,66,66,52,74,116,68,51,89,65,71,103,71,119,85,111,73,105,68,65,89,84,100,66,50,88,121,50,68,105,67,79, +103,74,52,66,79,52,118,81,80,89,102,77,71,81,74,100,66,53,110,77,53,53,114,69,76,89,103,57,67,65,52,102, +118,79,52,99,73,120,69,65,122,74,111,66,104,52,117,66,79,52,115,76,72,52,81,79,66,67,52,88,47,80,65,77, +72,65,65,81,83,67,103,47,117,100,52,85,77,65,65,89,77,67,122,79,73,119,66,50,71,79,52,111,65,66,74,81, +98,118,70,65,65,103,51,66,72,65,80,103,70,73,75,112,68,79,52,84,103,66,47,47,53,122,77,76,49,99,65,106, +85,65,104,85,81,101,65,89,65,66,120,65,101,67,55,113,87,68,65,65,76,118,67,65,65,102,65,75,52,98,98,66, +57,50,81,65,65,74,67,70,103,57,51,100,52,103,71,66,65,103,83,86,66,79,52,115,74,120,98,118,73,50,69,73, +66,119,80,89,65,81,79,113,86,111,89,79,66,88,65,73,67,68,98,73,53,89,68,79,52,99,74,122,79,90,122,110, +77,104,81,105,67,75,89,88,81,79,52,80,77,67,81,76,67,66,76,89,111,114,73,65,66,71,81,104,112,51,67,101, +119,84,118,68,75,73,98,118,66,53,52,84,66,100,52,53,51,72,100,52,115,78,80,81,87,90,71,73,84,110,68,98, +81,77,80,88,52,106,76,70,65,66,69,79,78,81,77,75,51,81,71,66,70,65,82,51,67,103,56,71,100,52,74,119, +82,68,89,82,119,68,85,81,74,72,67,56,72,103,67,103,50,119,100,52,88,65,43,66,51,68,101,89,79,47,66,103, +77,74,120,68,118,72,104,89,77,66,100,52,108,51,97,103,82,67,73,55,115,78,65,65,74,69,69,70,103,76,116,67, +74,52,110,77,53,103,98,71,104,113,82,66,103,57,103,77,103,85,80,100,111,89,66,68,102,119,73,97,69,120,65,65, +66,119,68,118,69,65,73,85,79,104,73,66,66,81,65,77,74,65,89,74,51,68,57,51,65,104,55,82,68,65,65,79, +55,43,65,82,66,69,81,103,65,68,66,65,98,118,66,65,111,80,117,79,52,56,79,87,52,82,50,70,65,65,90,50, +71,67,111,80,79,69,65,77,76,88,52,103,68,67,78,89,84,118,66,43,72,119,47,56,65,117,65,73,66,65,81,83, +99,66,68,81,81,66,66,71,52,83,111,66,70,52,79,81,65,65,76,118,68,79,52,90,81,67,100,52,101,90,79,119, +98,68,67,100,52,87,90,119,69,80,71,119,81,65,76,55,112,51,66,104,79,81,68,65,76,77,66,81,81,80,103,78, +89,47,98,79,52,82,52,68,67,65,88,120,47,68,79,71,65,65,90,110,66,65,65,77,80,100,52,74,67,66,103,52, +65,66,84,103,111,52,66,65,73,80,117,69,119,88,116,101,65,104,108,68,74,103,79,81,100,52,85,76,51,89,77,67, +47,80,119,65,103,87,53,50,69,74,47,103,114,68,104,47,47,79,52,73,112,68,101,81,48,65,53,105,76,66,71,73, +79,119,99,52,90,66,66,53,110,65,71,52,79,90,109,55,49,66,73,111,82,51,68,104,121,114,67,47,56,81,69,103, +89,105,66,117,53,48,66,82,73,100,119,85,119,76,118,66,65,65,112,51,68,100,119,89,108,66,69,119,83,51,67,65, +67,76,118,71,79,52,102,77,53,104,51,67,66,81,73,112,68,103,69,73,120,65,70,68,113,111,101,67,68,52,80,100, +104,118,81,82,89,79,65,47,47,119,56,67,115,66,77,73,77,76,55,122,97,67,77,111,89,65,67,105,77,102,70,52, +80,119,88,52,79,81,117,70,119,100,103,90,51,66,54,66,103,66,101,65,77,65,100,52,111,82,66,51,99,76,86,103, +76,70,70,104,111,69,66,104,97,55,67,104,56,80,104,65,65,66,65,103,74,52,71,43,121,99,67,100,52,118,72,118, +106,66,66,86,73,90,53,69,100,52,103,65,66,83,111,81,120,67,104,115,73,100,89,87,81,56,72,112,104,79,110,86, +119,52,105,67,84,52,104,81,66,79,52,84,118,68,77,89,82,51,68,100,81,86,119,66,73,82,51,67,104,99,76,80, +65,76,118,68,72,119,88,65,70,81,81,83,67,65,66,88,119,80,111,80,47,115,66,67,72,79,52,83,77,67,119,66, +120,69,104,65,70,66,53,110,99,68,89,73,115,77,69,111,75,70,67,97,52,89,68,67,56,68,67,66,65,81,79,90, +53,110,77,66,73,76,118,73,65,111,80,100,72,52,85,80,100,103,73,66,68,83,65,81,65,67,74,103,77,73,72,89, +122,118,68,100,111,81,65,68,66,119,101,90,122,77,65,115,120,51,67,75,103,90,73,66,73,111,102,65,77,65,111,77, +66,119,66,75,66,54,65,77,69,76,65,81,67,66,73,73,73,65,75,88,82,71,90,47,54,89,68,73,81,78,119,103, +55,118,66,79,52,98,117,66,65,66,101,119,65,65,75,43,68,71,104,52,65,69,122,51,112,101,103,90,116,66,71,119, +76,121,67,52,67,49,68,79,119,106,47,68,79,53,66,89,66,104,79,81,51,74,67,66,104,55,76,66,103,72,117,65, +65,77,65,53,118,103,118,73,57,72,86,65,75,112,67,65,66,68,107,66,79,52,122,116,68,103,69,69,100,119,89,65, +74,100,52,84,113,68,103,119,70,69,79,52,115,80,57,53,65,66,79,52,84,105,66,98,89,112,52,69,75,111,110,99, +103,69,75,65,73,80,100,82,111,77,74,67,111,74,67,68,98,89,81,106,66,68,81,80,65,56,70,119,48,66,81,76, +65,89,121,89,66,65,65,117,73,119,65,65,66,103,55,53,68,67,65,73,83,69,43,68,86,66,65,81,84,118,72,115, +70,103,90,81,50,90,100,52,53,84,67,71,119,103,73,67,56,72,117,65,81,73,78,68,100,52,87,103,48,72,81,53, +106,52,66,121,65,97,69,72,111,84,118,70,79,52,79,119,77,111,117,89,109,99,119,104,47,47,65,73,73,75,68,89, +103,89,65,68,104,52,73,66,80,73,77,72,103,55,100,66,103,120,111,70,67,65,77,65,119,65,67,66,69,73,103,65, +67,100,119,77,71,65,119,89,87,68,104,118,76,68,52,115,79,101,111,77,72,65,119,87,74,119,68,118,73,79,52,74, +120,66,101,65,76,118,66,53,106,100,75,65,66,102,52,82,65,79,73,109,67,78,66,75,111,86,81,65,81,79,79,71, +52,89,65,67,47,53,85,66,100,52,89,55,66,66,89,81,52,83,100,52,115,80,106,54,79,67,76,81,73,65,72,79, +52,99,73,72,52,82,50,66,80,65,119,65,67,104,99,79,88,89,77,77,103,89,78,72,104,112,79,68,65,65,55,88, +66,79,52,114,118,66,77,119,77,73,57,72,111,101,89,90,66,67,53,107,77,52,65,71,66,100,52,84,80,67,52,68, +53,67,117,43,90,104,53,105,66,51,101,119,50,72,80,53,110,65,100,65,98,119,66,65,111,99,80,43,74,51,67,104, +73,116,67,79,73,89,116,67,65,111,89,79,66,103,72,103,79,119,85,77,100,89,73,65,68,66,73,79,119,56,70,119, +54,71,81,76,119,73,65,71,54,71,90,122,76,118,75,70,89,74,54,66,100,52,97,114,67,55,113,82,67,79,52,99, +77,53,103,65,66,65,119,73,121,66,56,68,118,68,67,65,82,75,67,43,67,56,66,65,103,80,47,47,52,71,66,65, +66,69,66,105,74,51,66,113,65,99,67,117,70,51,79,52,108,51,65,119,103,65,70,52,65,65,66,73,81,74,51,67, +104,55,119,68,121,89,73,66,49,77,75,55,103,79,67,89,119,79,81,68,103,99,77,78,89,80,47,78,119,81,77,67, +121,68,116,66,66,65,81,72,66,104,118,57,47,112,51,70,79,119,84,90,66,88,81,99,74,120,51,117,103,70,51,117, +69,72,118,75,110,68,79,52,76,118,68,100,81,89,65,68,76,52,107,80,56,49,119,100,65,49,52,75,81,109,119,99, +111,113,51,67,65,81,80,56,66,89,102,119,101,65,84,118,67,121,71,81,54,69,77,73,52,74,51,66,100,53,85,65, +104,81,69,68,120,69,73,100,111,79,103,79,52,77,80,68,81,74,51,71,77,73,80,73,76,81,104,69,66,56,66,88, +67,74,81,82,51,69,71,112,73,65,70,104,47,103,56,65,116,67,76,119,81,108,66,72,111,73,103,67,65,81,98,119, +70,80,81,99,65,103,103,76,69,100,52,83,85,66,54,65,82,66,117,70,57,54,69,65,104,77,76,51,89,65,66,68, +89,77,74,67,119,81,119,67,78,89,87,65,65,81,74,86,66,55,118,119,47,111,97,66,79,52,89,48,66,53,105,117, +68,52,43,81,104,120,51,75,104,52,68,67,87,111,73,71,66,104,55,116,67,65,103,73,85,69,43,72,117,65,89,74, +51,68,47,56,65,55,105,84,68,104,103,101,67,101,103,81,65,69,66,73,100,69,111,66,111,66,57,73,73,68,79,52, +80,99,68,81,78,119,117,68,118,68,50,67,97,67,52,72,65,67,65,76,117,69,100,52,105,82,66,55,118,122,79,52, +74,84,66,103,53,74,67,101,65,88,111,104,69,77,118,76,118,71,65,103,77,68,47,47,121,79,65,76,86,66,66,103, +73,68,67,65,65,56,79,66,89,76,118,68,65,65,86,81,43,65,66,66,99,111,111,66,66,101,81,53,52,67,103,103, +65,66,69,103,75,90,67,81,89,103,65,66,79,52,81,88,68,79,52,119,65,74,100,81,77,78,55,118,100,100,119,79, +73,103,57,51,88,73,88,77,104,51,103,119,68,117,66,76,103,81,51,67,78,111,74,100,66,43,72,119,47,55,105,67, +104,110,115,70,73,107,78,104,115,77,72,111,85,79,67,65,74,51,66,101,103,81,65,66,103,116,86,78,81,119,110,66, +65,89,77,76,87,89,73,65,68,78,103,86,65,79,119,78,65,100,52,85,78,53,112,102,70,75,119,82,51,71,103,69, +74,103,66,107,66,76,73,88,47,86,111,75,111,67,88,81,103,65,72,66,52,81,65,70,79,65,80,119,76,89,73,66, +66,79,52,81,68,66,65,73,73,106,66,83,73,80,77,68,89,120,121,68,104,97,67,66,98,52,122,118,74,57,119,65, +69,50,67,52,66,101,65,75,108,70,79,52,107,73,65,81,78,116,53,110,79,68,111,74,51,66,51,98,56,69,72,119, +73,47,66,74,73,82,110,73,79,81,107,77,99,89,103,65,72,66,81,73,77,72,67,52,85,80,47,54,108,67,78,103, +74,116,67,55,112,53,67,50,71,119,54,71,119,51,111,73,66,68,65,77,76,104,76,68,66,65,111,73,102,67,97,73, +81,65,69,83,119,90,51,70,103,71,81,66,89,85,79,104,89,68,66,79,52,89,65,72,118,70,52,104,51,101,103,71, +90,121,66,88,66,77,119,47,81,76,52,107,78,55,111,50,67,103,99,119,109,99,119,99,103,81,65,68,51,101,119,75, +89,74,86,70,103,57,51,117,54,114,66,65,65,104,117,66,82,119,76,118,67,80,81,83,114,67,52,71,119,121,69,71, +82,89,84,56,75,100,52,53,98,66,79,52,73,65,67,104,56,80,79,53,72,118,118,97,86,66,117,69,73,77,65,81, +107,67,57,119,82,69,47,53,109,66,70,111,73,67,67,79,52,77,78,67,119,82,48,66,65,73,73,65,71,49,87,103, +76,81,74,83,74,100,52,81,48,69,65,65,73,84,75,100,81,103,71,70,104,65,100,69,100,52,122,84,67,100,52,107, +75,69,103,56,80,104,51,51,117,69,76,103,57,52,66,89,106,75,69,67,73,80,47,98,111,77,78,65,119,80,101,54, +72,77,100,52,81,56,66,120,71,65,65,73,75,70,66,101,65,103,73,66,104,50,79,77,111,88,103,99,89,73,65,74, +53,106,118,67,102,81,118,100,101,73,81,65,78,98,103,76,118,75,82,90,73,121,66,100,52,108,53,121,67,51,66,66, +52,79,65,119,72,77,90,89,51,47,120,66,107,67,57,112,50,66,72,111,56,119,100,52,117,81,80,73,109,73,69,103, +82,67,66,68,89,82,114,66,117,69,72,117,56,73,120,69,65,52,72,65,82,65,77,72,69,65,105,98,68,111,65,72, +67,81,52,73,103,66,67,52,73,66,66,67,73,81,88,69,79,52,107,71,82,120,85,77,88,81,81,74,70,104,68,82, +66,65,81,82,51,68,104,67,68,66,47,55,118,67,88,103,80,117,79,52,56,122,80,65,74,66,68,104,110,53,66,103, +98,118,70,104,111,90,70,103,56,72,88,119,82,51,66,66,73,84,119,69,117,52,70,66,77,81,75,74,67,104,51,117, +66,89,76,70,66,74,119,73,65,66,50,66,52,70,65,65,102,103,87,119,103,65,68,72,103,75,112,66,73,103,88,100, +66,52,43,65,73,73,106,101,67,69,119,106,84,67,56,54,85,71,65,65,119,52,70,69,89,111,43,68,100,119,76,118, +67,65,52,80,77,81,73,103,50,71,98,81,82,118,66,104,103,83,67,100,52,117,47,70,81,115,79,81,89,82,51,66, +104,80,56,103,71,79,50,65,73,66,47,107,78,54,72,77,79,119,82,57,66,97,52,102,115,57,110,103,120,71,65,104, +104,84,68,104,98,119,67,79,119,104,78,70,65,65,54,52,67,79,52,81,97,66,104,103,65,67,100,52,115,79,117,72, +110,100,52,82,100,68,100,119,89,66,66,79,52,105,43,68,82,73,79,73,74,65,76,117,66,83,81,85,80,73,81,86, +51,68,73,73,65,66,104,71,90,119,66,51,69,80,52,85,71,79,73,74,52,66,79,119,74,102,67,54,69,78,65,119, +76,71,74,72,52,118,117,80,65,73,90,66,56,65,109,67,103,71,55,65,65,74,117,67,100,65,101,81,80,65,79,119, +86,52,81,65,85,85,73,48,72,103,120,87,66,100,52,87,77,100,52,121,115,67,117,67,98,66,68,65,89,77,66,68, +65,76,118,68,79,52,84,118,66,79,73,74,119,66,101,65,102,100,112,120,106,67,71,52,105,103,66,104,76,119,67,66, +81,110,117,85,111,86,81,72,65,82,113,66,65,65,82,67,68,104,110,53,68,81,73,65,66,68,73,85,69,89,65,90, +73,66,115,65,66,67,65,66,70,119,103,99,119,109,69,122,74,52,73,90,70,104,110,77,82,53,82,51,70,111,69,65, +121,66,104,68,100,52,103,65,66,104,119,65,67,100,119,81,73,67,100,52,85,72,117,57,119,79,52,74,111,67,65,65, +107,79,100,52,99,119,98,111,103,69,66,100,119,103,65,66,100,119,76,118,74,73,65,79,65,115,56,72,79,53,76,117, +70,104,67,120,66,117,65,84,70,120,66,103,67,65,65,83,65,67,117,52,65,66,73,73,81,57,68,79,52,103,75,67, +100,52,80,100,54,68,110,67,104,48,78,85,111,98,118,67,79,111,74,51,67,47,53,51,72,65,111,106,56,66,100,52, +104,51,66,78,119,54,66,67,70,65,76,118,68,79,52,100,51,77,89,77,80,104,55,117,71,65,89,85,119,89,73,80, +103,74,81,103,101,68,68,52,81,72,68,90,111,75,83,72,120,69,74,104,77,75,83,119,73,65,86,79,52,81,70,67, +84,52,74,70,67,57,119,86,74,100,52,47,77,47,76,119,67,83,65,75,82,70,120,68,82,66,104,57,53,65,119,77, +80,43,65,110,74,79,52,76,118,67,77,111,82,100,68,120,65,75,66,120,66,51,78,104,66,51,67,49,65,113,72,101, +73,76,115,66,65,81,77,78,98,111,116,119,69,73,88,47,65,65,73,72,66,65,65,73,100,70,115,51,77,53,107,65, +75,52,77,76,51,99,65,51,98,117,67,86,89,47,103,65,65,76,81,69,65,73,77,72,85,65,73,65,73,48,65,71, +70,100,119,106,114,67,65,89,81,70,67,47,103,56,66,79,52,81,65,69,43,68,118,70,82,89,101,116,70,89,119,65, +68,89,89,111,65,67,104,47,47,70,89,74,47,66,79,52,110,80,47,108,109,57,120,51,66,65,66,71,65,80,89,81, +113,69,70,89,112,51,67,70,65,73,50,72,84,81,79,113,70,66,76,90,66,85,81,74,117,67,79,52,88,65,52,69, +77,73,65,74,76,69,104,47,118,67,103,80,81,121,65,102,70,55,97,99,67,57,119,65,67,90,73,88,103,73,65,76, +69,71,65,65,55,49,66,71,111,77,77,79,52,97,71,66,65,65,78,65,74,111,99,76,101,66,66,111,68,79,52,103, +48,70,75,103,77,80,104,99,122,57,122,69,75,79,73,77,77,72,89,77,77,66,65,88,56,65,89,85,72,103,56,65, +120,65,112,67,73,119,73,72,66,65,65,122,118,69,79,73,85,65,117,57,119,79,52,48,73,79,53,69,74,122,73,111, +66,100,52,88,77,79,52,100,65,112,56,69,99,103,80,100,103,71,119,68,103,81,55,69,104,54,84,67,117,68,70,69, +104,120,82,68,100,52,117,117,51,81,70,66,111,107,69,85,65,80,113,73,52,83,103,66,79,111,76,111,67,78,103,84, +50,67,117,71,65,118,67,119,68,70,52,74,108,66,72,52,86,51,71,89,79,79,65,119,79,55,104,101,119,79,73,73, +111,66,74,111,74,51,70,43,47,51,43,67,111,66,121,66,76,66,74,111,85,74,47,76,110,70,103,99,65,109,69,65, +119,109,65,79,52,80,117,54,66,78,67,103,53,116,66,65,81,83,55,68,102,89,76,119,66,65,65,98,68,70,52,72, +79,57,51,117,57,84,119,67,111,65,65,66,75,119,79,117,67,73,98,118,71,65,65,108,103,104,65,53,66,103,49,109, +115,49,51,65,65,73,54,67,65,81,77,73,53,65,70,66,50,65,65,66,100,52,89,70,66,71,52,80,117,79,52,86, +47,118,52,87,66,53,43,81,120,118,81,65,73,76,118,69,79,52,57,78,74,119,77,79,100,52,82,108,67,79,119,73, +67,66,87,73,74,51,67,100,52,120,71,67,65,65,102,77,52,72,103,56,72,117,49,50,113,70,119,81,66,66,101,65, +106,118,68,79,52,56,71,103,48,65,120,69,65,79,119,74,51,68,117,49,109,72,119,76,118,69,50,65,66,66,79,52, +111,105,70,83,73,84,118,72,104,47,47,121,66,51,69,103,69,105,65,111,86,69,89,119,83,75,66,98,111,89,50,66, +79,65,81,98,66,75,89,76,117,76,77,111,77,65,79,119,73,65,61,34,41,41,44,48,44,121,43,56,41,59,10,103, +46,100,114,97,119,83,116,114,105,110,103,40,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46,103, +101,116,87,105,100,116,104,40,41,47,50,44,103,46,103,101,116,72,101,105,103,104,116,40,41,45,56,44,180,41,59,10, +103,46,102,108,105,112,40,41,59,10,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49, +41,59,10,163,40,103,108,111,98,97,108,46,66,84,78,50,41,123,115,101,116,87,97,116,99,104,40,95,162,108,111,97, +100,40,41,44,66,84,78,50,41,59,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,51, +41,59,125,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85, +85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254, +16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,254,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85, -85,85,85,85,85,85,85,85,85,85,85,85,121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121, -85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,85,85,85,85,85,85,85,121,200,206,206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206, -163,85,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,85,85,85,121,163,206,206,206,206,206,206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,121,199,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206, -206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206, -206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85, -85,85,121,206,206,206,206,206,206,206,206,206,206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206, -121,79,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85, -85,85,79,79,121,199,206,206,206,206,206,206,206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79, -79,79,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,79,79,79,198,198,198,198,198,198,198,198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15, -51,86,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,101,101,15,15,128,198,198,198,198,198,198,198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15, -58,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, -101,101,101,58,15,15,206,205,199,198,198,199,205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15, -101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101, -101,101,101,101,58,15,15,164,206,206,206,206,164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101, -101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101, -101,101,101,101,101,65,15,15,15,15,15,15,15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101, -101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121,85,85,85,85,85,85,85,254,254,254,16,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,200,206, +206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206,163,85,85,85,85,85,85,85,254,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206, +206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,254,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,199,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206, +206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206,121,79,85,85,85,85,85,85,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,79,79,121,199,206,206,206,206,206,206, +206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79,79,79,85,85,85,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,79,79,79,198,198,198,198,198,198,198, +198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15,51,86,85,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,15,15,128,198,198,198,198,198,198, +198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15,58,101,101,101,101,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,58,15,15,206,205,199,198,198,199, +205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15,101,101,101,101,101,101,101,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,58,15,15,164,206,206,206,206, +164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101,101,101,101,101,101,101,101,101,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,65,15,15,15,15,15,15, +15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101, +101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110, -102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116, -34,44,34,110,97,109,101,34,58,34,65,98,111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112, -112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114, -100,101,114,34,58,45,52,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58, -34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102, -111,44,97,98,111,117,116,46,97,112,112,46,106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,98,3,0,0, -119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, -123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116, -104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59, -125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114,103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103, -41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110,103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105, -100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105, -112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105, -115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91, -34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110, -40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91, -34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40,33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, -41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162, -87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123, -163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108, -40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97, -108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83,91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116, -114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119,58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46, -120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40,41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97, -114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119, -73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66,72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47, -47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47,52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72, -103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59,120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114, -40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108,108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45, -52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99,116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44, -121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120,43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43, -49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40, -120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101,116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50, -41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115,101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255, -138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34,110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76, -101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101, -114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116, -116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97, -116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0,119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93, -61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46, -114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101,116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40, -41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101,116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80, -40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102, -34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100, -97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57,34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97, -116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74,103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78, -89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61,61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41, -59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116, -104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44, -87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78, -82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101, -116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110, -102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116, -34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112, -101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97, -103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101,116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34, -119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116,46,119,105,100,46,106,115,34,125,255,255,255,169,0,0,0, -119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, -123,173,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40, -39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101,108,99,111,109, -101,100,41,123,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114, -97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99, -111,109,101,100,58,180,125,41,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,125,41, -125,125,41,40,41,255,255,255,165,27,0,0,119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100,41,123,172,105, -61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,163,40,115,101,113,46,108,101,110,103,116,104,41,123,172, -102,61,115,101,113,46,115,104,105,102,116,40,41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73,110,116, -101,114,118,97,108,40,105,41,59,125,44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108,44,99, -97,108,108,98,97,99,107,41,123,172,110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67,111,108, -111,114,40,99,111,108,41,59,167,40,172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114,97,119, -76,105,110,101,40,105,44,48,44,48,44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50,52,48, -44,105,41,59,103,46,102,108,105,112,40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101,111,117, -116,40,102,44,48,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69,78,69, -95,67,79,85,78,84,61,49,49,59,10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41,171,170, -40,41,123,103,46,99,108,101,97,114,40,49,41,59,103,46,115,101,116,70,111,110,116,40,34,52,120,54,34,44,50,41, -59,172,110,61,48,59,172,108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111,40,41,59,172,105,61,115,101,116, -73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46,48,52,59,103,46,115,101,116,67,111,108,111,114,40,110, -44,110,44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,44,40,50,52,48,45,50,50,50,41,47,50,44, -40,50,52,48,45,49,48,48,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101,97,114,73,110,116,101,114,118,97, -108,40,105,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40, -34,79,112,101,110,34,44,51,52,44,49,52,52,41,44,53,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40, -41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108,101,34,44,51,52,44,49,53,54, -41,44,49,48,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105, -110,103,40,34,83,109,97,114,116,32,87,97,116,99,104,34,44,51,52,44,49,54,56,41,44,49,53,48,48,41,59,125, -125,44,53,48,41,59,125,59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103,61,114,101,113,117,105,114,101,40, -34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,112, -116,82,120,72,43,113,89,65,102,118,108,55,48,109,106,53,103,65,67,48,101,107,118,100,56,70,107,65,65,100,122,51, -72,74,65,89,65,72,52,43,101,74,88,87,107,74,74,89,65,70,48,104,75,50,118,102,78,74,97,73,65,66,53,116, -55,83,51,102,78,53,47,86,54,119,65,68,54,118,79,84,103,57,83,117,109,88,121,50,87,51,81,65,66,51,101,88, -117,108,50,74,100,110,79,54,51,88,65,65,112,80,69,86,89,118,65,74,81,73,65,67,74,111,82,81,68,122,66,76, -111,74,81,51,87,53,47,78,73,119,114,52,71,74,111,104,77,70,65,65,82,79,103,74,89,118,86,74,81,105,80,71, -65,66,90,78,78,51,98,115,100,118,89,121,69,83,119,110,87,74,83,73,65,67,51,82,78,77,51,86,49,74,106,90, -65,69,83,52,110,86,74,83,89,65,66,52,120,77,78,74,114,98,107,69,53,54,87,68,53,120,76,86,100,66,53,78, -98,70,111,102,78,74,98,103,65,66,74,104,50,54,113,82,69,80,114,70,88,114,108,98,65,65,87,106,70,103,102,87, -74,103,82,76,97,84,81,104,77,76,121,53,75,78,74,73,78,104,115,74,76,68,114,89,114,68,53,120,76,67,54,112, -76,97,53,110,71,84,82,55,111,76,113,57,98,74,81,74,77,75,84,65,88,87,74,98,98,110,82,51,82,76,74,83, -111,82,77,72,118,52,112,67,53,114,107,101,99,54,83,97,73,114,66,76,71,119,50,114,50,88,87,49,101,112,99,111, -113,89,101,74,105,79,88,74,89,122,105,69,115,79,72,50,82,66,66,119,55,108,70,53,54,89,103,53,110,71,99,54, -70,83,99,90,79,71,74,81,80,88,50,84,109,68,70,73,102,86,84,69,66,77,83,99,52,104,76,69,119,53,75,66, -54,43,114,115,74,77,72,54,51,88,54,112,77,102,53,104,77,81,122,66,76,67,113,53,76,68,49,90,76,69,74,104, -84,108,102,74,105,87,88,84,65,50,71,74,89,112,77,73,99,119,80,78,99,50,79,54,84,65,117,71,82,73,80,88, -49,105,103,68,74,103,47,80,74,109,121,89,68,99,103,88,87,119,120,77,72,49,65,112,67,53,51,88,99,115,72,65, -74,105,86,89,99,103,50,72,74,89,90,77,69,48,89,112,67,53,118,87,74,107,104,76,78,74,103,76,108,68,84,65, -101,70,74,104,70,47,70,81,102,86,74,107,71,54,74,105,71,88,99,111,109,121,74,103,79,114,74,89,104,77,69,114, -89,113,68,53,51,78,74,106,55,108,82,122,66,77,68,99,111,101,71,74,104,122,111,66,74,98,51,71,74,105,78,49, -113,90,66,67,74,103,87,121,74,89,112,78,70,49,76,105,103,65,65,88,65,74,105,78,83,74,103,122,108,71,74,103, -116,47,74,107,90,76,82,121,57,84,74,103,101,72,74,104,122,110,70,99,117,83,90,71,119,53,77,72,74,111,109,106, -99,117,104,76,66,113,100,99,74,105,83,97,105,84,67,104,77,86,49,67,89,120,121,53,76,67,113,100,88,73,65,87, -121,54,43,114,74,104,67,97,108,84,67,78,50,74,103,100,89,72,52,87,72,74,105,71,112,84,70,55,107,68,99,52, -51,87,50,82,77,74,84,85,90,76,81,122,66,76,70,99,52,109,114,54,43,71,74,104,50,106,84,70,109,88,74,89, -121,97,69,119,117,121,99,53,83,97,103,52,120,76,90,84,81,109,71,50,87,70,74,104,120,78,97,74,89,90,77,76, -74,90,83,97,69,74,111,79,72,84,82,57,47,74,97,43,54,74,98,100,84,113,82,78,69,84,82,82,78,70,49,74, -76,86,52,66,76,99,65,65,78,89,73,53,84,111,75,49,66,76,89,74,104,87,89,74,90,119,65,66,113,53,78,111, -74,90,57,49,74,97,65,65,66,100,65,90,78,83,48,90,76,101,121,57,83,74,97,82,78,89,118,53,75,77,52,50, -54,74,90,109,88,117,120,75,85,74,114,75,99,76,48,108,84,122,66,76,75,122,66,75,89,74,114,86,88,118,102,71, -83,111,108,55,69,89,87,88,74,73,50,55,122,70,49,74,76,81,65,68,113,53,78,85,114,103,89,66,52,119,65,69, -69,73,86,48,99,111,109,88,73,55,119,65,70,114,67,99,80,74,103,89,87,66,84,73,73,65,69,84,73,78,50,74, -89,109,87,117,104,77,107,100,83,100,89,67,103,79,101,74,103,117,101,113,82,76,70,121,122,104,102,84,105,57,98,113, -52,84,67,52,53,77,70,52,57,84,117,117,88,74,108,112,79,78,99,111,103,65,67,48,104,75,66,48,103,72,68,118, -90,77,69,113,82,77,112,65,65,78,83,113,57,99,114,108,98,74,65,89,65,68,113,119,82,68,120,71,107,48,109,73, -65,52,101,67,84,81,79,101,118,101,88,74,100,89,65,72,113,120,78,70,100,65,101,73,65,65,81,71,67,114,79,73, -48,111,72,69,65,71,86,88,84,82,74,77,71,118,103,71,67,119,82,77,55,84,65,90,77,72,119,81,71,67,118,104, -77,49,114,66,77,69,82,73,104,77,71,65,119,100,90,74,109,116,83,113,86,84,119,78,99,119,74,69,68,74,103,49, -57,99,118,73,65,68,97,52,100,57,74,104,65,78,68,74,110,83,76,72,74,103,114,108,54,65,65,104,70,70,65,119, -112,90,68,101,103,106,110,55,118,104,77,71,99,118,119,65,66,114,74,65,70,74,103,106,108,47,84,81,112,66,66,73, -52,106,108,47,65,65,78,56,84,81,104,72,68,99,118,52,65,68,99,74,66,77,68,118,112,77,43,73,89,97,101,68, -65,65,104,76,43,113,100,57,83,103,121,99,69,74,110,55,105,69,65,65,49,56,74,102,55,110,69,99,118,52,65,73, -114,74,76,73,99,118,54,97,77,99,118,52,65,68,118,104,77,72,114,74,74,47,65,65,98,108,47,99,54,90,77,47, -65,65,116,57,99,118,55,110,83,73,118,55,110,76,99,118,52,65,72,114,76,108,47,84,82,112,74,66,118,103,110,106, -65,61,61,34,41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35, -54,54,51,51,102,102,34,41,59,172,121,61,50,52,48,44,115,112,101,101,100,61,53,59,170,98,97,108,108,111,111,110, -40,99,97,108,108,98,97,99,107,41,123,121,151,115,112,101,101,100,59,172,120,61,40,50,52,48,45,55,55,41,47,50, -59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,120,44,121,41,59,103,46,99,108,101,97,114,82,101,99, -116,40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56,49,43,115,112,101,101,100,41,59,163,40,121,62,54,48, -41,115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111,111,110,44,48,44,99,97,108,108,98,97,99,107,41,59, -164,99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101,40,34,35,54,54,51,51,102,102,34,44,170,40,41,123, -98,97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,115,101,116, -70,111,110,116,40,34,54,120,56,34,44,51,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, -41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99,111,109,101,46,34,44,49,50,48,44,49,54, -48,41,59,125,41,59,125,41,59,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,172,110,61,48,59,172,105,61, -115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,53,59,103,46,115,99,114,111,108,108,40,48,44,45, -53,41,59,163,40,110,62,49,55,48,41,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,50,48, -41,59,125,44,51,53,48,48,41,59,125,59,163,40,110,138,50,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41, -59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,97,56,48,48,34,41,59,103,46,99,108,101,97,114, -40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65, -108,105,103,110,40,48,44,48,41,59,172,120,61,56,48,44,121,61,51,53,44,104,61,51,53,59,97,110,105,109,97,116, -101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41, -44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121, -150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,104,97,115,34,44,120,44,121,150,104,41, -44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,32,98,117,116,116,111,110,115,34,44,120,44,121, -150,104,41,44,40,41,162,123,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48,41,59,125,44,40,41,162,103,46,100, -114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,44,40,41,162,103,46,100,114,97,119, -83,116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,93,44,50,48,48,41,59,125,59,163,40,110,138, -51,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35, -48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, -110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48,41,59,103,46,115,101,116,70,111,110,116, -65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59, -103,46,100,114,97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,117,112,92,110,105,110,32,109,101,110,117,115,92, -110,92,110,84,117,114,110,32,66,97,110,103,108,101,46,106,115,32,111,110,92,110,105,102,32,105,116,32,119,97,115,32, -111,102,102,34,44,50,48,44,52,48,41,59,125,59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101,115,101,116, -40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101, -97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111, -110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34, -44,50,48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59, -103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, -34,83,101,108,101,99,116,32,109,101,110,117,92,110,105,116,101,109,92,110,92,110,76,97,117,110,99,104,32,97,112,112, -92,110,119,104,101,110,32,119,97,116,99,104,92,110,105,115,32,115,104,111,119,105,110,103,34,44,50,48,44,55,48,41, -59,125,59,163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67, -111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70, -111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34, -44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,59,103, -46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34, -54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,100,111,119,110,92, -110,105,110,32,109,101,110,117,115,92,110,92,110,76,111,110,103,32,112,114,101,115,115,92,110,116,111,32,101,120,105,116, -32,97,112,112,92,110,97,110,100,32,103,111,32,98,97,99,107,92,110,116,111,32,99,108,111,99,107,34,44,50,48,44, -49,48,48,41,59,125,59,163,40,110,138,54,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101, -116,66,103,67,111,108,111,114,40,34,35,102,102,51,51,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46, -115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99, -116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48, -41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101, -116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56, -34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,92, -110,101,118,101,114,32,115,116,111,112,115,44,92,110,104,111,108,100,32,98,117,116,116,111,110,115,92,110,49,32,97,110, -100,32,50,32,102,111,114,92,110,97,114,111,117,110,100,32,115,105,120,92,110,115,101,99,111,110,100,115,46,92,110,92, -110,92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92,110,116,104,101,110,32,114,101,98,111,111,116, -46,34,44,50,48,44,50,48,41,59,125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41, -59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114, -40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65, -108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97, -116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32, -104,97,115,32,97,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,115,105,109,112, -108,101,32,116,111,117,99,104,115,99,114,101,101,110,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162, -123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,116,39,108,108,32,100,101,116,101,99,116,32,116,111,117,99, -104,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,111,110,32,108,101,102, -116,32,97,110,100,32,114,105,103,104,116,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,72,111,114,105,122,111,110,116,97,108,32,115,119,105,112,101,115,34,44,120, -44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,119,111,114,107,32,116,111,111,46,32, -84,114,121,32,110,111,119,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111, -32,99,104,97,110,103,101,32,112,97,103,101,46,34,44,120,44,121,150,104,41,59,125,93,44,51,48,48,41,59,125,59, -163,40,110,138,56,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111, -114,40,34,35,51,51,57,57,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116, +254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116,34,44,34,110,97,109,101,34,58,34,65,98, +111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34, +58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,52,44,34,118,101,114, +115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109, +34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102,111,44,97,98,111,117,116,46,97,112,112,46, +106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,98,3,0,0,119,105,100,98,97,116,46,119,105,100,46,106, +115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,170,115,101,116,87,105,100,116,104,40,41, +123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116,104,61,52,48,43,40,66,97,110,103,108,101, +46,105,115,67,104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59,125,66,97,110,103,108,101,46,111,110,40,39, +99,104,97,114,103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103,41,123,163,40,99,104,97,114,103,105,110,103, +41,66,97,110,103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105,100,116,104,40,41,59,66,97,110,103,108,101, +46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105,112,40,41,59,125,41,59,172,98,97,116,116, +101,114,121,73,110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,63,115,101,116, +73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40, +41,44,54,48,48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44, +170,40,111,110,41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40, +41,59,163,40,33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,98,97,116,116,101,114,121,73,110,116,101, +114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116, +34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123,163,40,98,97,116,116,101,114,121,73,110,116, +101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,98,97,116,116,101,114,121,73,110,116,101, +114,118,97,108,41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,183,59,125,125,125,41,59,87,73,68, +71,69,84,83,91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,52,48,44, +100,114,97,119,58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46,120,44,121,61,175,46,121,59,103,46,114,101, +115,101,116,40,41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,41,123,103,46,115, +101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34, +68,104,103,66,72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47, +47,47,51,47,52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,34,41,44,120, +44,121,41,59,120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41, +46,102,105,108,108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45,52,44,121,43,50,49,41,46,99,108,101,97, +114,82,101,99,116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44,121,43,49,57,41,46,102,105,108,108,82,101, +99,116,40,120,43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43,49,52,41,59,103,46,115,101,116,67,111,108, +111,114,40,34,35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40,120,43,52,44,121,43,54,44,120,43,52,43, +69,46,103,101,116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50,41,47,49,48,48,44,121,43,49,55,41,59, +125,125,59,115,101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255,138,0,0,0,119,105,100,98,97,116,46,105, +110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,97, +116,34,44,34,110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76,101,118,101,108,32,87,105,100,103,101,116,34, +44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,57, +34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116,116,101,114,121,34,44,34,102,105,108,101,115, +34,58,34,119,105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97,116,46,119,105,100,46,106,115,34,125,255,255, +165,1,0,0,119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,61,123,97,114,101,97,58,34,116,114,34,44, +119,105,100,116,104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46,114,101,115,101,116,40,41,59,163,40,78,82, +70,46,103,101,116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40,41,46,99,111,110,110,101,99,116,101,100,41, +103,46,115,101,116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80,40,41,62,56,41,63,34,35,48,55,102,34, +58,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,41,59,164, +103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,54,54,54,34,58,34, +35,57,57,57,34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,67,120,81,66,66,103,68, +103,70,103,74,103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78,89,121,98,69,89,73,119,84,65,115,66,119, +68,65,65,61,61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41,59,125,44,99,104,97,110,103,101,100,58,170, +40,41,123,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,100,114,97,119,40,41,59,125, +125,59,10,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117, +101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78,82,70,46,111,110,40,39,100,105,115,99,111, +110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110, +103,101,100,41,59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116,34,44,34,110,97,109,101,34,58,34,66,108, +117,101,116,111,111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44, +34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44, +98,108,117,101,116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,116,46,105,110,102,111,44,119, +105,100,98,116,46,119,105,100,46,106,115,34,125,255,255,255,169,0,0,0,119,101,108,99,111,109,101,46,98,111,111,116, +46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,173,115,61,114,101,113,117,105,114,101,40, +39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111, +110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101,108,99,111,109,101,100,41,123,115,101,116,84,105,109,101,111, +117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40, +39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,180,125,41,108,111,97,100, +40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,125,41,125,125,41,40,41,255,255,255,165,27,0,0, +119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,170,97,110, +105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100,41,123,172,105,61,115,101,116,73,110,116,101,114,118,97,108, +40,170,40,41,123,163,40,115,101,113,46,108,101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104,105,102,116,40, +41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,112, +101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108,44,99,97,108,108,98,97,99,107,41,123,172,110,61, +48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67,111,108,111,114,40,99,111,108,41,59,167,40,172,105, +61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114,97,119,76,105,110,101,40,105,44,48,44,48,44,105, +41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50,52,48,44,105,41,59,103,46,102,108,105,112,40,41, +59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101,111,117,116,40,102,44,48,41,59,164,99,97,108,108, +98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69,78,69,95,67,79,85,78,84,61,49,49,59,10,170, +103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41,171,170,40,41,123,103,46,99,108,101,97,114,40,49, +41,59,103,46,115,101,116,70,111,110,116,40,34,52,120,54,34,44,50,41,59,172,110,61,48,59,172,108,61,66,97,110, +103,108,101,46,103,101,116,76,111,103,111,40,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41, +123,110,150,48,46,48,52,59,103,46,115,101,116,67,111,108,111,114,40,110,44,110,44,110,41,59,103,46,100,114,97,119, +73,109,97,103,101,40,108,44,40,50,52,48,45,50,50,50,41,47,50,44,40,50,52,48,45,49,48,48,41,47,50,41, +59,163,40,110,145,49,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,115,101,116,84,105,109,101, +111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,79,112,101,110,34,44,51,52,44,49,52, +52,41,44,53,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,72,97,99,107,97,98,108,101,34,44,51,52,44,49,53,54,41,44,49,48,48,48,41,59,115,101,116,84, +105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,109,97,114,116,32,87,97, +116,99,104,34,44,51,52,44,49,54,56,41,44,49,53,48,48,41,59,125,125,44,53,48,41,59,125,59,163,40,110,138, +49,41,171,170,40,41,123,172,105,109,103,61,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34, +41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,112,116,82,120,72,43,113,89,65,102,118,108,55, +48,109,106,53,103,65,67,48,101,107,118,100,56,70,107,65,65,100,122,51,72,74,65,89,65,72,52,43,101,74,88,87, +107,74,74,89,65,70,48,104,75,50,118,102,78,74,97,73,65,66,53,116,55,83,51,102,78,53,47,86,54,119,65,68, +54,118,79,84,103,57,83,117,109,88,121,50,87,51,81,65,66,51,101,88,117,108,50,74,100,110,79,54,51,88,65,65, +112,80,69,86,89,118,65,74,81,73,65,67,74,111,82,81,68,122,66,76,111,74,81,51,87,53,47,78,73,119,114,52, +71,74,111,104,77,70,65,65,82,79,103,74,89,118,86,74,81,105,80,71,65,66,90,78,78,51,98,115,100,118,89,121, +69,83,119,110,87,74,83,73,65,67,51,82,78,77,51,86,49,74,106,90,65,69,83,52,110,86,74,83,89,65,66,52, +120,77,78,74,114,98,107,69,53,54,87,68,53,120,76,86,100,66,53,78,98,70,111,102,78,74,98,103,65,66,74,104, +50,54,113,82,69,80,114,70,88,114,108,98,65,65,87,106,70,103,102,87,74,103,82,76,97,84,81,104,77,76,121,53, +75,78,74,73,78,104,115,74,76,68,114,89,114,68,53,120,76,67,54,112,76,97,53,110,71,84,82,55,111,76,113,57, +98,74,81,74,77,75,84,65,88,87,74,98,98,110,82,51,82,76,74,83,111,82,77,72,118,52,112,67,53,114,107,101, +99,54,83,97,73,114,66,76,71,119,50,114,50,88,87,49,101,112,99,111,113,89,101,74,105,79,88,74,89,122,105,69, +115,79,72,50,82,66,66,119,55,108,70,53,54,89,103,53,110,71,99,54,70,83,99,90,79,71,74,81,80,88,50,84, +109,68,70,73,102,86,84,69,66,77,83,99,52,104,76,69,119,53,75,66,54,43,114,115,74,77,72,54,51,88,54,112, +77,102,53,104,77,81,122,66,76,67,113,53,76,68,49,90,76,69,74,104,84,108,102,74,105,87,88,84,65,50,71,74, +89,112,77,73,99,119,80,78,99,50,79,54,84,65,117,71,82,73,80,88,49,105,103,68,74,103,47,80,74,109,121,89, +68,99,103,88,87,119,120,77,72,49,65,112,67,53,51,88,99,115,72,65,74,105,86,89,99,103,50,72,74,89,90,77, +69,48,89,112,67,53,118,87,74,107,104,76,78,74,103,76,108,68,84,65,101,70,74,104,70,47,70,81,102,86,74,107, +71,54,74,105,71,88,99,111,109,121,74,103,79,114,74,89,104,77,69,114,89,113,68,53,51,78,74,106,55,108,82,122, +66,77,68,99,111,101,71,74,104,122,111,66,74,98,51,71,74,105,78,49,113,90,66,67,74,103,87,121,74,89,112,78, +70,49,76,105,103,65,65,88,65,74,105,78,83,74,103,122,108,71,74,103,116,47,74,107,90,76,82,121,57,84,74,103, +101,72,74,104,122,110,70,99,117,83,90,71,119,53,77,72,74,111,109,106,99,117,104,76,66,113,100,99,74,105,83,97, +105,84,67,104,77,86,49,67,89,120,121,53,76,67,113,100,88,73,65,87,121,54,43,114,74,104,67,97,108,84,67,78, +50,74,103,100,89,72,52,87,72,74,105,71,112,84,70,55,107,68,99,52,51,87,50,82,77,74,84,85,90,76,81,122, +66,76,70,99,52,109,114,54,43,71,74,104,50,106,84,70,109,88,74,89,121,97,69,119,117,121,99,53,83,97,103,52, +120,76,90,84,81,109,71,50,87,70,74,104,120,78,97,74,89,90,77,76,74,90,83,97,69,74,111,79,72,84,82,57, +47,74,97,43,54,74,98,100,84,113,82,78,69,84,82,82,78,70,49,74,76,86,52,66,76,99,65,65,78,89,73,53, +84,111,75,49,66,76,89,74,104,87,89,74,90,119,65,66,113,53,78,111,74,90,57,49,74,97,65,65,66,100,65,90, +78,83,48,90,76,101,121,57,83,74,97,82,78,89,118,53,75,77,52,50,54,74,90,109,88,117,120,75,85,74,114,75, +99,76,48,108,84,122,66,76,75,122,66,75,89,74,114,86,88,118,102,71,83,111,108,55,69,89,87,88,74,73,50,55, +122,70,49,74,76,81,65,68,113,53,78,85,114,103,89,66,52,119,65,69,69,73,86,48,99,111,109,88,73,55,119,65, +70,114,67,99,80,74,103,89,87,66,84,73,73,65,69,84,73,78,50,74,89,109,87,117,104,77,107,100,83,100,89,67, +103,79,101,74,103,117,101,113,82,76,70,121,122,104,102,84,105,57,98,113,52,84,67,52,53,77,70,52,57,84,117,117, +88,74,108,112,79,78,99,111,103,65,67,48,104,75,66,48,103,72,68,118,90,77,69,113,82,77,112,65,65,78,83,113, +57,99,114,108,98,74,65,89,65,68,113,119,82,68,120,71,107,48,109,73,65,52,101,67,84,81,79,101,118,101,88,74, +100,89,65,72,113,120,78,70,100,65,101,73,65,65,81,71,67,114,79,73,48,111,72,69,65,71,86,88,84,82,74,77, +71,118,103,71,67,119,82,77,55,84,65,90,77,72,119,81,71,67,118,104,77,49,114,66,77,69,82,73,104,77,71,65, +119,100,90,74,109,116,83,113,86,84,119,78,99,119,74,69,68,74,103,49,57,99,118,73,65,68,97,52,100,57,74,104, +65,78,68,74,110,83,76,72,74,103,114,108,54,65,65,104,70,70,65,119,112,90,68,101,103,106,110,55,118,104,77,71, +99,118,119,65,66,114,74,65,70,74,103,106,108,47,84,81,112,66,66,73,52,106,108,47,65,65,78,56,84,81,104,72, +68,99,118,52,65,68,99,74,66,77,68,118,112,77,43,73,89,97,101,68,65,65,104,76,43,113,100,57,83,103,121,99, +69,74,110,55,105,69,65,65,49,56,74,102,55,110,69,99,118,52,65,73,114,74,76,73,99,118,54,97,77,99,118,52, +65,68,118,104,77,72,114,74,74,47,65,65,98,108,47,99,54,90,77,47,65,65,116,57,99,118,55,110,83,73,118,55, +110,76,99,118,52,65,72,114,76,108,47,84,82,112,74,66,118,103,110,106,65,61,61,34,41,41,59,103,46,114,101,115, +101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,54,54,51,51,102,102,34,41,59,172,121,61, +50,52,48,44,115,112,101,101,100,61,53,59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97,99,107,41,123,121, +151,115,112,101,101,100,59,172,120,61,40,50,52,48,45,55,55,41,47,50,59,103,46,100,114,97,119,73,109,97,103,101, +40,105,109,103,44,120,44,121,41,59,103,46,99,108,101,97,114,82,101,99,116,40,120,44,121,43,56,49,44,120,43,55, +55,44,121,43,56,49,43,115,112,101,101,100,41,59,163,40,121,62,54,48,41,115,101,116,84,105,109,101,111,117,116,40, +98,97,108,108,111,111,110,44,48,44,99,97,108,108,98,97,99,107,41,59,164,99,97,108,108,98,97,99,107,40,41,59, +125,102,97,100,101,40,34,35,54,54,51,51,102,102,34,44,170,40,41,123,98,97,108,108,111,111,110,40,170,40,41,123, +103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,51, +41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,87,101,108,99,111,109,101,46,34,44,49,50,48,44,49,54,48,41,59,125,41,59,125,41,59,115,101,116, +84,105,109,101,111,117,116,40,170,40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40, +170,40,41,123,110,150,53,59,103,46,115,99,114,111,108,108,40,48,44,45,53,41,59,163,40,110,62,49,55,48,41,99, +108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51,53,48,48,41,59,125,59, +163,40,110,138,50,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111, +114,40,34,35,102,102,97,56,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116, +40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120, +61,56,48,44,121,61,51,53,44,104,61,51,53,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119, +83,116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116, +114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97, +119,83,116,114,105,110,103,40,34,104,97,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116, +114,105,110,103,40,34,51,32,98,117,116,116,111,110,115,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,115,101, +116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, +34,49,34,44,50,48,48,44,52,48,41,59,125,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50, +34,44,50,48,48,44,49,50,48,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,51,34,44,50, +48,48,44,50,48,48,41,93,44,50,48,48,41,59,125,59,163,40,110,138,51,41,171,170,40,41,123,103,46,114,101,115, +101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99, +108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116, +70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34, +49,34,44,50,48,48,44,52,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41, +59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103, +40,34,77,111,118,101,32,117,112,92,110,105,110,32,109,101,110,117,115,92,110,92,110,84,117,114,110,32,66,97,110,103, +108,101,46,106,115,32,111,110,92,110,105,102,32,105,116,32,119,97,115,32,111,102,102,34,44,50,48,44,52,48,41,59, +125,59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111, +108,111,114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111, +110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44, +52,56,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54, +120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,101,108,101,99,116,32,109,101,110,117, +92,110,105,116,101,109,92,110,92,110,76,97,117,110,99,104,32,97,112,112,92,110,119,104,101,110,32,119,97,116,99,104, +92,110,105,115,32,115,104,111,119,105,110,103,34,44,50,48,44,55,48,41,59,125,59,163,40,110,138,53,41,171,170,40, +41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,97,56,102, +102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, +41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100,114,97,119,83, +116,114,105,110,103,40,34,51,34,44,50,48,48,44,50,48,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, +110,40,45,49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,77,111,118,101,32,100,111,119,110,92,110,105,110,32,109,101,110,117,115,92,110,92, +110,76,111,110,103,32,112,114,101,115,115,92,110,116,111,32,101,120,105,116,32,97,112,112,92,110,97,110,100,32,103,111, +32,98,97,99,107,92,110,116,111,32,99,108,111,99,107,34,44,50,48,44,49,48,48,41,59,125,59,163,40,110,138,54, +41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102, +102,51,51,48,48,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110, +40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,52,56,41,59,103,46,100, +114,97,119,83,116,114,105,110,103,40,34,49,34,44,50,48,48,44,52,48,41,59,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45, +49,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83, +116,114,105,110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,92,110,101,118,101,114,32,115,116,111,112,115,44, +92,110,104,111,108,100,32,98,117,116,116,111,110,115,92,110,49,32,97,110,100,32,50,32,102,111,114,92,110,97,114,111, +117,110,100,32,115,105,120,92,110,115,101,99,111,110,100,115,46,92,110,92,110,92,110,92,110,66,97,110,103,108,101,46, +106,115,32,119,105,108,108,92,110,116,104,101,110,32,114,101,98,111,111,116,46,34,44,50,48,44,50,48,41,59,125,59, +163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111, +114,40,34,35,48,48,97,56,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116, 40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120, 61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,99,111,109,101,115,32,119,105,116,104,34,44,120,44,121,150,104,41,59,103,46,100, -114,97,119,83,116,114,105,110,103,40,34,97,32,102,101,119,32,115,105,109,112,108,101,34,44,120,44,121,150,104,41,59, -103,46,100,114,97,119,83,116,114,105,110,103,40,34,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34,44,120,44, -121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32, -97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119, -83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111,109,47,97,112,112,115,34,44,120,44,121,150,104, -41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,119,105,116,104,32,97,32,66,108,117,101,116,111,111,116,104, -34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,99,97,112,97,98,108,101,32,100, -101,118,105,99,101,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48,48,41,59,125,59,163,40,110,138,57,41,171, -170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,57,57,48, -48,54,54,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44, -50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61, -49,48,44,104,61,50,49,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,32,99,97,110,32,97,108, -115,111,32,109,97,107,101,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,121,111, -117,114,32,111,119,110,32,97,112,112,115,33,34,44,120,44,121,150,104,41,59,121,61,49,54,48,59,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,98,97,110,103,108,101,106,115,46,99,111,109,34,44,120,44,121,150,104,41,59,172,114, -120,61,48,44,114,121,61,48,59,69,46,100,101,102,114,97,103,40,41,59,172,104,61,71,114,97,112,104,105,99,115,46, -99,114,101,97,116,101,65,114,114,97,121,66,117,102,102,101,114,40,57,54,44,57,54,44,49,44,123,109,115,98,58,180, -125,41,59,170,100,114,97,119,40,41,123,114,120,150,48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77, -97,116,104,46,99,111,115,40,114,120,41,44,114,115,120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121, -61,77,97,116,104,46,99,111,115,40,114,121,41,44,114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170, -112,40,120,44,121,44,122,41,123,172,116,59,116,61,120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99, -121,45,120,42,114,115,121,59,120,61,116,59,116,61,121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99, -120,45,121,42,114,115,120,59,121,61,116,59,122,150,52,59,171,91,57,54,42,40,48,46,53,43,120,47,122,41,44,57, -54,42,40,48,46,53,43,121,47,122,41,93,59,125,172,97,59,104,46,99,108,101,97,114,40,41,59,97,61,112,40,45, -49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112, -40,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, -112,40,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, -112,40,45,49,44,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, -61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, -59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93, -41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93, -41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, -59,97,61,112,40,45,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41, -59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93, -41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91, -49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97, -91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97, -91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,103,46,100,114,97,119,73,109,97,103,101,40,123,119,105,100,116,104,58,57,54,44,104,101,105,103, -104,116,58,57,54,44,98,117,102,102,101,114,58,104,46,98,117,102,102,101,114,125,44,40,50,52,48,45,57,54,41,47, -50,44,54,56,41,59,125,115,101,116,73,110,116,101,114,118,97,108,40,100,114,97,119,44,53,48,41,59,125,59,163,40, -110,138,49,48,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114, -40,34,35,54,54,48,48,57,57,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65, -108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41, -59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101,116, -70,111,110,116,40,34,54,120,56,34,44,50,41,59,172,120,61,57,48,44,121,61,51,48,44,104,61,50,49,59,97,110, -105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39,115,32,105, -116,33,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101, -115,115,34,44,120,44,121,150,104,42,51,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,117,116,116,111, -110,32,50,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,115,116,97, -114,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46, -106,115,34,44,120,44,121,150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172,115,99,101,110,101,78,117,109,98, -101,114,61,48,59,10,170,109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62,48,158,115,99,101,110,101,78,117, -109,98,101,114,43,49,138,83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99,101,110,101,78,117,109,98,101,114, -61,40,115,99,101,110,101,78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78,69,95,67,79,85,78,84,59,163, -40,115,99,101,110,101,78,117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109,98,101,114,61,48,59,99,108,101, -97,114,73,110,116,101,114,118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115,99,101,110,101,78,117,109,98,101, -114,41,40,41,59,163,40,115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172,108,61,83,67,69,78,69,95,67, -79,85,78,84,59,167,40,172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172,120,61,49,50,48,43,40,105,45, -40,108,45,50,41,47,50,41,42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45,49,41,123,103, -46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,102,105,108,108,67,105,114,99,108,101,40,120,44,50,51,48, -44,52,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,48,41,59,103,46,102,105,108,108,67,105,114,99,108, -101,40,120,44,50,51,48,44,52,41,59,103,46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,100,114,97,119, -67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114, -60,83,67,69,78,69,95,67,79,85,78,84,45,49,41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111, -118,101,40,49,41,59,125,44,53,48,48,48,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101, -39,44,100,105,114,162,109,111,118,101,40,45,100,105,114,41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,109, -111,118,101,40,49,41,44,66,84,78,51,44,123,114,101,112,101,97,116,58,180,125,41,59,10,115,101,116,87,97,116,99, -104,40,40,41,162,123,163,40,115,99,101,110,101,78,117,109,98,101,114,138,83,67,69,78,69,95,67,79,85,78,84,45, -49,41,123,108,111,97,100,40,41,59,125,125,44,66,84,78,50,44,123,114,101,112,101,97,116,58,180,44,101,100,103,101, -58,34,102,97,108,108,105,110,103,34,125,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,109,111,118,101,40,45, -49,41,44,66,84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59,10,66,97,110,103,108,101,46,115,101,116,76, -67,68,84,105,109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114, -40,49,41,59,10,109,111,118,101,40,48,41,59,255,255,255,234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116, -105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, -103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39, -119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103, -101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123, -125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109, -101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120,116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33, -115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101,100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101, -115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101,58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114, -97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99, -111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110,32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119, -101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44,39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32, -110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105, -116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59, -66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102, -116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46, -111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39,58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0, -119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32,104,97,115,32,97,34,44,120,44,121,150,104, +41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,115,105,109,112,108,101,32,116,111,117,99,104,115,99,114,101, +101,110,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110, +103,40,34,73,116,39,108,108,32,100,101,116,101,99,116,32,116,111,117,99,104,34,44,120,44,121,150,104,42,50,41,59, +103,46,100,114,97,119,83,116,114,105,110,103,40,34,111,110,32,108,101,102,116,32,97,110,100,32,114,105,103,104,116,34, +44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, +72,111,114,105,122,111,110,116,97,108,32,115,119,105,112,101,115,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,119,111,114,107,32,116,111,111,46,32,84,114,121,32,110,111,119,34,44,120,44,121, +150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,99,104,97,110,103,101,32,112,97,103,101, +46,34,44,120,44,121,150,104,41,59,125,93,44,51,48,48,41,59,125,59,163,40,110,138,56,41,171,170,40,41,123,103, +46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,51,51,57,57,48,48,34,41, +59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46, +115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61,49,48,44,104,61, +50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97, +110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,99,111, +109,101,115,32,119,105,116,104,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,97, +32,102,101,119,32,115,105,109,112,108,101,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103, +40,34,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40, +41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,97,100,100,32,109,111,114,101,44,32,118,105, +115,105,116,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,97,110,103, +108,101,106,115,46,99,111,109,47,97,112,112,115,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,119,105,116,104,32,97,32,66,108,117,101,116,111,111,116,104,34,44,120,44,121,150,104,41,59,103,46,100, +114,97,119,83,116,114,105,110,103,40,34,99,97,112,97,98,108,101,32,100,101,118,105,99,101,34,44,120,44,121,150,104, +41,59,125,44,93,44,52,48,48,41,59,125,59,163,40,110,138,57,41,171,170,40,41,123,103,46,114,101,115,101,116,40, +41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,57,57,48,48,54,54,34,41,59,103,46,99,108,101,97, +114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46,115,101,116,70,111,110,116, +65,108,105,103,110,40,48,44,48,41,59,172,120,61,49,50,48,44,121,61,49,48,44,104,61,50,49,59,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,89,111,117,32,99,97,110,32,97,108,115,111,32,109,97,107,101,34,44,120,44,121, +150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,121,111,117,114,32,111,119,110,32,97,112,112,115,33, +34,44,120,44,121,150,104,41,59,121,61,49,54,48,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,104,101, +99,107,32,111,117,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,97,110, +103,108,101,106,115,46,99,111,109,34,44,120,44,121,150,104,41,59,172,114,120,61,48,44,114,121,61,48,59,69,46,100, +101,102,114,97,103,40,41,59,172,104,61,71,114,97,112,104,105,99,115,46,99,114,101,97,116,101,65,114,114,97,121,66, +117,102,102,101,114,40,57,54,44,57,54,44,49,44,123,109,115,98,58,180,125,41,59,170,100,114,97,119,40,41,123,114, +120,150,48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77,97,116,104,46,99,111,115,40,114,120,41,44, +114,115,120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121,61,77,97,116,104,46,99,111,115,40,114,121, +41,44,114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170,112,40,120,44,121,44,122,41,123,172,116,59, +116,61,120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99,121,45,120,42,114,115,121,59,120,61,116,59, +116,61,121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99,120,45,121,42,114,115,120,59,121,61,116,59, +122,150,52,59,171,91,57,54,42,40,48,46,53,43,120,47,122,41,44,57,54,42,40,48,46,53,43,121,47,122,41,93, +59,125,172,97,59,104,46,99,108,101,97,114,40,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,104,46,109, +111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,104,46, +108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,104,46, +108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,104, +46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41, +59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49, +41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49, +41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41, +59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41, +59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49, +41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44, +45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45, +49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45, +49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44, +45,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44, +49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44, +49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44, +49,44,45,49,41,59,104,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49, +44,49,44,49,41,59,104,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,103,46,100,114,97,119, +73,109,97,103,101,40,123,119,105,100,116,104,58,57,54,44,104,101,105,103,104,116,58,57,54,44,98,117,102,102,101,114, +58,104,46,98,117,102,102,101,114,125,44,40,50,52,48,45,57,54,41,47,50,44,54,56,41,59,125,115,101,116,73,110, +116,101,114,118,97,108,40,100,114,97,119,44,53,48,41,59,125,59,163,40,110,138,49,48,41,171,170,40,41,123,103,46, +114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,54,54,48,48,57,57,34,41,59, +103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46, +115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,51,54,41,59,103,46,100,114,97,119,83,116,114,105,110, +103,40,34,50,34,44,50,48,48,44,49,50,48,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50, +41,59,172,120,61,57,48,44,121,61,51,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46, +100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39,115,32,105,116,33,34,44,120,44,121,150,104,41,44,40, +41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,120,44,121,150,104,42,51,41, +59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,117,116,116,111,110,32,50,34,44,120,44,121,150,104,41,59, +103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,115,116,97,114,116,34,44,120,44,121,150,104,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,125, +93,44,52,48,48,41,59,125,125,10,172,115,99,101,110,101,78,117,109,98,101,114,61,48,59,10,170,109,111,118,101,40, +100,105,114,41,123,163,40,100,105,114,62,48,158,115,99,101,110,101,78,117,109,98,101,114,43,49,138,83,67,69,78,69, +95,67,79,85,78,84,41,171,59,115,99,101,110,101,78,117,109,98,101,114,61,40,115,99,101,110,101,78,117,109,98,101, +114,43,100,105,114,41,37,83,67,69,78,69,95,67,79,85,78,84,59,163,40,115,99,101,110,101,78,117,109,98,101,114, +60,48,41,115,99,101,110,101,78,117,109,98,101,114,61,48,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,41, +59,103,101,116,83,99,101,110,101,40,115,99,101,110,101,78,117,109,98,101,114,41,40,41,59,163,40,115,99,101,110,101, +78,117,109,98,101,114,62,49,41,123,172,108,61,83,67,69,78,69,95,67,79,85,78,84,59,167,40,172,105,61,48,59, +105,60,108,45,50,59,105,152,41,123,172,120,61,49,50,48,43,40,105,45,40,108,45,50,41,47,50,41,42,49,50,59, +163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45,49,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49, +41,59,103,46,102,105,108,108,67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,125,164,123,103,46,115,101,116, +67,111,108,111,114,40,48,41,59,103,46,102,105,108,108,67,105,114,99,108,101,40,120,44,50,51,48,44,52,41,59,103, +46,115,101,116,67,111,108,111,114,40,45,49,41,59,103,46,100,114,97,119,67,105,114,99,108,101,40,120,44,50,51,48, +44,52,41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114,60,83,67,69,78,69,95,67,79,85,78,84, +45,49,41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111,118,101,40,49,41,59,125,44,53,48,48,48, +41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,109,111,118,101,40,45, +100,105,114,41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,109,111,118,101,40,49,41,44,66,84,78,51,44, +123,114,101,112,101,97,116,58,180,125,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,123,163,40,115,99,101,110, +101,78,117,109,98,101,114,138,83,67,69,78,69,95,67,79,85,78,84,45,49,41,123,108,111,97,100,40,41,59,125,125, +44,66,84,78,50,44,123,114,101,112,101,97,116,58,180,44,101,100,103,101,58,34,102,97,108,108,105,110,103,34,125,41, +59,10,115,101,116,87,97,116,99,104,40,40,41,162,109,111,118,101,40,45,49,41,44,66,84,78,49,44,123,114,101,112, +101,97,116,58,180,125,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41, +59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,10,109,111,118,101,40,48,41, +59,255,255,255,234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0, +0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39, +83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110, +39,44,49,41,160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78, +40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123,125,69,46,115,104,111,119,77,101,110,117,40, +123,39,39,58,123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109,101,32,65,112,112,39,125,44,39,82,117,110, +32,110,101,120,116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33,115,101,116,116,105,110,103,115,46,119,101,108, +99,111,109,101,100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101,115,39,58,39,78,111,39,44,111,110,99,104, +97,110,103,101,58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40, +39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,33,118,125,41,44,125,44, +39,82,117,110,32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106, +115,39,41,44,39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32,110,101,120,116,39,58,40,41,162,123,114,101, +113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46, +106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59,66,97,110,103,108,101,46,115,101,116,76,111, +99,107,101,100,40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,41,66,97,110,103,108, +101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,39,60,32,66, +97,99,107,39,58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0,119,101,108,99,111,109,101,46,105,109,103,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150, -150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192,150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204, -186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204, -204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204,205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204, -204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204, -206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204,213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204, -214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254, -254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204, -213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254, -254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204, -204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254, -254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254, -254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186, -150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91, -91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150, -186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97, -91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186, -186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97, -97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97, -97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254, +254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,204,204,204, +204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150,150,186,186,186,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,206,214,215,214,206,205,204,204,204, +204,204,204,192,150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,206,215,214,205,204,204,204,204,204,204,204, +204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97, +91,91,127,204,205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204,206,215,206,204,204,204,204,204,204,204,204,204, +204,204,204,204,204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,134,171, +172,135,204,204,213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254, +254,254,254,254,254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204,214,206,204,204,204,204,204,204,204,204,204,204, +204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,135,215,171,97, +91,91,204,204,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254, +254,254,254,254,254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204,213,204,204,204,204,204,204,204,204,204,204,204, +204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,97,172,215,134,97,97, +91,91,168,204,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254, +254,254,254,254,254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204,204,205,204,204,204,204,204,204,204,204,204,204, +204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,134,215,135,97,97,97, +91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254, +254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204, +204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97, +97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,186,254,254, +254,254,254,254,254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204, +204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,171,97,97,97, +97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204, +204,204,192,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,134,97,97, +97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204, +198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97, +97,97,97,97,91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186,186,186,186,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,127,204,204,204,204,254,254, +186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97, +97,97,97,97,97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97,97,97,97,91,254,254,198,198,198,198,254,150, +150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,97,97,97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,91,254,254,136,136,254,254,136, +136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,129,136,254,254,136,136,254,136,136, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254, +254,254,254,254,254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,254,136,136, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254, +254,254,254,254,254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44,34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34, -44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34, -119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116, -97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99,111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101, -108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111, -109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101, -108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97,34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34, -125,255,255,255,119,56,0,0,115,101,116,116,105,110,103,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108, -115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101, -100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184, -68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101, -118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63, -49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101, -114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116, -68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93, -59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61, -48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40, -105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100, -41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100, -111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115, -46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114, -101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45, -48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108, -105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98, -98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58, -109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116, -101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40, -34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115, -46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41, -42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40, -48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114, -101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104, -46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110, -103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105, -100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46, -72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83, -116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116, -105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115, -111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41, -123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50, -41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85, -112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123, -111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66, -84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46, -119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107, -101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101, -83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125, -10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101, -114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110, -103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108, -111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58, -180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110, -101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114, -115,116,68,97,121,79,102,87,101,101,107,58,48,44,98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111, -110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97, -107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110, -84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115, -104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84, -105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, -125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116, -116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116, -83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34, -58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110, -117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97, -99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83, -101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121, -115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76, -69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101, -110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59, -171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115, -116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39, -58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77, -101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41, -44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39, -58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111, -99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84, -105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104, -111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101, -110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116,101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123, -98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101, -112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118, -162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115, -40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40, -86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, -111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59, -125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34,118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79, -102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98,114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73, -116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101, -120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58, -98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93, -44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86, -91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111,103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123, -102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101, -115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118,138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40, -86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, -111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58, -123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115, -104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66,101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101, -109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105, -98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, -58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46, -118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105, -110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66,82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101, -116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41, -59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, -115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109, -115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, -116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, -41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73, -68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113,109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59, -125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104, -111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100,86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34, -107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93,59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75, -98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98,114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115, -101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39, -116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116,104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162, -115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101, -39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109, -97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101, -116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, -80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108, -101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, -58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46, -98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68, -39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120, -79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41,41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78, -46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97, -110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97, -116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123, -118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46, -112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105, -109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105, -115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115, -101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34, -41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115, -104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109, -101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171,103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101, -116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116,104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101, -116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, -59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115,101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115, -101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46, -102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116,104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61, -170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116,40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40, -48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59, -125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40, -41,59,109,46,100,114,97,119,40,41,59,125,172,116,104,101,109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116, -108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116, -101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99, -108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34, -35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102, -102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39, -76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41, -44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103, -50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58, -99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58,181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34, -83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111, -114,69,97,99,104,40,110,162,123,173,110,101,119,84,104,101,109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114, -97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,110,41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119, -84,104,101,109,101,46,110,97,109,101,63,110,101,119,84,104,101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123, -117,112,100,40,123,102,103,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101, -119,84,104,101,109,101,46,98,103,41,44,102,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44, -98,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84, -104,101,109,101,46,102,103,72,41,44,98,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100, -97,114,107,58,110,101,119,84,104,101,109,101,46,100,97,114,107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77, -101,110,117,91,39,67,117,115,116,111,109,105,122,101,39,93,61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104, -101,109,101,77,101,110,117,40,41,59,172,109,61,69,46,115,104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101, -110,117,41,59,170,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84, -40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109,101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98, -103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40,118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117, -112,100,40,116,104,41,59,125,173,114,103,98,61,123,125,59,114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48, -48,48,34,59,114,103,98,91,39,119,104,105,116,101,39,93,61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100, -39,93,61,34,35,102,48,48,34,59,114,103,98,91,39,103,114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103, -98,91,39,98,108,117,101,39,93,61,34,35,48,48,102,34,59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48, -102,102,34,59,114,103,98,91,39,109,97,103,101,110,116,97,39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121, -101,108,108,111,119,39,93,61,34,35,102,102,48,34,59,163,40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98, -91,39,111,114,97,110,103,101,39,93,61,34,35,102,102,55,102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101, -39,93,61,34,35,55,102,48,48,102,102,34,59,114,103,98,91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55, -102,34,59,125,173,99,111,108,111,114,115,61,91,93,44,110,97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98, -41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59,99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114, -103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111, -109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77, -101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123,102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44, -98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44,102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32, -50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117,110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108, -105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105,103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34, -102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34,98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34, -93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110,117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105, -110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118, -97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111,108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116, -104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109,97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110, -99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99,111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103, -39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115,101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101, -46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46,116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40, -39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41,59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125, -41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93,61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110, -117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80, -97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162, -115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116, -105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, -115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115, -115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123, -115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101, -83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105,61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123, -109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43,49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101, -116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105,93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110, -99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112, -108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61, -112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125, -41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104, -105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40, -41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101, -116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115, -46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111, -114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91,100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61, -170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116, -104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, -46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120, -79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105, -109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125, -125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101,118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111, -119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32,100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116, -111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87,104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40, -170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110, -101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70, -46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78, -82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105, -110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, -61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114, -41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108, -76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105, -115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59, -10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41,123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123, -39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83, -121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68,32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44, -109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, -110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118,160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116, -105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41,59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116, -39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44, -109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, -103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, -66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105, -109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58, -115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109, -97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, -110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115, -46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110, -115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71,76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115, -115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44, -102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115, -101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116, -105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112, -116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101, -58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114, -109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116, -105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103, -115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111, -110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117, -44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85,112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110, -103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98, -111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46, -111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111, -112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110, -115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101, -116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97, -116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110, -103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115, -46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111, -110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115, -101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109, -97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, -110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103, -115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105, -111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117, -101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116, -119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109,105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44, -115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111, -112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97, -108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105, -115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110, -115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58,45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115, -116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116, -105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118,160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105, -111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58, -115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105, -110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118, -162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61, -118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46, -115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117,41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101, -110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, -76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77, -101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, -115,46,116,105,109,101,122,111,110,101,44,102,111,114,109,97,116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41, -43,118,44,109,105,110,58,45,49,49,44,109,97,120,58,49,51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97, -110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100, -97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123, -118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97, -116,58,118,162,118,63,34,49,50,104,34,58,34,50,52,104,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, -116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,125,125,44,39,83,116,97,114,116,32,87,101,101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101, -116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48, -44,109,97,120,58,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116, -105,108,115,34,41,46,100,111,119,40,118,44,49,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, -110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101, -116,116,105,110,103,115,40,41,59,125,44,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108, -101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61, -123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99, -107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111, -39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48, -44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34, -44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44, -111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116, -101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39, -58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46, -46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108, -101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, -46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119, -114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114, -97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105, -114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106, -115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125, -44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115, -115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32, -99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116, -111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109, -101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40, -66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83, -80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80, -111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34, -41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108, -101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97, -110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101, -116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103, -108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101, -114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49, -48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125,125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10, -109,101,110,117,91,39,67,97,108,105,98,114,97,116,101,32,66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46, -115,104,111,119,80,114,111,109,112,116,40,34,73,115,32,116,104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121, -32,99,104,97,114,103,101,100,63,34,44,123,116,105,116,108,101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46, -116,104,101,110,40,111,107,162,123,163,40,111,107,41,123,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97, -103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46, -98,97,116,70,117,108,108,86,111,108,116,97,103,101,61,40,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97, -110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97, -108,111,103,82,101,97,100,40,68,51,41,41,47,52,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34, -41,46,119,114,105,116,101,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46, -115,104,111,119,65,108,101,114,116,40,34,67,97,108,105,98,114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41, -162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115, -104,111,119,65,108,101,114,116,40,34,80,108,101,97,115,101,32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106, -115,32,102,111,114,32,51,32,104,111,117,114,115,32,97,110,100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104, -101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125, -125,41,59,125,59,10,109,101,110,117,91,39,82,101,115,101,116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162, -123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115, -63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105,110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162, -123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41, -59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, -77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41, -59,125,59,10,109,101,110,117,91,34,84,117,114,110,32,79,102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80, -114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32, -116,105,109,101,114,115,32,119,111,110,39,116,32,102,105,114,101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32, -79,102,102,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105, -114,109,101,100,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97, -116,101,114,33,34,44,34,71,111,111,100,98,121,101,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123, -69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108, -101,46,115,111,102,116,79,102,102,63,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108, -101,46,111,102,102,40,41,59,125,44,50,53,48,48,41,59,125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40, -41,59,125,125,41,59,125,59,10,163,40,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123, -109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119, -80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104, -105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116, -104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101, -114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111, -114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125, -10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99, -116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123, -125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101, -61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115, -117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111, -119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101, -63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114, -162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101, -61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46, -115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40, -41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65, -112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105, -110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100, -74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63, -97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44, -98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108, -111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111, -99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117, -40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100, -101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103, -115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107, -139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111, -99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111, -99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115, -114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117, -40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123, -99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162, -123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115, -104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105, -109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101, -39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123,115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109, -101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97, -121,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170, -40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68, -97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100, -46,103,101,116,77,111,110,116,104,40,41,43,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34, -100,97,116,101,95,117,116,105,108,115,34,41,46,109,111,110,116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170, -40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77, -111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59,125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101, -58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41,44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49, -48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118, -41,59,125,125,44,39,72,111,117,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44, -111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59, -100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58, -123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117,116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170, -40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116, -101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100, -46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97, -108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108, -117,101,41,59,125,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10, -125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110, -117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39, -60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112, -115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47,92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47, -41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116,114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41, -41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105, -100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97,109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110, -97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114, -125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41,162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114, -100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46, -110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41, -171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46,108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110, -117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101,116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125, -10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40,97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112, -46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125, -59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97,112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112, -112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10,174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123, -69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36,123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109, -115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32,103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116, -99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112, -101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101, -97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116,105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83, -101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112,83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104, -40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116, -116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111, -114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141, -34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111,119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32, -115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112,112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111, -119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111, -110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32, -101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115, -101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0, -115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0, -255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64, -0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0, -1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, -0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0,85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85, -69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0,0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85, -234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170,213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0, -0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122,170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170, -169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0,0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,225,0,0,0,119,101,108,99,111,109,101,46, +105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,101,108,99,111, +109,101,34,44,34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34,44,34,115,114,99,34,58,34,119,101,108,99, +111,109,101,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,119,101,108,99,111,109,101,46,105,109,103,34, +44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,115,116,97,114,116,44, +119,101,108,99,111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101,108,99,111,109,101,46,105,110,102,111,44,119, +101,108,99,111,109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111,109,101,46,97,112,112,46,106,115,44,119,101, +108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101,108,99,111,109,101,46,105,109,103,34,44,34, +100,97,116,97,34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34,125,255,255,255,119,56,0,0,115,101,116,116, +105,110,103,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46, +97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111,114, +116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101,113, +117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41,43, +51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99, +101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114, +101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119,59, +125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97,98, +98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113, +117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100,111, +119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121,79, +102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105,97, +116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67,97, +115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97,98, +98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99,97, +108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48, +48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101, +118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63, +109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111,114, +116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,115, +61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40, +172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108,101, +46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41, +44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116, +101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111, +110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101, +40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103, +101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,66,65, +78,71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,59, +10,174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,59,10,173,115, +101,116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,123,115,116,111,114,97, +103,101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,115,101,116,116,105,110,103,115, +41,59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,123,172,111,61,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50,41,123,163,40,33,40,111,46,119,97,107,101, +79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111, +117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123,111,46,119,97,107,101,79,110,66,84,78,49, +61,180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110, +66,84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112, +160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,111,46, +119,97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66, +97,110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125,10,170,103,84,111,73,110,116,101,114,110,97, +108,40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101,114,110,97,108,84,111,71,40,117,41,123,171, +117,47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,123,115,101,116,116,105,110,103, +115,61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108,111,103,58,181,44,113,117,105,101,116,58,48, +44,116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58,180,44,98,101,101,112,58,66,65,78,71,76, +69,74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110,101,58,48,44,72,73,68,58,181,44,99,108, +111,99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114,115,116,68,97,121,79,102,87,101,101,107,58, +48,44,98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111,110,115,58,123,119,97,107,101,79,110,66,84, +78,49,58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97,107,101,79,110,66,84,78,51,58,180,44,119, +97,107,101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110,84,111,117,99,104,58,181,44,119,97,107,101, +79,110,84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115,104,111,108,100,58,56,49,57,46,50,44,116, +119,105,115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84,105,109,101,111,117,116,58,49,48,48,48,125, +44,125,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,10,115,101,116,116,105,110,103,115,61,115, +116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49, +41,59,10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,10, +174,98,111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34,58,34,79,102,102,34,59,10,170,115,104,111, +119,77,97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108, +101,39,58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,108,111,97,100,40, +41,44,39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40, +41,44,39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39, +66,108,117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,39,65,108,101, +114,116,115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,44,39,85,116,105,108,115,39, +58,40,41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40, +109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,123,174,109, +97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,121,115,116,101,109,39,125,44,39, +60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,84,104,101,109,101, +39,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,44,39,76,67,68,39,58,40,41,162,115,104, +111,119,76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39,58,40,41,162,115,104,111,119,76,111,99,97, +108,101,77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111,99,107,39,58,40,41,162,115,104,111,119,67, +108,111,99,107,77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84,105,109,101,39,58,40,41,162,115,104,111,119, +83,101,116,84,105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109, +101,110,117,41,59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,123,172,98,101,101,112,77,101, +110,117,73,116,101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123,98,101,101,112,77,101,110,117,73,116,101,109, +61,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101,112,140,181,44,102,111,114,109,97,116,58,98, +111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98, +101,101,112,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103, +115,46,98,101,101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44, +123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65, +84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59,125,164,123,172,98,101,101,112,86,61,91,181, +44,180,44,34,118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79,102,102,34,44,34,80,105,101,122,111,34,44, +34,86,105,98,114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,77, +97,116,104,46,109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115, +46,98,101,101,112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58,98,101,101,112,86,46,108,101,110,103,116,104, +45,49,44,102,111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162, +123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86,91,118,93,59,163,40,118,138,49,41,123,97, +110,97,108,111,103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123,102,114,101,113,58,50,48,48,48,125,41,59, +115,101,116,84,105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125, +164,163,40,118,138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44, +123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65, +84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, +41,59,125,125,59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108, +101,114,116,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40, +41,44,39,66,101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101,109,44,39,86,105,98,114,97,116,105,111,110, +39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,44,102,111,114,109,97,116, +58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103, +115,46,118,105,98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,59,117,112,100,97, +116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,41, +123,86,73,66,82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162, +86,73,66,82,65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41,59,125,125,125,44,34,81,117,105,101,116,32, +77,111,100,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,113,117,105,101,116,124,48,44,102,111, +114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109,115,34,44,34,83,105,108,101,110,116,34,93, +91,118,37,51,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,113,117,105,101,116, +61,118,37,51,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,117,112,100,97,116,101,79,112,116,105, +111,110,115,40,41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73,68,71,69,84,83,41,87,73,68,71,69,84, +83,91,34,113,109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59,125,44,125,125,59,171,69,46,115,104,111,119, +77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,66,76,69,77,101,110,117,40,41,123, +172,104,105,100,86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34,107,98,34,44,34,99,111,109,34,44,34,106, +111,121,34,93,59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75,98,114,100,32,38,32,77,101,100,105,97,34, +44,34,75,98,114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115,101,34,44,34,74,111,121,115,116,105,99,107, +34,93,59,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,66,108,117,101, +116,111,111,116,104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117, +40,41,44,39,77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101,39,58,40,41,162,109,97,107,101,67,111,110, +110,101,99,116,97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115, +46,98,108,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58, +40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101,116,116,105,110,103,115,46,98,108,101,59,117, +112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,114,111,103,114,97,109,109,97,98,108,101, +39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,44,102,111,114,109,97,116, +58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103, +115,46,98,108,101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,59,117,112,100,97, +116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68,39,58,123,118,97,108,117,101,58,77,97,116, +104,46,109,97,120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46, +72,73,68,41,41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78,46,108,101,110,103,116,104,45,49,44,102,111, +114,109,97,116,58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,46,72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, +59,125,125,44,39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110, +103,115,46,112,97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,58,34,110,111,110, +101,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,80,97, +115,115,107,101,121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105,115,116,39,58,123,118,97,108,117,101,58,115, +101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115,101,116,116,105,110,103,115,46,119,104,105,116, +101,108,105,115,116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34,41,58,34,111,102,102,34,44,111,110,99,104, +97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116, +77,101,110,117,41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,123,170,99,108,40, +120,41,123,171,103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101,116,67,111,108,111,114,40,41,59,125,170,117, +112,100,40,116,104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101,116,116,105,110,103,115,46,116,104,101,109,101, +61,116,104,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,190,103,46,114,101,115,101,116,59,103,46, +95,114,101,115,101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115,101,116,61,170,40,110,41,123,171,103,46,95, +114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46,102,103,41,46,115,101,116,66,103,67,111,108, +111,114,40,116,104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61,170,40,110,41,123,163,40,110,41,103,46,114, +101,115,101,116,40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,103,46,103,101,116,87,105,100, +116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59,125,59,103,46,99,108,101,97,114,40,49,41, +59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,109,46,100,114,97,119,40,41,59,125, +172,116,104,101,109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,84,104,101,109,101,39,125,44, +39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,68,97, +114,107,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,102,102,102,34,41,44,98,103, +58,99,108,40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34,35,102,102,102,34,41,44,98,103,50,58,99, +108,40,34,35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102,102,102,34,41,44,98,103,72,58,99,108,40, +34,35,48,48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39,76,105,103,104,116,32,66,87,39,58,40,41, +162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41,44,98,103,58,99,108,40,34,35,102,102,102, +34,41,44,102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103,50,58,99,108,40,34,35,99,102,102,34,41, +44,102,103,72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58,99,108,40,34,35,48,102,102,34,41,44,100, +97,114,107,58,181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105, +115,116,40,47,94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111,114,69,97,99,104,40,110,162,123,173,110,101, +119,84,104,101,109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83, +79,78,40,110,41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119,84,104,101,109,101,46,110,97,109,101,63,110, +101,119,84,104,101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,110, +101,119,84,104,101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,41,44,102, +103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44,98,103,50,58,99,108,40,110,101,119,84,104, +101,109,101,46,98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,72,41,44,98,103, +72,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100,97,114,107,58,110,101,119,84,104,101,109,101, +46,100,97,114,107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77,101,110,117,91,39,67,117,115,116,111,109,105, +122,101,39,93,61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,59,172,109, +61,69,46,115,104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101,110,117,41,59,170,115,104,111,119,67,117,115, +116,111,109,84,104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84,40,116,44,118,41,123,173,116,104,61,103,46, +116,104,101,109,101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98,103,34,41,123,116,104,91,39,100,97,114,107, +39,93,61,40,118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117,112,100,40,116,104,41,59,125,173,114,103,98, +61,123,125,59,114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48,48,48,34,59,114,103,98,91,39,119,104,105, +116,101,39,93,61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100,39,93,61,34,35,102,48,48,34,59,114,103, +98,91,39,103,114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103,98,91,39,98,108,117,101,39,93,61,34,35, +48,48,102,34,59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48,102,102,34,59,114,103,98,91,39,109,97,103, +101,110,116,97,39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121,101,108,108,111,119,39,93,61,34,35,102,102, +48,34,59,163,40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98,91,39,111,114,97,110,103,101,39,93,61,34, +35,102,102,55,102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101,39,93,61,34,35,55,102,48,48,102,102,34, +59,114,103,98,91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55,102,34,59,125,173,99,111,108,111,114,115,61, +91,93,44,110,97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98,41,123,110,97,109,101,115,46,112,117,115,104, +40,99,41,59,99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114,103,98,91,99,93,41,41,59,125,173,109,101, +110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111,109,32,84,104,101,109,101,39,125,44,34,60, +32,66,97,99,107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,125,59,174,108,97,98,101, +108,115,61,123,102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44,98,103,58,39,66,97,99,107,103,114,111,117, +110,100,39,44,102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32,50,39,44,98,103,50,58,39,66,97,99,107, +103,114,111,117,110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108,105,103,104,116,32,70,71,39,44,98,103,72, +58,39,72,105,103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34,102,103,34,44,34,98,103,34,44,34,102,103, +50,34,44,34,98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34,93,46,102,111,114,69,97,99,104,40,116,162, +123,109,101,110,117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105,110,58,48,44,109,97,120,58,99,111,108,111, +114,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118,97,108,117,101,58,77,97,116,104,46,109,97, +120,40,99,111,108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116,104,101,109,101,91,116,93,41,44,48,41,44, +102,111,114,109,97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123, +172,99,61,99,111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103,39,158,103,46,116,104,101,109,101,46,98,103, +139,99,41,115,101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101,46,102,103,41,59,163,40,116,139,39,98,103, +39,158,103,46,116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40,39,102,103,39,44,103,46,116,104,101,109,101, +46,98,103,41,59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125,41,59,109,101,110,117,91,34,60,32,66,97, +99,107,34,93,61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,59,109,61,69,46,115,104,111,119, +77,101,110,117,40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,40,41, +123,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40, +41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121, +61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40, +41,59,125,125,59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,160,115,101,116,116,105,110,103, +115,46,112,97,115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123,115,101,116,116,105,110,103,115,46,112,97,115, +115,107,101,121,61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125, +167,40,172,105,61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123,109,101,110,117,91,96,68,105,103,105,116,32, +36,123,105,43,49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101,116,116,105,110,103,115,46,112,97,115,115,107, +101,121,91,105,93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110,99,104,97,110,103,101,58,118,162,123,172,112, +61,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112,108,105,116,40,34,34,41,59,112,91,105,93, +61,118,59,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,112,46,106,111,105,110,40,34,34,41,59,117, +112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,41,40,105,41,59,10,69,46,115,104,111,119, +77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40, +41,123,10,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110, +117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101, +108,105,115,116,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77, +101,110,117,40,41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115, +101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111,114,69,97,99,104,40,170,40,100,41,123,109, +101,110,117,91,100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61,170,40,41,123,69,46,115,104,111,119,80,114, +111,109,112,116,40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118, +41,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,115,112,108,105,99,101,40,115,101,116,116, +105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120,79,102,40,100,41,44,49,41,59,117,112,100, +97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104, +105,116,101,108,105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125,125,41,59,10,109,101,110,117,91,39,65,100, +100,32,68,101,118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,67,111,110,110, +101,99,116,32,100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116,111,92,110,119,104,105,116,101,108,105,115,116, +34,44,34,87,104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40,170,40,41,123,78,82,70,46,114,101,109,111, +118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104, +105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105, +115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78,82,70,46,111,110,40,39,99,111,110,110,101, +99,116,39,44,170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115, +116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,91,93,59,115,101,116,116,105,110,103,115, +46,119,104,105,116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114,41,59,117,112,100,97,116,101,83,101,116,116, +105,110,103,115,40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99, +111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59, +125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,76,67,68,77,101, +110,117,40,41,123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,67,68, +39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44, +39,76,67,68,32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115, +46,98,114,105,103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44,109,97,120,58,49,44,115,116,101,112,58,48, +46,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101, +115,115,61,118,160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115, +101,116,76,67,68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110, +101,115,115,41,59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116, +116,105,110,103,115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,54,48,44,115,116,101,112,58, +53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,61,48, +124,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67, +68,84,105,109,101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,41,59,125,125,44,39,87, +97,107,101,32,111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97, +116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, +119,97,107,101,79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, +101,79,110,66,84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,59,10,163,40,33, +66,65,78,71,76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117, +44,123,39,87,97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44,102,111,114,109,97,116,58,98,111,111,108,70, +111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105, +111,110,115,46,119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, +46,119,97,107,101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39, +87,97,107,101,32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112, +116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109, +97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, +46,119,97,107,101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97, +107,101,79,110,66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,79, +98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,70, +97,99,101,85,112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119, +97,107,101,79,110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110, +99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101, +79,110,70,97,99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, +110,70,97,99,101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101, +32,111,110,32,84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111, +110,115,46,119,97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116, +44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119, +97,107,101,79,110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, +101,79,110,84,111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107, +101,32,111,110,32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105, +111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97, +116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, +119,97,107,101,79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97, +107,101,79,110,84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119, +105,115,116,32,84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117,101,58,105,110,116,101,114,110,97,108,84,111, +71,40,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108, +100,41,44,109,105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44,115,116,101,112,58,48,46,48,49,44,111,110, +99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116, +84,104,114,101,115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97,108,40,118,160,48,46,49,41,59,117,112,100, +97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,77,97,120,32,89,39,58,123,118, +97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,44, +109,105,110,58,45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104, +97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97, +120,89,61,118,160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119, +105,115,116,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48, +44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111, +112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61,118,160,49,48,48,48,59,117,112,100,97,116, +101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,99,100, +77,101,110,117,41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,123,10,174,108,111,99,97,108, +101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,111,99,97,108,101,39,125,44,39,60,32, +66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,84,105,109,101,32, +90,111,110,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,44,102, +111,114,109,97,116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41,43,118,44,109,105,110,58,45,49,49,44,109, +97,120,58,49,51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,46,116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, +41,59,125,125,44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123,118,97,108,117,101,58,33,33,115,101,116,116, +105,110,103,115,91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97,116,58,118,162,118,63,34,49,50,104,34,58, +34,50,52,104,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,49,50,104,111, +117,114,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,83,116,97,114, +116,32,87,101,101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,91,34,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48,44,109,97,120,58,49,44,102,111,114,109,97, +116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,40,118,44, +49,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,102,105,114,115,116,68,97, +121,79,102,87,101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,44,125, +125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108,101,109,101,110,117,41,59,10,125,170,115,104, +111,119,85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39, +58,39,85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97, +105,110,77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111,39,58,123,118,97,108,117,101,58,69,46,99, +108,105,112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48,44,50,41,44,109,105,110,58,48,44,109,97, +120,58,50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34,44,34,83,104,111,119,34,44,34,76,111,103, +34,93,91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44,111,110,99,104,97,110,103,101,58,118,162,123, +115,101,116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +125,125,44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39,58,40,41,162,123,69,46,115,104,111,119,77, +101,115,115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46,46,92,110,84,97,107,101,115,32,97,112,112, +114,111,120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108,101,58,34,83,116,111,114,97,103,101,34,125, +41,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,99,111,109,112,97,99,116,40,41,59,115, +104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119,114,105,116,101,32,83,101,116,116,105,110,103, +115,39,58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40, +34,46,98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39, +41,46,114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106,115,39,41,41,59,34,41,59,108,111,97,100, +40,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125,44,39,70,108,97,116,116,101,110,32,66,97, +116,116,101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,70,108,97,116,116,101, +110,105,110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32,99,97,110,32,116,97,107,101,32,104,111,117, +114,115,46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116,111,110,32,116,111,32,99,97,110,99,101,108, +46,39,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,66,97,110,103, +108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40,66,97,110,103,108,101,46,115,101,116,71,80, +83,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97, +116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46, +115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115, +101,116,67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115, +80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,66,97,114,111, +109,101,116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111, +119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119, +101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59, +115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49,48,48,48,59,166,40,105,153,41,59,125,44, +49,41,59,125,125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10,109,101,110,117,91,39,67,97,108,105,98,114, +97,116,101,32,66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34, +73,115,32,116,104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121,32,99,104,97,114,103,101,100,63,34,44,123, +116,105,116,108,101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46,116,104,101,110,40,111,107,162,123,163,40,111, +107,41,123,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79, +78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46,98,97,116,70,117,108,108,86,111,108,116,97, +103,101,61,40,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51, +41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,41, +47,52,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40, +34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46,115,104,111,119,65,108,101,114,116,40,34,67, +97,108,105,98,114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105, +110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115,104,111,119,65,108,101,114,116,40,34,80,108, +101,97,115,101,32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106,115,32,102,111,114,32,51,32,104,111,117,114, +115,32,97,110,100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34, +115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,125,41,59,125,59,10,109,101,110,117,91,39, +82,101,115,101,116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112, +116,40,39,82,101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115,63,39,44,123,116,105,116,108,101,58,34,83, +101,116,116,105,110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119, +77,101,115,115,97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41,59,114,101,115,101,116,83,101,116,116,105,110, +103,115,40,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,77,97,105,110,77,101,110,117,44,53,48,41, +59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,59,10,109,101,110,117,91,34,84,117, +114,110,32,79,102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121, +111,117,32,115,117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32,116,105,109,101,114,115,32,119,111,110,39,116, +32,102,105,114,101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32,79,102,102,34,125,41,46,116,104,101,110,40, +40,99,111,110,102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105,114,109,101,100,41,123,69,46,115,104,111,119, +77,101,115,115,97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97,116,101,114,33,34,44,34,71,111,111,100,98, +121,101,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103, +101,40,41,59,103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108,101,46,115,111,102,116,79,102,102,63,66,97, +110,103,108,101,46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,50,53, +48,48,41,59,125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,125,41,59,125,59,10,163,40,66, +97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123,109,101,110,117,91,39,70,97,99,116,111,114, +121,32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,84,104,105,115, +32,119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104,105,110,103,33,39,44,123,116,105,116,108,101, +58,34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118, +41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101,114,109,105,110,97,108,46,115,101,116,67,111, +110,115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,40,41,59,125,164, +115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125,10,171,69,46,115,104,111,119,77,101,110,117, +40,109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,123,10,177,123,78, +82,70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123,125,10,66,108,117,101,116,111,111,116,104,46, +115,101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101,61,34,66,97,110,103,108,101,46,106,115,32, +34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,45,53,41,46,114,101, +112,108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111,119,80,114,111,109,112,116,40,110,97,109,101, +43,34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101,63,34,44,123,116,105,116,108,101,58,34,67, +111,110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114,162,123,163,40,115,101,116,116,105,110,103,115, +46,98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101,61,114,59,117,112,100,97,116,101,83,101,116, +116,105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46,115,108,101,101,112,40,41,59,125,99,97,116, +99,104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,41,59,10,125,170,115,104,111,119, +67,108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65,112,112,115,61,114,101,113,117,105,114,101,40, +34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,10,46,109,97,112,40, +97,112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59, +171,40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63,97,58,183,125,41,10,46,102,105,108,116,101, +114,40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44,98,41,162,97,46,115,111,114,116,111,114,100, +101,114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108,111,99,107,77,101,110,117,61,123,39,39,58, +123,39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111,99,107,39,44,125,44,39,60,32,66,97,99, +107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,125,59,10,99,108,111,99,107,65, +112,112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61, +97,112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103,115,46,99,108,111,99,107,158,105,110,100,101, +120,139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,139,97,112,112,46,115,114,99,41,41,123,108, +97,98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111,99,107,77,101,110,117,91,108,97,98,101,108, +93,61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,141,97,112,112,46,115,114,99,41,123, +115,101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115,114,99,59,117,112,100,97,116,101,83,101,116, +116,105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,125,59,125,41,59,10,163,40, +99,108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123,99,108,111,99,107,77,101,110,117,91,34,78, +111,32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162,123,125,59,125,10,171,69,46,115,104,111,119, +77,101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115,104,111,119,83,101,116,84,105,109,101,77,101, +110,117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105,109,101,109,101,110,117,61,123,39,39,58,123, +39,116,105,116,108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101,39,125,44,39,60,32,66,97,99,107,39,58, +170,40,41,123,115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109,101,40,41,47,49,48,48,48,41,59,115,104, +111,119,83,121,115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97,121,39,58,123,118,97,108,117,101,58,100,46, +103,101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61, +40,40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68,97,116,101,40,175,46,118,97,108,117,101,41, +59,125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,111,110,116,104,40,41,43, +49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41, +46,109,111,110,116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61, +40,40,118,43,49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77,111,110,116,104,40,175,46,118,97,108,117,101, +45,49,41,59,125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,70,117,108,108,89,101, +97,114,40,41,44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49,48,48,44,111,110,99,104,97,110,103,101,58, +170,40,118,41,123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118,41,59,125,125,44,39,72,111,117,114,39,58, +123,118,97,108,117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118, +41,123,175,46,118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59,100,46,115,101,116,72,111,117,114,115,40,175, +46,118,97,108,117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58,123,118,97,108,117,101,58,100,46,103,101,116, +77,105,110,117,116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61, +40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116,101,115,40,175,46,118,97,108,117,101,41,59, +125,125,44,39,83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100,46,103,101,116,83,101,99,111,110,100,115,40, +41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54, +48,59,100,46,115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108,117,101,41,59,125,125,125,59,10,171,69,46, +115,104,111,119,77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10,125,170,115,104,111,119,65,112,112,83,101,116, +116,105,110,103,115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108, +101,39,58,39,65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115, +104,111,119,77,97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112,115,61,115,116,111,114,97,103,101,46,108,105, +115,116,40,47,92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47,41,10,46,109,97,112,40,115,162,115,46,115, +117,98,115,116,114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41,41,10,46,109,97,112,40,105,100,162,123,174, +97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105,100,43,39,46,105,110,102,111,39,44,49,41, +160,123,110,97,109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110,97,109,101,58,97,46,110,97,109,101,44,115, +111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,125,59,125,41,10,46,115,111,114,116,40,40, +97,44,98,41,162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111, +114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41, +171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,10,163,40,97, +112,112,115,46,108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110,117,91,39,78,111,32,97,112,112,32,104,97, +115,32,115,101,116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125,10,97,112,112,115,46,102,111,114,69,97,99, +104,40,170,40,97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112,46,110,97,109,101,93,61,40,41,162,123,115, +104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125,59,125,41,10,69,46,115,104,111,119,77,101, +110,117,40,97,112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112, +112,41,123,10,174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123,69,46,115,104,111,119,77,101,115,115,97,103, +101,40,96,36,123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109,115,103,125,33,92,110,92,110,66,84,78,49, +32,116,111,32,103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116,99,104,40,115,104,111,119,65,112,112,83,101, +116,116,105,110,103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112,101,97,116,58,181,125,41,59,125,173,97,112, +112,83,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,40,97,112,112,46,105,100,43,39,46, +115,101,116,116,105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83,101,116,116,105,110,103,115,61,101,118,97,108, +40,97,112,112,83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46, +108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58, +96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103, +115,39,41,59,125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141,34,102,117,110,99,116,105,111,110,34,41,123, +171,115,104,111,119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,115,101,116,116,105,110,103,115,39,41,59,125, +177,123,97,112,112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115, +77,101,110,117,40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36, +123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115, +104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,125, +115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0,115,101,116,116,105,110,103,46,105,109,103,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,241,99,204,66,111,83,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0, +5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,16,0,5,85,85,80,0,5,0,0, +0,0,85,0,85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85,69,85,64,0,0,1,85,85,85,250,175,85, +85,85,80,0,0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85,234,170,170,171,85,85,84,0,0,21,85,87, +170,170,170,170,213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0, +0,85,85,122,170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170,169,85,84,0,0,1,85,234,170,0,0,170, +171,85,64,0,0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170, 168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0, -0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234,170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170, -171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0,0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90, -170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170,181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0, -0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85,94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85, -85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0,0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0, -5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, -0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64, -0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116,105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116,114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114, -117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34,116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98, -114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112,34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110, -101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101,44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49, -50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114,105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116, -105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84,78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110, -66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97, -107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58, -102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105,115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84, -104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44,34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48, -44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58,49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116, -105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115, -101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34,83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58, -34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103, -46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34, -48,46,52,56,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101, -115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111,44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44, -115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97,116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111, -110,34,125,255,198,41,0,0,97,108,97,114,109,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108, -115,34,44,170,40,41,123,174,79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78, -85,84,69,61,54,48,42,79,78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79, -78,69,95,77,73,78,85,84,69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101, -120,112,111,114,116,115,46,101,110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115, -97,102,101,84,105,109,101,40,116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105, -109,101,46,104,42,79,78,69,95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43, -116,105,109,101,46,115,42,79,78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109, -101,41,123,171,123,100,58,116,105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109, -101,46,109,160,48,44,115,58,116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100, -101,84,105,109,101,61,40,109,105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101, -114,34,41,176,34,79,110,108,121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101, -100,34,59,172,100,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41, -59,109,105,108,108,105,115,151,100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40, -109,105,108,108,105,115,47,79,78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79, -85,82,59,172,109,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85, -84,69,41,59,109,105,108,108,105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46, -102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104, -58,104,44,109,58,109,44,115,58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61, -40,118,97,108,117,101,41,162,123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34, -111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101, -40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115, -117,112,112,111,114,116,101,100,32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104, -62,50,51,41,176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60, -61,32,104,32,60,61,32,50,51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41, -176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32, -60,61,32,53,57,34,59,171,116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46, -115,117,98,115,116,114,40,45,50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105, -111,110,61,40,118,97,108,117,101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112, -97,99,116,160,181,59,172,100,117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109, -101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46, -100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117, -114,97,116,105,111,110,150,116,105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117, -114,97,116,105,111,110,150,116,105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117, -114,97,116,105,111,110,150,116,105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117, -114,97,116,105,111,110,150,116,105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105, -111,110,46,116,114,105,109,40,41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97, -99,101,40,34,32,34,44,34,34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116, -67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116, -101,40,41,59,171,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46, -103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40, -41,41,42,49,48,48,48,59,125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34, -100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97, -98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108, -101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48, -48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118, -105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100, -111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111, -119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162, -123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108, -101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112, -111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98, -98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46, -109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59, -125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162, -123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40, -184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118, -105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49, -58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112, -101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40, -97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101, -61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105, -152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116, -101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101, -100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48, -41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111, -110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59, -125,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170, -40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109, -105,115,101,40,114,101,115,111,108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110, -138,34,34,41,114,101,115,111,108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116, -101,114,110,61,112,97,116,116,101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75, -61,48,46,50,53,44,66,85,90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48, -48,44,77,69,68,73,85,77,95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138, -34,46,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69, -65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48, -48,41,41,59,164,163,40,99,138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95, +0,0,85,234,170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170,171,85,64,0,0,21,85,106,170,160,10,170, +169,85,84,0,0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,94, +170,170,170,170,181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0,0,21,85,85,234,170,170,171,85,85,84,0, +0,5,85,85,94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85,85,85,64,0,0,1,85,81,85,85,85,85, +69,85,64,0,0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0,5,85,85,80,0,4,0,0,0,0,0,0, +5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0, +0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,0,0, +115,101,116,116,105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,98,108, +101,34,58,116,114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114,117,101,44,34,108,111,103,34,58,102,97,108, +115,101,44,34,116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98,114,97,116,101,34,58,116,114,117,101,44,34, +98,101,101,112,34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110,101,34,58,48,44,34,72,73,68,34,58,102, +97,108,115,101,44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49,50,104,111,117,114,34,58,102,97,108,115,101, +44,34,98,114,105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116,105,111,110,115,34,58,123,34,119,97,107,101, +79,110,66,84,78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,50,34,58,116,114,117,101,44,34, +119,97,107,101,79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97,107,101,79,110,70,97,99,101,85,112,34,58, +102,97,108,115,101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58,102,97,108,115,101,44,34,119,97,107,101,79, +110,84,119,105,115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84,104,114,101,115,104,111,108,100,34,58,56,49, +57,46,50,44,34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48,44,34,116,119,105,115,116,84,105,109,101,111, +117,116,34,58,49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116,105,110,103,46,105,110,102,111,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115,101,116,116,105,110,103,34,44,34,110,97,109, +101,34,58,34,83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58,34,115,101,116,116,105,110,103,46,97,112,112, +46,106,115,34,44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103,46,105,109,103,34,44,34,115,111,114,116,111, +114,100,101,114,34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,56,34,44,34,116,97,103,115,34, +58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,115,101,116,116,105,110,103,46, +105,110,102,111,44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44,115,101,116,116,105,110,103,46,105,109,103,34, +44,34,100,97,116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111,110,34,125,255,133,2,0,0,115,99,104,101, +100,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,163,40,66, +97,110,103,108,101,46,83,67,72,69,68,41,123,99,108,101,97,114,84,105,109,101,111,117,116,40,66,97,110,103,108,101, +46,83,67,72,69,68,41,59,190,66,97,110,103,108,101,46,83,67,72,69,68,59,125,172,97,108,97,114,109,115,61,114, +101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,99,104,101, +100,46,106,115,111,110,39,44,49,41,160,91,93,59,172,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114, +114,101,110,116,84,105,109,101,61,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48, +48,41,43,40,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105, +109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,59,172,100,61,116,105,109,101,46,103,101, +116,68,97,116,101,40,41,59,172,97,99,116,105,118,101,61,97,108,97,114,109,115,46,102,105,108,116,101,114,40,97,162, +97,46,111,110,158,40,97,46,108,97,115,116,140,100,41,158,40,97,46,116,43,54,48,48,48,48,62,99,117,114,114,101, +110,116,84,105,109,101,41,158,40,97,46,100,111,119,146,116,105,109,101,46,103,101,116,68,97,121,40,41,38,49,41,158, +40,33,97,46,100,97,116,101,160,97,46,100,97,116,101,138,116,105,109,101,46,116,111,73,83,79,83,116,114,105,110,103, +40,41,46,115,117,98,115,116,114,40,48,44,49,48,41,41,41,59,163,40,97,99,116,105,118,101,46,108,101,110,103,116, +104,41,123,97,99,116,105,118,101,61,97,99,116,105,118,101,46,115,111,114,116,40,40,97,44,98,41,162,97,46,116,45, +98,46,116,41,59,172,116,61,97,99,116,105,118,101,91,48,93,46,116,45,99,117,114,114,101,110,116,84,105,109,101,59, +163,40,116,60,49,48,48,48,41,116,61,49,48,48,48,59,66,97,110,103,108,101,46,83,67,72,69,68,61,115,101,116, +84,105,109,101,111,117,116,40,97,99,116,105,118,101,91,48,93,46,106,115,160,39,108,111,97,100,40,34,115,99,104,101, +100,46,106,115,34,41,39,44,116,41,59,125,164,123,66,97,110,103,108,101,46,83,67,72,69,68,61,115,101,116,84,105, +109,101,111,117,116,40,39,101,118,97,108,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114, +101,97,100,40,34,115,99,104,101,100,46,98,111,111,116,46,106,115,34,41,41,39,44,56,54,52,48,48,48,48,48,45, +40,68,97,116,101,46,110,111,119,40,41,37,56,54,52,48,48,48,48,48,41,41,59,125,125,41,40,41,59,255,255,255, +104,18,0,0,115,99,104,101,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170, +40,41,123,174,79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61, +54,48,42,79,78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77, +73,78,85,84,69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114, +116,115,46,101,110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84, +105,109,101,40,116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104, +42,79,78,69,95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101, +46,115,42,79,78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171, +123,100,58,116,105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160, +48,44,115,58,116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109, +101,61,40,109,105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176, +34,79,110,108,121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172, +100,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108, +108,105,115,151,100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108, +105,115,47,79,78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172, +109,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59, +109,105,108,108,105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111, +114,40,109,105,108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109, +58,109,44,115,58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108, +117,101,41,162,123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101, +99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108, +117,101,41,41,59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111, +114,116,101,100,32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41, +176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32, +60,61,32,50,51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110, +118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53, +57,34,59,171,116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115, +116,114,40,45,50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40, +118,97,108,117,101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160, +181,59,172,100,117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118, +97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111, +100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105, +111,110,150,116,105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105, +111,110,150,116,105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105, +111,110,150,116,105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105, +111,110,150,116,105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116, +114,105,109,40,41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34, +32,34,44,34,34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114, +101,110,116,84,105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59, +171,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77, +105,110,117,116,101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49, +48,48,48,59,125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122, +34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80, +114,111,109,105,115,101,40,114,101,115,111,108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116, +101,114,110,138,34,34,41,114,101,115,111,108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112, +97,116,116,101,114,110,61,112,97,116,116,101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87, +69,65,75,61,48,46,50,53,44,66,85,90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83, +61,49,48,48,44,77,69,68,73,85,77,95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163, +40,99,138,34,46,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90, +95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122, +44,49,48,48,41,41,59,164,163,40,99,138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73, +85,77,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101, +111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101, +46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41, +162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58, +34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79, +78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48, +48,41,41,59,164,163,40,99,138,34,59,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95, +77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111, +117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46, +98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40, +41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105, +109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125, +41,59,10,163,40,66,97,110,103,108,101,46,83,67,72,69,68,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108, +40,66,97,110,103,108,101,46,83,67,72,69,68,41,59,190,66,97,110,103,108,101,46,83,67,72,69,68,59,125,10,170, +115,104,111,119,65,108,97,114,109,40,97,108,97,114,109,41,123,174,97,108,97,114,109,73,110,100,101,120,61,97,108,97, +114,109,115,46,105,110,100,101,120,79,102,40,97,108,97,114,109,41,59,174,115,101,116,116,105,110,103,115,61,114,101,113, +117,105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,173,109,101,115, +115,97,103,101,61,34,34,59,109,101,115,115,97,103,101,150,97,108,97,114,109,46,116,105,109,101,114,63,114,101,113,117, +105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110, +40,97,108,97,114,109,46,116,105,109,101,114,41,58,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108, +115,34,41,46,102,111,114,109,97,116,84,105,109,101,40,97,108,97,114,109,46,116,41,59,163,40,97,108,97,114,109,46, +109,115,103,41,123,109,101,115,115,97,103,101,150,34,92,110,34,43,97,108,97,114,109,46,109,115,103,59,125,164,123,109, +101,115,115,97,103,101,61,40,97,108,97,114,109,46,116,105,109,101,114,63,97,116,111,98,40,34,65,67,81,115,119,103, +68,47,47,51,51,118,82,99,71,72,73,81,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65, +65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66, +86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,65,80,47,119,65,65,65,65,65, +65,65,65,65,80,47,119,65,65,65,65,65,65,65,65,65,113,113,111,65,80,65,65,65,65,65,65,113,113,113,113,111, +80,56,65,65,65,65,75,113,113,113,113,113,118,47,65,65,65,67,113,113,113,113,113,113,113,47,119,65,65,75,113,113, +113,108,87,113,113,118,119,65,65,113,113,113,113,108,86,97,113,114,65,65,67,113,113,113,113,108,86,86,113,113,65,65, +75,113,113,113,113,108,86,86,97,113,103,65,75,113,97,113,113,108,86,86,87,113,103,65,113,112,87,113,113,108,86,86, +86,113,111,65,113,108,87,113,113,108,86,86,86,97,111,67,113,108,86,54,113,108,86,86,86,97,113,67,113,86,86,102, +113,108,86,86,86,87,113,67,113,86,86,102,54,108,86,86,86,87,113,75,112,86,86,88,47,108,86,86,86,86,113,113, +112,86,86,86,47,43,86,86,86,86,113,113,112,86,86,86,47,47,108,86,86,86,113,113,112,86,86,86,102,114,49,86, +86,86,113,113,112,86,86,86,102,114,49,86,86,86,113,113,112,86,86,86,98,47,108,86,86,86,113,113,112,86,86,86, +87,43,86,86,86,86,113,113,112,86,86,86,86,86,86,86,86,86,113,105,113,86,86,86,86,86,86,86,86,87,113,67, +113,86,86,86,86,86,86,86,86,87,113,67,113,108,86,86,86,86,86,86,86,97,113,65,113,108,86,86,86,86,86,86, +86,97,111,65,113,112,86,86,86,86,86,86,86,113,111,65,75,113,86,86,86,86,86,86,87,113,103,65,75,113,108,86, +86,86,86,86,97,113,103,65,67,113,112,86,86,86,86,86,113,113,65,65,65,113,113,108,86,86,86,97,113,111,65,65, +65,75,113,113,86,86,87,113,113,103,65,65,65,67,113,113,113,113,113,113,113,65,65,65,65,65,75,113,113,113,113,113, +103,65,65,65,65,65,65,113,113,113,113,111,65,65,65,65,65,65,65,65,113,113,111,65,65,65,65,65,61,61,34,41, +58,97,116,111,98,40,34,65,67,48,115,119,103,70,57,55,47,47,47,82,99,69,112,77,108,86,86,86,86,86,86,102, +57,86,86,86,86,86,86,86,86,88,47,57,86,86,102,57,86,86,102,47,49,86,86,86,47,47,47,49,86,102,57,86, +88,47,47,47,86,86,88,47,47,47,86,87,113,113,108,86,47,47,47,49,86,102,47,47,57,97,113,113,113,113,112,102, +47,47,57,86,47,47,47,50,113,113,113,113,113,113,110,47,47,47,86,47,47,47,54,113,113,113,113,113,113,114,47,47, +47,88,47,47,43,113,113,111,65,65,75,113,113,118,47,47,51,47,47,54,113,111,65,65,65,65,75,113,114,47,47,51, +47,47,113,113,65,65,65,65,65,65,113,113,47,47,51,47,43,113,111,65,65,68,119,65,65,75,113,118,47,51,47,43, +113,103,65,65,68,119,65,65,67,113,118,47,51,47,97,113,65,65,65,68,119,65,65,65,113,112,47,49,57,113,111,65, +65,65,68,119,65,65,65,75,113,102,86,49,113,103,65,65,65,68,119,65,65,65,67,113,88,86,87,113,103,65,65,65, +68,119,65,65,65,67,113,108,86,87,113,65,65,65,65,68,119,65,65,65,65,113,108,86,87,113,65,65,65,65,68,119, +65,65,65,65,113,108,86,87,113,65,65,65,65,68,119,65,65,65,65,113,108,86,97,111,65,65,65,65,68,119,65,65, +65,65,75,112,86,97,111,65,65,65,65,68,119,65,65,65,65,75,112,86,97,111,65,65,65,65,68,119,65,65,65,65, +75,112,86,97,111,65,65,65,65,79,115,65,65,65,65,75,112,86,97,111,65,65,65,65,79,115,65,65,65,65,75,112, +86,97,111,65,65,65,65,76,47,65,65,65,65,75,112,86,97,111,65,65,65,65,103,80,119,65,65,65,75,112,86,97, +111,65,65,65,67,65,68,56,65,65,65,75,112,86,87,113,65,65,65,73,65,65,47,65,65,65,113,108,86,87,113,65, +65,65,103,65,65,80,119,65,65,113,108,86,87,113,65,65,67,65,65,65,68,119,65,65,113,108,86,87,113,103,65,73, +65,65,65,65,65,65,67,113,108,86,86,113,103,65,103,65,65,65,65,65,65,67,113,86,86,86,113,111,65,65,65,65, +65,65,65,65,75,113,86,86,86,97,113,65,65,65,65,65,65,65,65,113,112,86,86,86,87,113,103,65,65,65,65,65, +65,67,113,108,86,86,86,87,113,111,65,65,65,65,65,65,75,113,108,86,86,86,86,113,113,65,65,65,65,65,65,113, +113,86,86,86,86,86,97,113,111,65,65,65,65,75,113,112,86,86,86,86,86,101,113,113,111,65,65,75,113,113,116,86, +86,86,86,86,47,54,113,113,113,113,113,113,114,47,86,86,86,86,88,47,50,113,113,113,113,113,113,110,47,49,86,86, +86,102,47,86,97,113,113,113,113,112,86,47,57,86,86,86,102,57,86,86,87,113,113,108,86,86,102,57,86,86,86,102, +49,86,86,86,86,86,86,86,86,88,57,86,81,61,61,34,41,41,43,34,32,34,43,109,101,115,115,97,103,101,125,66, +97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87, +105,100,103,101,116,115,40,41,59,173,98,117,122,122,67,111,117,110,116,61,115,101,116,116,105,110,103,115,46,98,117,122, +122,67,111,117,110,116,59,69,46,115,104,111,119,80,114,111,109,112,116,40,109,101,115,115,97,103,101,44,123,116,105,116, +108,101,58,97,108,97,114,109,46,116,105,109,101,114,63,34,84,73,77,69,82,33,34,58,34,65,76,65,82,77,33,34, +44,98,117,116,116,111,110,115,58,123,34,83,110,111,111,122,101,34,58,180,44,34,83,116,111,112,34,58,181,125,125,41, +46,116,104,101,110,40,170,40,115,108,101,101,112,41,123,98,117,122,122,67,111,117,110,116,61,48,59,163,40,115,108,101, +101,112,41,123,163,40,97,108,97,114,109,46,111,116,139,183,41,123,97,108,97,114,109,46,111,116,61,97,108,97,114,109, +46,116,59,125,97,108,97,114,109,46,116,150,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,83,110,111,111, +122,101,77,105,108,108,105,115,59,125,164,123,173,100,101,108,61,97,108,97,114,109,46,100,101,108,139,183,63,115,101,116, +116,105,110,103,115,46,100,101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115, +58,97,108,97,114,109,46,100,101,108,59,163,40,100,101,108,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40, +97,108,97,114,109,73,110,100,101,120,44,49,41,59,125,164,123,163,40,33,97,108,97,114,109,46,116,105,109,101,114,41, +123,97,108,97,114,109,46,108,97,115,116,61,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41,59,125,163, +40,97,108,97,114,109,46,111,116,141,183,41,123,97,108,97,114,109,46,116,61,97,108,97,114,109,46,111,116,59,190,97, +108,97,114,109,46,111,116,59,125,163,40,33,97,108,97,114,109,46,114,112,41,123,97,108,97,114,109,46,111,110,61,181, +59,125,125,125,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97, +108,97,114,109,115,41,59,108,111,97,100,40,41,59,125,41,59,170,98,117,122,122,40,41,123,163,40,115,101,116,116,105, +110,103,115,46,117,110,108,111,99,107,65,116,66,117,122,122,41,123,66,97,110,103,108,101,46,115,101,116,76,111,99,107, +101,100,40,181,41,59,125,174,112,97,116,116,101,114,110,61,97,108,97,114,109,46,118,105,98,114,97,116,101,160,40,97, +108,97,114,109,46,116,105,109,101,114,63,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,84,105,109,101,114, +80,97,116,116,101,114,110,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116, +116,101,114,110,41,59,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97, +116,116,101,114,110,41,46,116,104,101,110,40,40,41,162,123,163,40,98,117,122,122,67,111,117,110,116,153,41,123,115,101, +116,84,105,109,101,111,117,116,40,98,117,122,122,44,115,101,116,116,105,110,103,115,46,98,117,122,122,73,110,116,101,114, +118,97,108,77,105,108,108,105,115,41,59,125,164,163,40,97,108,97,114,109,46,97,115,41,123,98,117,122,122,67,111,117, +110,116,61,115,101,116,116,105,110,103,115,46,98,117,122,122,67,111,117,110,116,59,115,101,116,84,105,109,101,111,117,116, +40,98,117,122,122,44,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108, +105,115,41,59,125,125,41,59,125,163,40,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114, +101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41,46,113,117, +105,101,116,62,49,41,171,59,98,117,122,122,40,41,59,125,10,173,97,108,97,114,109,115,61,114,101,113,117,105,114,101, +40,34,115,99,104,101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,173,97,99,116,105,118,101,61,114, +101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,65,99,116,105,118,101,65,108,97,114,109,115,40, +97,108,97,114,109,115,41,59,10,163,40,97,99,116,105,118,101,46,108,101,110,103,116,104,41,123,115,104,111,119,65,108, +97,114,109,40,97,99,116,105,118,101,91,48,93,41,59,125,164,123,115,101,116,84,105,109,101,111,117,116,40,108,111,97, +100,44,49,48,48,41,59,125,132,4,0,0,115,99,104,101,100,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +17,17,17,102,102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17, +17,102,102,102,17,17,17,17,17,102,102,102,102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17, +17,22,102,102,102,102,17,17,17,17,17,102,204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17, +17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204, +204,204,204,204,204,193,17,17,17,17,22,102,102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17, +17,17,17,102,102,17,17,17,17,76,204,204,67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17, +20,204,204,195,255,255,255,255,255,255,255,255,60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240, +15,255,255,255,243,76,204,196,17,17,17,102,102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204, +17,17,17,102,102,17,17,108,204,196,255,255,255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204, +204,195,255,255,255,255,255,240,15,255,255,255,255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240, +15,255,255,255,255,255,243,204,204,102,22,102,102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76, +204,198,102,102,102,102,108,204,195,255,255,255,255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204, +79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240, +15,255,255,255,255,255,255,244,204,198,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243, +204,204,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204, +255,255,255,255,255,255,255,48,3,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5, +80,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255, +204,204,102,102,102,102,204,204,255,255,255,255,255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204, +63,255,255,255,255,255,52,63,48,0,63,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255, +243,0,3,255,255,255,255,243,204,204,102,102,102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244, +204,198,102,102,102,102,108,204,79,255,255,255,243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204, +195,255,255,255,52,63,255,255,255,255,48,47,255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255, +255,255,243,255,255,255,255,76,204,198,102,102,102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204, +204,102,102,102,102,102,102,204,204,195,255,243,255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108, +204,196,255,255,255,255,255,255,255,255,255,255,255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255, +255,255,255,255,255,244,204,204,102,102,102,102,102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204, +102,102,102,102,102,102,102,102,108,204,204,195,255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102, +102,204,204,204,67,255,255,255,255,255,255,52,204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255, +255,51,68,204,204,204,65,102,102,102,102,102,102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22, +102,102,102,102,102,102,102,102,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97, +17,17,102,102,204,204,204,204,204,204,204,204,102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204, +204,204,102,102,102,102,97,17,22,102,102,102,102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17, +22,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,172,8,0,0,115,99,104,101,100,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,10,101,120,112,111,114,116,115,46,103,101,116,65,108,97,114,109,115,61,170, +40,41,123,171,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40, +34,115,99,104,101,100,46,106,115,111,110,34,44,49,41,160,91,93,59,125,59,10,101,120,112,111,114,116,115,46,115,101, +116,65,108,97,114,109,115,61,170,40,97,108,97,114,109,115,41,123,171,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,115,99,104,101,100,46,106,115,111,110,34,44,97,108,97, +114,109,115,41,59,125,59,10,101,120,112,111,114,116,115,46,103,101,116,65,108,97,114,109,61,170,40,105,100,41,123,171, +101,120,112,111,114,116,115,46,103,101,116,65,108,97,114,109,115,40,41,46,102,105,110,100,40,97,162,97,46,105,100,138, +105,100,41,59,125,59,10,101,120,112,111,114,116,115,46,103,101,116,65,99,116,105,118,101,65,108,97,114,109,115,61,170, +40,97,108,97,114,109,115,44,116,105,109,101,41,123,163,40,33,116,105,109,101,41,116,105,109,101,61,184,68,97,116,101, +40,41,59,172,99,117,114,114,101,110,116,84,105,109,101,61,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41, +42,51,54,48,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48, +48,48,41,43,40,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,43,49,48,48, +48,48,59,171,97,108,97,114,109,115,46,102,105,108,116,101,114,40,97,162,97,46,111,110,158,40,97,46,108,97,115,116, +140,116,105,109,101,46,103,101,116,68,97,116,101,40,41,41,158,40,97,46,116,60,99,117,114,114,101,110,116,84,105,109, +101,41,158,40,97,46,100,111,119,146,116,105,109,101,46,103,101,116,68,97,121,40,41,38,49,41,158,40,33,97,46,100, +97,116,101,160,97,46,100,97,116,101,138,116,105,109,101,46,116,111,73,83,79,83,116,114,105,110,103,40,41,46,115,117, +98,115,116,114,40,48,44,49,48,41,41,41,46,115,111,114,116,40,40,97,44,98,41,162,97,46,116,45,98,46,116,41, +59,125,10,101,120,112,111,114,116,115,46,115,101,116,65,108,97,114,109,61,170,40,105,100,44,97,108,97,114,109,41,123, +172,97,108,97,114,109,115,61,101,120,112,111,114,116,115,46,103,101,116,65,108,97,114,109,115,40,41,46,102,105,108,116, +101,114,40,97,162,97,46,105,100,140,105,100,41,59,163,40,97,108,97,114,109,141,183,41,123,97,108,97,114,109,46,105, +100,61,105,100,59,163,40,97,108,97,114,109,46,100,111,119,139,183,41,97,108,97,114,109,46,100,111,119,61,48,98,49, +49,49,49,49,49,49,59,163,40,97,108,97,114,109,46,111,110,141,181,41,97,108,97,114,109,46,111,110,61,180,59,163, +40,97,108,97,114,109,46,116,105,109,101,114,41,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114, +114,101,110,116,84,105,109,101,61,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48, +48,41,43,40,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105, +109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,59,97,108,97,114,109,46,116,61,99,117, +114,114,101,110,116,84,105,109,101,43,97,108,97,114,109,46,116,105,109,101,114,59,125,97,108,97,114,109,115,46,112,117, +115,104,40,97,108,97,114,109,41,59,125,101,120,112,111,114,116,115,46,115,101,116,65,108,97,114,109,115,40,97,108,97, +114,109,115,41,59,125,59,10,101,120,112,111,114,116,115,46,103,101,116,84,105,109,101,84,111,65,108,97,114,109,61,170, +40,97,108,97,114,109,44,116,105,109,101,41,123,163,40,33,97,108,97,114,109,41,171,183,59,163,40,33,116,105,109,101, +41,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114,114,101,110,116,84,105,109,101,61,40,116,105,109,101, +46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,77,105, +110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40, +41,42,49,48,48,48,41,59,172,97,99,116,105,118,101,61,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109,46, +100,111,119,146,40,40,116,105,109,101,46,103,101,116,68,97,121,40,41,43,40,97,108,97,114,109,46,116,60,99,117,114, +114,101,110,116,84,105,109,101,41,41,37,55,41,41,38,49,158,40,33,97,108,97,114,109,46,100,97,116,101,160,97,108, +97,114,109,46,100,97,116,101,138,116,105,109,101,46,116,111,73,83,79,83,116,114,105,110,103,40,41,46,115,117,98,115, +116,114,40,48,44,49,48,41,41,59,163,40,33,97,99,116,105,118,101,41,171,183,59,172,116,61,97,108,97,114,109,46, +116,45,99,117,114,114,101,110,116,84,105,109,101,59,163,40,97,108,97,114,109,46,108,97,115,116,138,116,105,109,101,46, +103,101,116,68,97,116,101,40,41,160,116,60,45,54,48,48,48,48,41,116,150,56,54,52,48,48,48,48,48,59,171,116, +59,125,59,10,101,120,112,111,114,116,115,46,114,101,108,111,97,100,61,170,40,41,123,101,118,97,108,40,114,101,113,117, +105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,98,111,111,116,46, +106,115,34,41,41,59,163,40,103,108,111,98,97,108,46,87,73,68,71,69,84,83,158,87,73,68,71,69,84,83,91,34, +97,108,97,114,109,34,93,41,123,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101,108,111,97,100, +40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,125,125,59,10,101,120,112,111, +114,116,115,46,110,101,119,68,101,102,97,117,108,116,65,108,97,114,109,61,170,40,41,123,174,115,101,116,116,105,110,103, +115,61,101,120,112,111,114,116,115,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,172,97,108,97,114,109,61,123, +116,58,49,50,42,51,54,48,48,48,48,48,44,100,101,108,58,181,44,111,110,58,180,44,114,112,58,181,44,97,115,58, +115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,117,116,111,83,110,111,111,122,101,44,100,111,119,58,48, +98,49,49,49,49,49,49,49,44,108,97,115,116,58,48,44,118,105,98,114,97,116,101,58,115,101,116,116,105,110,103,115, +46,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,44,125,59,190,115,101,116,116,105,110,103,115, +59,171,97,108,97,114,109,59,125,10,101,120,112,111,114,116,115,46,110,101,119,68,101,102,97,117,108,116,84,105,109,101, +114,61,170,40,41,123,174,115,101,116,116,105,110,103,115,61,101,120,112,111,114,116,115,46,103,101,116,83,101,116,116,105, +110,103,115,40,41,59,172,116,105,109,101,114,61,123,116,105,109,101,114,58,53,42,54,48,42,49,48,48,48,44,100,101, +108,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84, +105,109,101,114,115,44,111,110,58,180,44,114,112,58,181,44,97,115,58,181,44,100,111,119,58,48,98,49,49,49,49,49, +49,49,44,108,97,115,116,58,48,44,118,105,98,114,97,116,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117, +108,116,84,105,109,101,114,80,97,116,116,101,114,110,125,190,115,101,116,116,105,110,103,115,59,171,116,105,109,101,114,59, +125,59,10,101,120,112,111,114,116,115,46,103,101,116,83,101,116,116,105,110,103,115,61,170,40,41,123,171,79,98,106,101, +99,116,46,97,115,115,105,103,110,40,123,117,110,108,111,99,107,65,116,66,117,122,122,58,181,44,100,101,102,97,117,108, +116,83,110,111,111,122,101,77,105,108,108,105,115,58,54,48,48,48,48,48,44,100,101,102,97,117,108,116,65,117,116,111, +83,110,111,111,122,101,58,181,44,100,101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109, +101,114,115,58,180,44,98,117,122,122,67,111,117,110,116,58,49,48,44,98,117,122,122,73,110,116,101,114,118,97,108,77, +105,108,108,105,115,58,51,48,48,48,44,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,58,34, +58,58,34,44,100,101,102,97,117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,58,34,58,58,34,125,44,114,101, +113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,99,104,101,100, +46,115,101,116,116,105,110,103,115,46,106,115,111,110,34,44,180,41,160,123,125,41,59,125,10,101,120,112,111,114,116,115, +46,115,101,116,83,101,116,116,105,110,103,115,61,170,40,115,101,116,116,105,110,103,115,41,123,114,101,113,117,105,114,101, +40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,115,99,104,101,100,46,115,101,116, +116,105,110,103,115,46,106,115,111,110,34,44,115,101,116,116,105,110,103,115,41,59,125,59,85,9,0,0,115,99,104,101, +100,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46, +97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116, +116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111,108,118,101,162,123,170, +100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111,108,118,101,40,41,59, +172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,46,115,117, +98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85,90,90,95,83,84,82, +79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77,95,77,83,61,50,48, +48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103,108,101,46,98,117,122, +122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101, +116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,44,34,41,66, +97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46, +116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59, +164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90, +90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122, +122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79, +82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105, +109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59,34,41,66,97,110,103, +108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116, +104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164, +163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90, +95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117, +122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41, +59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99, +104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116, +101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,112,97,116,116,101,114,110,115,61, +91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34,58,58,34,44,34,44,34,44,34,59,34,44,34,44, +44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45,45,34,44,34,61,61,34,44,34,46,46,46,34,44, +34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44,34,61,61,61,34,93,59,171,123,118,97,108,117,101, +58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114,110,115,46,105,110,100,101,120,79,102,40,118,97,108, +117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116,116,101,114,110,115,46,108,101,110,103,116,104,45,49, +44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102,34,44,111,110,99,104, +97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97,116,116,101,114,110,40, +112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98,97,99,107,40,112,97,116,116,101,114,110,115,91,118, +93,41,59,125,125,59,125,125,41,59,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113, +117,105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,69,46,115,104, +111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,83,99,104,101,100,117,108,101,114,34,125, +44,34,60,32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41,44,34,85,110,108,111,99,107,32,97,116,32,66, +117,122,122,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,117,110,108,111,99,107,65,116,66,117,122, +122,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,117,110,108,111,99,107,65,116,66, +117,122,122,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110, +103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,68,101,108,101,116,101,32,69,120,112,105,114,101,100,32, +84,105,109,101,114,115,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,68, +101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115,44,111,110,99,104,97,110,103,101,58,118,162,123,115, +101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101, +114,115,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103, +115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,68,101,102,97,117,108,116,32,65,117,116,111,32,83,110,111, +111,122,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,117,116,111, +83,110,111,111,122,101,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,100,101,102,97, +117,108,116,65,117,116,111,83,110,111,111,122,101,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41, +46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,68,101,102,97,117, +108,116,32,83,110,111,111,122,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117, +108,116,83,110,111,111,122,101,77,105,108,108,105,115,47,54,48,48,48,48,44,109,105,110,58,53,44,109,97,120,58,51, +48,44,115,116,101,112,58,53,44,102,111,114,109,97,116,58,118,162,118,43,34,109,34,44,111,110,99,104,97,110,103,101, +58,118,162,123,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108,105,115, +61,118,42,54,48,48,48,48,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116, +116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,66,117,122,122,32,67,111,117,110,116,34,58, +123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,117,122,122,67,111,117,110,116,44,109,105,110,58,53,44, +109,97,120,58,49,53,44,115,116,101,112,58,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, +103,115,46,98,117,122,122,67,111,117,110,116,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46, +115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,66,117,122,122,32,73, +110,116,101,114,118,97,108,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,117,122,122,73,110,116, +101,114,118,97,108,77,105,108,108,105,115,47,49,48,48,48,44,109,105,110,58,49,44,109,97,120,58,53,44,115,116,101, +112,58,49,44,102,111,114,109,97,116,58,118,162,118,43,34,115,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115, +101,116,116,105,110,103,115,46,98,117,122,122,73,110,116,101,114,118,97,108,77,105,108,108,105,115,61,118,42,49,48,48, +48,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115, +101,116,116,105,110,103,115,41,59,125,125,44,34,68,101,102,97,117,108,116,32,65,108,97,114,109,32,80,97,116,116,101, +114,110,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110, +40,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,44,118,162, +123,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,61,118,59, +114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116, +116,105,110,103,115,41,59,125,41,44,34,68,101,102,97,117,108,116,32,84,105,109,101,114,32,80,97,116,116,101,114,110, +34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,115, +101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,44,118,162,123,115, +101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,61,118,59,114,101, +113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105, +110,103,115,41,59,125,41,125,41,59,125,41,59,255,255,255,233,0,0,0,115,99,104,101,100,46,105,110,102,111,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115,99,104,101,100,34,44,34,110, +97,109,101,34,58,34,83,99,104,101,100,117,108,101,114,34,44,34,116,121,112,101,34,58,34,115,99,104,101,100,117,108, +101,114,34,44,34,105,99,111,110,34,58,34,115,99,104,101,100,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34, +58,34,48,46,49,51,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,97,108,97,114, +109,34,44,34,102,105,108,101,115,34,58,34,115,99,104,101,100,46,105,110,102,111,44,115,99,104,101,100,46,98,111,111, +116,46,106,115,44,115,99,104,101,100,46,106,115,44,115,99,104,101,100,46,105,109,103,44,115,99,104,101,100,44,115,99, +104,101,100,46,115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,115,99,104,101,100,46,106, +115,111,110,44,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106,115,111,110,34,125,255,255,255,9,42,0,0, +97,108,97,114,109,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117, +108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170,40,41,123,174, +79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61,54,48,42,79, +78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77,73,78,85,84, +69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114,116,115,46,101, +110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84,105,109,101,40, +116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104,42,79,78,69, +95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101,46,115,42,79, +78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171,123,100,58,116, +105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160,48,44,115,58, +116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,61,40,109, +105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176,34,79,110,108, +121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172,100,61,77,97, +116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108,108,105,115,151, +100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79, +78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172,109,61,77,97, +116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59,109,105,108,108, +105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111,114,40,109,105, +108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109,58,109,44,115, +58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108,117,101,41,162, +123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63, +118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41, +59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100, +32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41,176,34,73,110, +118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32,60,61,32,50, +51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110,118,97,108,105, +100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53,57,34,59,171, +116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115,116,114,40,45, +50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40,118,97,108,117, +101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160,181,59,172,100, +117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101, +139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105, +109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105,111,110,150,116, +105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116,114,105,109,40, +41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34,32,34,44,34, +34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114,101,110,116,84, +105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105, +109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77,105,110,117,116, +101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49,48,48,48,59, +125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105, +108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116, +101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40, +184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114, +101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41, +63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112, +101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91, +93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105, +61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119, +40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101, +100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162, +100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116, +115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61, +114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105, +45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115, +108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97, +98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41, +58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97, +116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101, +40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104, +115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53, +41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101, +40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98, +114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116, +104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,77,111, +100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114, +116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111, +108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111, +108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116, +101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85, +90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77, +95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103, +108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110, +40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99, +138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95, +87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44, +49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95, 77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116, -40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117, -122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101, -116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66, -97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41, -46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41, -59,164,163,40,99,138,34,59,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44, -66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40, -100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122, -122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115, -101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111, -117,116,40,100,111,66,117,122,122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10, -77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40, -41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97, -99,107,41,123,172,112,97,116,116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34, -58,58,34,44,34,44,34,44,34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45, -45,34,44,34,61,61,34,44,34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44, -34,61,61,61,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114, -110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116, -116,101,114,110,115,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115, -91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98, -117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98, -97,99,107,40,112,97,116,116,101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108,101,46, -108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116, -115,40,41,59,10,174,102,105,114,115,116,68,97,121,79,102,87,101,101,107,61,40,114,101,113,117,105,114,101,40,34,83, -116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34, -44,180,41,160,123,125,41,46,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,59,10,174,87,79,82,75,68, -65,89,83,61,54,50,10,174,87,69,69,75,69,78,68,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,49, -57,50,58,54,53,59,10,174,69,86,69,82,89,95,68,65,89,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107, -63,50,53,52,58,49,50,55,59,10,174,105,99,111,110,65,108,97,114,109,79,110,61,34,92,48,34,43,97,116,111,98, -40,34,71,66,105,66,65,65,65,65,65,65,65,65,65,65,89,65,89,65,52,65,99,66,120,43,79,68,110,47,110,65, -80,47,119,65,102,47,52,65,47,110,56,65,47,110,56,66,47,110,43,66,47,110,43,66,47,110,43,66,47,110,43,66, -47,104,43,66,47,52,43,65,47,43,56,65,47,47,56,65,102,47,52,65,80,47,119,65,72,47,103,65,66,43,65,65, -65,65,65,65,65,65,65,65,61,61,34,41,59,10,174,105,99,111,110,65,108,97,114,109,79,102,102,61,34,92,48,34, -43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56, -65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65, -80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52, -80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103, -61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,71,65,71, -65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47, -103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52, -99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,174,105,99,111,110, -84,105,109,101,114,79,110,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40, -34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65, -66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65, -65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65, -65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89, -65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119, -65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65, -65,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101, -109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65, +40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117, +122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41, +162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59, +34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82, +79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49, +48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77, +83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117, +116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122, +122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10,77,111,100,117,108,101,115,46, +97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116, +115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,112,97,116, +116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34,58,58,34,44,34,44,34,44, +34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45,45,34,44,34,61,61,34,44, +34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44,34,61,61,61,34,93,59,171, +123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114,110,115,46,105,110,100,101,120, +79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116,116,101,114,110,115,46,108,101, +110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102, +34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97, +116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98,97,99,107,40,112,97,116,116, +101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103, +101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, +46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,180,41,160,123,125,41,46, +102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,59,10,174,87,79,82,75,68,65,89,83,61,54,50,10,174, +87,69,69,75,69,78,68,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,49,57,50,58,54,53,59,10,174, +69,86,69,82,89,95,68,65,89,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,50,53,52,58,49,50,55, +59,10,174,105,99,111,110,65,108,97,114,109,79,110,61,34,92,48,34,43,97,116,111,98,40,34,71,66,105,66,65,65, +65,65,65,65,65,65,65,65,89,65,89,65,52,65,99,66,120,43,79,68,110,47,110,65,80,47,119,65,102,47,52,65, +47,110,56,65,47,110,56,66,47,110,43,66,47,110,43,66,47,110,43,66,47,110,43,66,47,104,43,66,47,52,43,65, +47,43,56,65,47,47,56,65,102,47,52,65,80,47,119,65,72,47,103,65,66,43,65,65,65,65,65,65,65,65,65,65, +61,61,34,41,59,10,174,105,99,111,110,65,108,97,114,109,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109, +101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65, +71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65, +102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77, +72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98, +40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106, +103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119, +65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119, +77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,110,61, +34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47, +47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65, +66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65, +65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65, +65,65,65,65,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119, -65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119, -77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111, -98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47, -43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80, -65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56, -119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117, -105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,104,97,110,100,108, -101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,100,111,119,41,123,163,40,102,105,114,115,116,68,97,121,79, -102,87,101,101,107,138,49,41,123,163,40,40,100,111,119,38,49,41,138,49,41,123,100,111,119,150,49,50,55,59,125,164, -163,40,40,100,111,119,38,49,50,56,41,138,49,50,56,41,123,100,111,119,151,49,50,55,59,125,125,171,100,111,119,59, -125,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114, -69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101, -107,40,97,46,100,111,119,41,41,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117, -61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,108,97,114,109,115,32,38,32,84,105,109,101,114,115,34,125, -44,34,60,32,66,97,99,107,34,58,40,41,162,108,111,97,100,40,41,44,34,78,101,119,46,46,46,34,58,40,41,162, -115,104,111,119,78,101,119,77,101,110,117,40,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,101, -44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,101,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40, -34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,101,46,116, -105,109,101,114,41,58,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109, -97,116,84,105,109,101,40,101,46,116,41,43,40,101,46,114,112,63,96,32,36,123,100,101,99,111,100,101,68,79,87,40, -101,41,125,96,58,34,34,41,59,109,101,110,117,91,108,97,98,101,108,93,61,123,118,97,108,117,101,58,101,46,111,110, -63,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101,114,79,110,58,105,99,111,110,65,108,97,114,109,79, -110,41,58,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101,114,79,102,102,58,105,99,111,110,65,108,97, -114,109,79,102,102,41,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,101,46, -116,105,109,101,114,63,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,58,115,104,111,119,69,100,105,116, -65,108,97,114,109,77,101,110,117,44,49,48,44,101,44,105,110,100,101,120,41,125,59,125,41,59,10,109,101,110,117,91, -34,65,100,118,97,110,99,101,100,34,93,61,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40, -41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,78,101,119,77,101, -110,117,40,41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,78, -101,119,46,46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117, -40,41,44,34,65,108,97,114,109,34,58,40,41,162,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40, -183,44,183,41,44,34,84,105,109,101,114,34,58,40,41,162,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110, -117,40,183,44,183,41,125,41,59,10,125,170,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,115,101, -108,101,99,116,101,100,65,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61, -97,108,97,114,109,73,110,100,101,120,139,183,59,10,172,97,108,97,114,109,61,114,101,113,117,105,114,101,40,34,115,99, -104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,65,108,97,114,109,40,41,59,10,97,108,97,114,109,46,100, -111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,108,97,114,109,46,100,111, -119,41,59,10,163,40,115,101,108,101,99,116,101,100,65,108,97,114,109,41,123,79,98,106,101,99,116,46,97,115,115,105, -103,110,40,97,108,97,114,109,44,115,101,108,101,99,116,101,100,65,108,97,114,109,41,59,125,10,172,116,105,109,101,61, -114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101, -40,97,108,97,114,109,46,116,41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115, -78,101,119,63,34,78,101,119,32,65,108,97,114,109,34,58,34,69,100,105,116,32,65,108,97,114,109,34,125,44,34,60, -32,66,97,99,107,34,58,40,41,162,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97, -108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108, -111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,34,58,123,118, -97,108,117,101,58,116,105,109,101,46,104,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98, -115,116,114,40,45,50,41,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104, -97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,34,58,123,118,97,108,117,101, -58,116,105,109,101,46,109,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40, -45,50,41,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101, -58,118,162,116,105,109,101,46,109,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,97,108, -97,114,109,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,111,110,61,118,125,44,34,82, -101,112,101,97,116,34,58,123,118,97,108,117,101,58,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,44,111, -110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101, -112,101,97,116,77,101,110,117,44,49,48,48,44,97,108,97,114,109,46,114,112,44,97,108,97,114,109,46,100,111,119,44, -40,114,101,112,101,97,116,44,100,111,119,41,162,123,97,108,97,114,109,46,114,112,61,114,101,112,101,97,116,59,97,108, -97,114,109,46,100,111,119,61,100,111,119,59,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109, -101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105, -109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109, -44,97,108,97,114,109,73,110,100,101,120,41,59,125,41,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105, -114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,108,97,114,109,46,118,105, -98,114,97,116,101,44,118,162,97,108,97,114,109,46,118,105,98,114,97,116,101,61,118,41,44,34,65,117,116,111,32,83, -110,111,111,122,101,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,97,115,44,111,110,99,104,97,110,103,101,58, -118,162,97,108,97,114,109,46,97,115,61,118,125,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97, -105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116, -101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117, -114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,65,108,97,114,109,34,125,41,46,116,104,101, -110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115, -112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97, -100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,97,108,97,114,109,46,116,61,114,101, -113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116, -105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110, -117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,125,41,59,125,59,125,10,69, -46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,65,108,97,114,109,70, -111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,123,10,97, -108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99, -111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,97,108,97,114,109,46,108,97,115,116,61,97,108,97,114,109,46, -116,60,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101, -110,116,84,105,109,101,77,105,108,108,105,115,40,41,63,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41, -58,48,59,10,163,40,97,108,97,114,109,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40, -97,108,97,114,109,41,59,125,164,123,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,108,97, -114,109,59,125,10,125,170,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,10,97,108,97,114,109,115,46,102, +65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89, +65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,41,59,10,174, +105,99,111,110,84,105,109,101,114,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63, +97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43, +65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65, +65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52, +99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65, +80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103, +89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53, +72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65, +102,52,65,65,72,103,61,34,41,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104, +101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,104,97,110,100,108,101,70,105,114,115,116,68,97, +121,79,102,87,101,101,107,40,100,111,119,41,123,163,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,138,49,41, +123,163,40,40,100,111,119,38,49,41,138,49,41,123,100,111,119,150,49,50,55,59,125,164,163,40,40,100,111,119,38,49, +50,56,41,138,49,50,56,41,123,100,111,119,151,49,50,55,59,125,125,171,100,111,119,59,125,10,97,108,97,114,109,115, +46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97, +46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41, +41,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117,61,123,34,34,58,123,34,116, +105,116,108,101,34,58,34,65,108,97,114,109,115,32,38,32,84,105,109,101,114,115,34,125,44,34,60,32,66,97,99,107, +34,58,40,41,162,108,111,97,100,40,41,44,34,78,101,119,46,46,46,34,58,40,41,162,115,104,111,119,78,101,119,77, +101,110,117,40,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,101,44,105,110,100,101,120,41,162, +123,172,108,97,98,101,108,61,101,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,101,46,116,105,109,101,114,41,58,114,101, +113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,84,105,109,101,40,101, +46,116,41,43,40,101,46,114,112,63,96,32,36,123,100,101,99,111,100,101,68,79,87,40,101,41,125,96,58,34,34,41, +59,109,101,110,117,91,108,97,98,101,108,93,61,123,118,97,108,117,101,58,101,46,111,110,63,40,101,46,116,105,109,101, +114,63,105,99,111,110,84,105,109,101,114,79,110,58,105,99,111,110,65,108,97,114,109,79,110,41,58,40,101,46,116,105, +109,101,114,63,105,99,111,110,84,105,109,101,114,79,102,102,58,105,99,111,110,65,108,97,114,109,79,102,102,41,44,111, +110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,101,46,116,105,109,101,114,63,115,104, +111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,58,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110, +117,44,49,48,44,101,44,105,110,100,101,120,41,125,59,125,41,59,10,109,101,110,117,91,34,65,100,118,97,110,99,101, +100,34,93,61,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,10,69,46,115,104,111, +119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,78,101,119,77,101,110,117,40,41,123,10,69,46, +115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,78,101,119,46,46,46,34,125,44, +34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,65,108,97,114, +109,34,58,40,41,162,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,183,44,183,41,44,34,84,105, +109,101,114,34,58,40,41,162,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,183,44,183,41,125,41, +59,10,125,170,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,115,101,108,101,99,116,101,100,65,108, +97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,97,108,97,114,109,73,110,100, +101,120,139,183,59,10,172,97,108,97,114,109,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,110,101, +119,68,101,102,97,117,108,116,65,108,97,114,109,40,41,59,10,97,108,97,114,109,46,100,111,119,61,104,97,110,100,108, +101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,108,97,114,109,46,100,111,119,41,59,10,163,40,115,101, +108,101,99,116,101,100,65,108,97,114,109,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,108,97,114,109, +44,115,101,108,101,99,116,101,100,65,108,97,114,109,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40, +34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116, +41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119, +32,65,108,97,114,109,34,58,34,69,100,105,116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40, +41,162,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97, +114,109,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104, +111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,34,58,123,118,97,108,117,101,58,116,105,109, +101,46,104,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44, +109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116, +105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,34,58,123,118,97,108,117,101,58,116,105,109,101,46,109,44, +102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44,109,105,110,58, +48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46, +109,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,111,110,44,111, +110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,111,110,61,118,125,44,34,82,101,112,101,97,116,34,58,123, +118,97,108,117,101,58,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,44,111,110,99,104,97,110,103,101,58, +40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117, +44,49,48,48,44,97,108,97,114,109,46,114,112,44,97,108,97,114,109,46,100,111,119,44,40,114,101,112,101,97,116,44, +100,111,119,41,162,123,97,108,97,114,109,46,114,112,61,114,101,112,101,97,116,59,97,108,97,114,109,46,100,111,119,61, +100,111,119,59,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, +41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104, +111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110, +100,101,120,41,59,125,41,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122, +95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,108,97,114,109,46,118,105,98,114,97,116,101,44,118,162, +97,108,97,114,109,46,118,105,98,114,97,116,101,61,118,41,44,34,65,117,116,111,32,83,110,111,111,122,101,34,58,123, +118,97,108,117,101,58,97,108,97,114,109,46,97,115,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46, +97,115,61,118,125,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41, +125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,40,41,162,123, +69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105, +116,108,101,58,34,68,101,108,101,116,101,32,65,108,97,114,109,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105, +114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108, +97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119, +77,97,105,110,77,101,110,117,40,41,59,125,164,123,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116, +105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116, +84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97, +114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110, +117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97, +108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,123,10,97,108,97,114,109,46,116,61,114, +101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40, +116,105,109,101,41,59,10,97,108,97,114,109,46,108,97,115,116,61,97,108,97,114,109,46,116,60,114,101,113,117,105,114, +101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105, +108,108,105,115,40,41,63,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41,58,48,59,10,163,40,97,108, +97,114,109,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40,97,108,97,114,109,41,59,125, +164,123,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,108,97,114,109,59,125,10,125,170,115, +97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162, +101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108, +101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59,10,114,101,113,117,105,114,101, +40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,10,114,101,113, +117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,10,97,108,97,114,109,115,46,102, 105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100, 111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59, -10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114, -109,115,41,59,10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,10, -97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97, -99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40, -97,46,100,111,119,41,41,59,10,125,170,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,123,10,171,97,108, -97,114,109,46,114,112,10,63,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,10,46,100, -111,119,115,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,50,41,10,46,109,97,112,40,40,100,97,121,44, -105,110,100,101,120,41,162,97,108,97,114,109,46,100,111,119,38,40,49,143,40,105,110,100,101,120,43,102,105,114,115,116, -68,97,121,79,102,87,101,101,107,41,41,63,100,97,121,58,34,95,34,41,10,46,106,111,105,110,40,34,34,41,10,46, -116,111,76,111,119,101,114,67,97,115,101,40,41,10,58,34,79,110,99,101,34,10,125,170,115,104,111,119,69,100,105,116, -82,101,112,101,97,116,77,101,110,117,40,114,101,112,101,97,116,44,100,111,119,44,100,111,119,67,104,97,110,103,101,67, -97,108,108,98,97,99,107,41,123,10,172,111,114,105,103,105,110,97,108,82,101,112,101,97,116,61,114,101,112,101,97,116, -59,10,172,111,114,105,103,105,110,97,108,68,111,119,61,100,111,119,59,10,172,105,115,67,117,115,116,111,109,61,114,101, -112,101,97,116,158,100,111,119,140,87,79,82,75,68,65,89,83,158,100,111,119,140,87,69,69,75,69,78,68,158,100,111, -119,140,69,86,69,82,89,95,68,65,89,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58, -34,82,101,112,101,97,116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,100,111,119,67, -104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97,116,44,100,111,119,41,44,34,79,110,99,101,34, -58,123,118,97,108,117,101,58,33,114,101,112,101,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67, -104,97,110,103,101,67,97,108,108,98,97,99,107,40,181,44,69,86,69,82,89,95,68,65,89,41,125,44,34,87,111,114, -107,100,97,121,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,79,82,75,68,65,89, -83,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40, -180,44,87,79,82,75,68,65,89,83,41,125,44,34,87,101,101,107,101,110,100,115,34,58,123,118,97,108,117,101,58,114, -101,112,101,97,116,158,100,111,119,138,87,69,69,75,69,78,68,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111, -119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,69,69,75,69,78,68,41,125,44,34,69,118,101, -114,121,32,68,97,121,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,69,86,69,82,89,95, -68,65,89,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99, -107,40,180,44,69,86,69,82,89,95,68,65,89,41,125,44,34,67,117,115,116,111,109,34,58,123,118,97,108,117,101,58, -105,115,67,117,115,116,111,109,63,100,101,99,111,100,101,68,79,87,40,123,114,112,58,180,44,100,111,119,58,100,111,119, -125,41,58,181,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, -67,117,115,116,111,109,68,97,121,115,77,101,110,117,44,49,48,44,105,115,67,117,115,116,111,109,63,100,111,119,58,69, -86,69,82,89,95,68,65,89,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105, -110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,41,125,125,59,10,69,46,115,104,111,119, -77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117, -40,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82, -101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,41,123,10,174,109,101,110,117,61,123,34,34,58,123,34, -116,105,116,108,101,34,58,34,67,117,115,116,111,109,32,68,97,121,115,34,125,44,34,60,32,66,97,99,107,34,58,40, -41,162,123,172,114,101,112,101,97,116,61,100,111,119,62,48,59,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97, -99,107,40,114,101,112,101,97,116,44,114,101,112,101,97,116,63,100,111,119,58,69,86,69,82,89,95,68,65,89,41,125, -125,59,10,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,115,40,102,105, -114,115,116,68,97,121,79,102,87,101,101,107,41,46,102,111,114,69,97,99,104,40,40,100,97,121,44,105,41,162,123,109, -101,110,117,91,100,97,121,93,61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,40,105,43,102,105,114, -115,116,68,97,121,79,102,87,101,101,107,41,41,41,44,111,110,99,104,97,110,103,101,58,118,162,118,63,40,100,111,119, -159,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,58,40,100,111,119,157,126,40,49,143, -40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,41,125,59,125,41,59,10,109,101,110,117,91,34, -67,97,110,99,101,108,34,93,61,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82, -101,112,101,97,116,77,101,110,117,44,49,48,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103, -105,110,97,108,68,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,10,69,46,115,104,111, -119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117, -40,115,101,108,101,99,116,101,100,84,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,123,10,172,105,115,78, -101,119,61,116,105,109,101,114,73,110,100,101,120,139,183,59,10,172,116,105,109,101,114,61,114,101,113,117,105,114,101,40, -34,115,99,104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,40,41,59,10,163,40,115,101, -108,101,99,116,101,100,84,105,109,101,114,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,116,105,109,101,114, -44,115,101,108,101,99,116,101,100,84,105,109,101,114,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40, -34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,116,105,109,101,114,46,116, -105,109,101,114,41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63, -34,78,101,119,32,84,105,109,101,114,34,58,34,69,100,105,116,32,84,105,109,101,114,34,125,44,34,60,32,66,97,99, -107,34,58,40,41,162,123,112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114, -44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40, -41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,115,34,58,123,118,97,108,117, -101,58,116,105,109,101,46,104,44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99, -104,97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,115,34,58,123,118,97,108, -117,101,58,116,105,109,101,46,109,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110, -99,104,97,110,103,101,58,118,162,116,105,109,101,46,109,61,118,125,44,34,83,101,99,111,110,100,115,34,58,123,118,97, -108,117,101,58,116,105,109,101,46,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,115,116,101,112,58,49,44,119, -114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,115,61,118,125,44,34,69,110,97,98, -108,101,100,34,58,123,118,97,108,117,101,58,116,105,109,101,114,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162, -116,105,109,101,114,46,111,110,61,118,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98, -117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,116,105,109,101,114,46,118,105,98,114,97,116,101, -44,118,162,116,105,109,101,114,46,118,105,98,114,97,116,101,61,118,41,44,34,67,97,110,99,101,108,34,58,40,41,162, -115,104,111,119,77,97,105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91, -34,68,101,108,101,116,101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32, -121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,84,105,109,101,114,34, -125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108, -97,114,109,115,46,115,112,108,105,99,101,40,116,105,109,101,114,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110, -100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,116,105,109,101, -114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110, -99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100, -105,116,84,105,109,101,114,77,101,110,117,44,49,48,44,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41, -125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112, -97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120, -44,116,105,109,101,41,123,10,116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109, -101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,116,105,109,101, -114,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114, -114,101,110,116,84,105,109,101,77,105,108,108,105,115,40,41,43,116,105,109,101,114,46,116,105,109,101,114,59,10,116,105, -109,101,114,46,108,97,115,116,61,48,59,10,163,40,116,105,109,101,114,73,110,100,101,120,139,183,41,123,97,108,97,114, -109,115,46,112,117,115,104,40,116,105,109,101,114,41,59,125,164,123,97,108,97,114,109,115,91,116,105,109,101,114,73,110, -100,101,120,93,61,116,105,109,101,114,59,125,10,125,170,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40, -41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,100,118,97, -110,99,101,100,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40, -41,44,34,83,99,104,101,100,117,108,101,114,32,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114, -101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,115,101, -116,116,105,110,103,115,46,106,115,34,41,41,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117, -40,41,41,44,34,69,110,97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,180,41, -44,34,68,105,115,97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,181,41,44,34, -68,101,108,101,116,101,32,65,108,108,34,58,40,41,162,100,101,108,101,116,101,65,108,108,40,41,125,41,59,10,125,170, -101,110,97,98,108,101,65,108,108,40,111,110,41,123,10,163,40,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101, -162,101,46,111,110,138,33,111,110,41,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116, -40,111,110,63,34,78,111,116,104,105,110,103,32,116,111,32,69,110,97,98,108,101,34,58,34,78,111,116,104,105,110,103, -32,116,111,32,68,105,115,97,98,108,101,34,44,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105, -115,97,98,108,101,32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100, -77,101,110,117,40,41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117, -32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34, -68,105,115,97,98,108,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163, -40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44, -105,41,162,123,97,108,97,114,109,46,111,110,61,111,110,59,163,40,111,110,41,123,163,40,97,108,97,114,109,46,116,105, -109,101,114,41,123,112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105, -44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109, -101,40,97,108,97,114,109,46,116,105,109,101,114,41,41,125,164,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111, -114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108, -115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,41,125,125,125,41,59,115,97,118, -101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115, -104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,170,100,101,108,101,116,101, -65,108,108,40,41,123,10,163,40,97,108,97,114,109,115,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119, -65,108,101,114,116,40,34,78,111,116,104,105,110,103,32,116,111,32,100,101,108,101,116,101,34,44,34,68,101,108,101,116, -101,32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117, -40,41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114, -101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40, -99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,61,91,93,59,115, -97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164, -123,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,115,104,111,119,77, -97,105,110,77,101,110,117,40,41,59,255,255,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,17,17,17,102,102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17, -102,102,102,17,17,102,102,102,17,17,17,17,17,102,102,102,102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102, -97,17,17,17,17,22,102,102,102,102,17,17,17,17,17,102,204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102, -102,97,17,17,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204, -204,204,204,204,204,204,204,204,204,193,17,17,17,17,22,102,102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204, -204,204,65,17,17,17,17,102,102,17,17,17,17,76,204,204,67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102, -102,17,17,17,20,204,204,195,255,255,255,255,255,255,255,255,60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63, -255,255,255,240,15,255,255,255,243,76,204,196,17,17,17,102,102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255, -255,244,204,204,17,17,17,102,102,17,17,108,204,196,255,255,255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102, -102,97,22,204,204,195,255,255,255,255,255,240,15,255,255,255,255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255, -255,255,255,240,15,255,255,255,255,255,243,204,204,102,22,102,102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255, -255,255,255,76,204,198,102,102,102,102,108,204,195,255,255,255,255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102, -102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255, -255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255, -255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102, -102,102,204,204,255,255,255,255,255,255,255,48,3,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255, -255,255,255,5,80,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255, -255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102, -102,102,204,204,63,255,255,255,255,255,52,63,48,0,63,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255, -255,243,67,255,243,0,3,255,255,255,255,243,204,204,102,102,102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63, -255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102, -102,102,108,204,195,255,255,255,52,63,255,255,255,255,48,47,255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243, -67,255,255,255,255,255,243,255,255,255,255,76,204,198,102,102,102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255, -255,255,243,204,204,102,102,102,102,102,102,204,204,195,255,243,255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102, -102,102,102,108,204,196,255,255,255,255,255,255,255,255,255,255,255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255, -255,255,255,255,255,255,255,255,255,244,204,204,102,102,102,102,102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255, -243,76,204,204,102,102,102,102,102,102,102,102,108,204,204,195,255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102, -102,102,102,102,102,204,204,204,67,255,255,255,255,255,255,52,204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204, -204,68,51,255,255,51,68,204,204,204,65,102,102,102,102,102,102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204, -204,193,17,22,102,102,102,102,102,102,102,102,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102, -102,102,102,97,17,17,102,102,204,204,204,204,204,204,204,204,102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102, -102,102,204,204,204,204,102,102,102,102,97,17,22,102,102,102,102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,17,22,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +10,125,170,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,123,10,171,97,108,97,114,109,46,114,112,10,63, +114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,10,46,100,111,119,115,40,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,44,50,41,10,46,109,97,112,40,40,100,97,121,44,105,110,100,101,120,41,162,97, +108,97,114,109,46,100,111,119,38,40,49,143,40,105,110,100,101,120,43,102,105,114,115,116,68,97,121,79,102,87,101,101, +107,41,41,63,100,97,121,58,34,95,34,41,10,46,106,111,105,110,40,34,34,41,10,46,116,111,76,111,119,101,114,67, +97,115,101,40,41,10,58,34,79,110,99,101,34,10,125,170,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101, +110,117,40,114,101,112,101,97,116,44,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41, +123,10,172,111,114,105,103,105,110,97,108,82,101,112,101,97,116,61,114,101,112,101,97,116,59,10,172,111,114,105,103,105, +110,97,108,68,111,119,61,100,111,119,59,10,172,105,115,67,117,115,116,111,109,61,114,101,112,101,97,116,158,100,111,119, +140,87,79,82,75,68,65,89,83,158,100,111,119,140,87,69,69,75,69,78,68,158,100,111,119,140,69,86,69,82,89,95, +68,65,89,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,82,101,112,101,97,116,32, +65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, +108,98,97,99,107,40,114,101,112,101,97,116,44,100,111,119,41,44,34,79,110,99,101,34,58,123,118,97,108,117,101,58, +33,114,101,112,101,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, +108,98,97,99,107,40,181,44,69,86,69,82,89,95,68,65,89,41,125,44,34,87,111,114,107,100,97,121,115,34,58,123, +118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,79,82,75,68,65,89,83,44,111,110,99,104,97,110, +103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,79,82,75,68,65, +89,83,41,125,44,34,87,101,101,107,101,110,100,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111, +119,138,87,69,69,75,69,78,68,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67, +97,108,108,98,97,99,107,40,180,44,87,69,69,75,69,78,68,41,125,44,34,69,118,101,114,121,32,68,97,121,34,58, +123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,69,86,69,82,89,95,68,65,89,44,111,110,99,104, +97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,69,86,69,82, +89,95,68,65,89,41,125,44,34,67,117,115,116,111,109,34,58,123,118,97,108,117,101,58,105,115,67,117,115,116,111,109, +63,100,101,99,111,100,101,68,79,87,40,123,114,112,58,180,44,100,111,119,58,100,111,119,125,41,58,181,44,111,110,99, +104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,67,117,115,116,111,109,68,97, +121,115,77,101,110,117,44,49,48,44,105,115,67,117,115,116,111,109,63,100,111,119,58,69,86,69,82,89,95,68,65,89, +44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97, +116,44,111,114,105,103,105,110,97,108,68,111,119,41,125,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110, +117,41,59,10,125,170,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117,40,100,111,119,44,100,111,119, +67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114, +105,103,105,110,97,108,68,111,119,41,123,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34, +67,117,115,116,111,109,32,68,97,121,115,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,172,114,101,112,101, +97,116,61,100,111,119,62,48,59,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97, +116,44,114,101,112,101,97,116,63,100,111,119,58,69,86,69,82,89,95,68,65,89,41,125,125,59,10,114,101,113,117,105, +114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,115,40,102,105,114,115,116,68,97,121,79,102, +87,101,101,107,41,46,102,111,114,69,97,99,104,40,40,100,97,121,44,105,41,162,123,109,101,110,117,91,100,97,121,93, +61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87, +101,101,107,41,41,41,44,111,110,99,104,97,110,103,101,58,118,162,118,63,40,100,111,119,159,49,143,40,105,43,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,41,41,58,40,100,111,119,157,126,40,49,143,40,105,43,102,105,114,115,116, +68,97,121,79,102,87,101,101,107,41,41,41,125,59,125,41,59,10,109,101,110,117,91,34,67,97,110,99,101,108,34,93, +61,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110, +117,44,49,48,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,44, +100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,10,69,46,115,104,111,119,77,101,110,117,40,109,101, +110,117,41,59,10,125,170,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,115,101,108,101,99,116,101, +100,84,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,116,105,109,101,114, +73,110,100,101,120,139,183,59,10,172,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41, +46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,40,41,59,10,163,40,115,101,108,101,99,116,101,100,84,105, +109,101,114,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,116,105,109,101,114,44,115,101,108,101,99,116,101, +100,84,105,109,101,114,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,116,105,109,101,114,46,116,105,109,101,114,41,59,10,174, +109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119,32,84,105,109, +101,114,34,58,34,69,100,105,116,32,84,105,109,101,114,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,112, +114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110, +100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97, +105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,104, +44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162, +116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46, +109,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118, +162,116,105,109,101,46,109,61,118,125,44,34,83,101,99,111,110,100,115,34,58,123,118,97,108,117,101,58,116,105,109,101, +46,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110, +99,104,97,110,103,101,58,118,162,116,105,109,101,46,115,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97, +108,117,101,58,116,105,109,101,114,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46,111,110, +61,118,125,44,34,68,101,108,101,116,101,32,65,102,116,101,114,32,69,120,112,105,114,97,116,105,111,110,34,58,123,118, +97,108,117,101,58,116,105,109,101,114,46,100,101,108,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46, +100,101,108,61,118,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109, +101,110,117,34,41,46,112,97,116,116,101,114,110,40,116,105,109,101,114,46,118,105,98,114,97,116,101,44,118,162,116,105, +109,101,114,46,118,105,98,114,97,116,101,61,118,41,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77, +97,105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101, +116,101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115, +117,114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,84,105,109,101,114,34,125,41,46,116,104, +101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46, +115,112,108,105,99,101,40,116,105,109,101,114,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111, +97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,116,105,109,101,114,46,116,105,109, +101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84, +105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,84,105,109, +101,114,77,101,110,117,44,49,48,44,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,125,125,41,59,125, +59,125,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,84,105, +109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101, +41,123,10,116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105, +108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,116,105,109,101,114,46,116,61,114, +101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84, +105,109,101,77,105,108,108,105,115,40,41,43,116,105,109,101,114,46,116,105,109,101,114,59,10,116,105,109,101,114,46,108, +97,115,116,61,48,59,10,163,40,116,105,109,101,114,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117, +115,104,40,116,105,109,101,114,41,59,125,164,123,97,108,97,114,109,115,91,116,105,109,101,114,73,110,100,101,120,93,61, +116,105,109,101,114,59,125,10,125,170,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,123,10,69,46, +115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,100,118,97,110,99,101,100,34, +125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,83,99, +104,101,100,117,108,101,114,32,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114,101,113,117,105,114, +101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103, +115,46,106,115,34,41,41,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,44,34, +69,110,97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,180,41,44,34,68,105,115, +97,98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,181,41,44,34,68,101,108,101,116, +101,32,65,108,108,34,58,40,41,162,100,101,108,101,116,101,65,108,108,40,41,125,41,59,10,125,170,101,110,97,98,108, +101,65,108,108,40,111,110,41,123,10,163,40,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,111,110, +138,33,111,110,41,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,111,110,63,34, +78,111,116,104,105,110,103,32,116,111,32,69,110,97,98,108,101,34,58,34,78,111,116,104,105,110,103,32,116,111,32,68, +105,115,97,98,108,101,34,44,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101, +32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40, +41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101, +63,34,44,123,116,105,116,108,101,58,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98, +108,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102, +105,114,109,41,123,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,41,162,123,97, +108,97,114,109,46,111,110,61,111,110,59,163,40,111,110,41,123,163,40,97,108,97,114,109,46,116,105,109,101,114,41,123, +112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117, +105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97, +114,109,46,116,105,109,101,114,41,41,125,164,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101, +40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100, +101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,41,125,125,125,41,59,115,97,118,101,65,110,100,82, +101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100, +118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,170,100,101,108,101,116,101,65,108,108,40,41, +123,10,163,40,97,108,97,114,109,115,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116, +40,34,78,111,116,104,105,110,103,32,116,111,32,100,101,108,101,116,101,34,44,34,68,101,108,101,116,101,32,65,108,108, +34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59,125, +164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123, +116,105,116,108,101,58,34,68,101,108,101,116,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105, +114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,61,91,93,59,115,97,118,101,65,110, +100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119, +65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,115,104,111,119,77,97,105,110,77,101, +110,117,40,41,59,255,255,255,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +17,17,17,102,102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17, +17,102,102,102,17,17,17,17,17,102,102,102,102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17, +17,22,102,102,102,102,17,17,17,17,17,102,204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17, +17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204, +204,204,204,204,204,193,17,17,17,17,22,102,102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17, +17,17,17,102,102,17,17,17,17,76,204,204,67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17, +20,204,204,195,255,255,255,255,255,255,255,255,60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240, +15,255,255,255,243,76,204,196,17,17,17,102,102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204, +17,17,17,102,102,17,17,108,204,196,255,255,255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204, +204,195,255,255,255,255,255,240,15,255,255,255,255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240, +15,255,255,255,255,255,243,204,204,102,22,102,102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76, +204,198,102,102,102,102,108,204,195,255,255,255,255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204, +79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240, +15,255,255,255,255,255,255,244,204,198,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243, +204,204,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204, +255,255,255,255,255,255,255,48,3,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5, +80,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255, +204,204,102,102,102,102,204,204,255,255,255,255,255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204, +63,255,255,255,255,255,52,63,48,0,63,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255, +243,0,3,255,255,255,255,243,204,204,102,102,102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244, +204,198,102,102,102,102,108,204,79,255,255,255,243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204, +195,255,255,255,52,63,255,255,255,255,48,47,255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255, +255,255,243,255,255,255,255,76,204,198,102,102,102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204, +204,102,102,102,102,102,102,204,204,195,255,243,255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108, +204,196,255,255,255,255,255,255,255,255,255,255,255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255, +255,255,255,255,255,244,204,204,102,102,102,102,102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204, +102,102,102,102,102,102,102,102,108,204,204,195,255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102, +102,204,204,204,67,255,255,255,255,255,255,52,204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255, +255,51,68,204,204,204,65,102,102,102,102,102,102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22, +102,102,102,102,102,102,102,102,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97, +17,17,102,102,204,204,204,204,204,204,204,204,102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204, +204,204,102,102,102,102,97,17,22,102,102,102,102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17, +22,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,95,1,0,0,97,108,97,114,109,46,119,105,100,46,106,115, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93, -61,123,97,114,101,97,58,34,116,108,34,44,119,105,100,116,104,58,48,44,100,114,97,119,58,170,40,41,123,163,40,175, -46,119,105,100,116,104,41,103,46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40, -34,71,66,103,66,65,65,65,65,65,65,65,65,65,66,103,65,68,104,104,119,68,68,119,119,71,80,56,89,71,102,43, -89,77,102,43,77,77,47,47,77,77,47,47,77,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47, -65,65,47,47,65,66,47,47,103,68,47,47,119,68,47,47,119,65,65,65,65,65,68,119,65,65,66,103,65,65,65,65, -65,65,65,65,65,34,41,44,175,46,120,44,175,46,121,41,59,125,44,114,101,108,111,97,100,58,170,40,41,123,87,73, -68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,119,105,100,116,104,61,40,114,101,113,117,105,114,101,40,39,83, -116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49, -41,160,91,93,41,46,115,111,109,101,40,97,108,97,114,109,162,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109, -46,104,105,100,100,101,110,141,181,41,41,63,50,52,58,48,59,125,125,59,10,87,73,68,71,69,84,83,91,34,97,108, -97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,255,171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110, -97,109,101,34,58,34,65,108,97,114,109,115,34,44,34,115,114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106, -115,34,44,34,105,99,111,110,34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58, -34,48,46,51,49,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116, -34,44,34,102,105,108,101,115,34,58,34,97,108,97,114,109,46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46, -106,115,44,97,108,97,114,109,46,105,109,103,44,97,108,97,114,109,46,119,105,100,46,106,115,34,125,255, +102,102,102,102,102,102,102,102,102,102,102,102,95,1,0,0,97,108,97,114,109,46,119,105,100,46,106,115,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,61,123,97,114, +101,97,58,34,116,108,34,44,119,105,100,116,104,58,48,44,100,114,97,119,58,170,40,41,123,163,40,175,46,119,105,100, +116,104,41,103,46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,71,66,103, +66,65,65,65,65,65,65,65,65,65,66,103,65,68,104,104,119,68,68,119,119,71,80,56,89,71,102,43,89,77,102,43, +77,77,47,47,77,77,47,47,77,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47, +65,66,47,47,103,68,47,47,119,68,47,47,119,65,65,65,65,65,68,119,65,65,66,103,65,65,65,65,65,65,65,65, +65,34,41,44,175,46,120,44,175,46,121,41,59,125,44,114,101,108,111,97,100,58,170,40,41,123,87,73,68,71,69,84, +83,91,34,97,108,97,114,109,34,93,46,119,105,100,116,104,61,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97, +103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49,41,160,91,93, +41,46,115,111,109,101,40,97,108,97,114,109,162,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109,46,104,105,100, +100,101,110,141,180,41,41,63,50,52,58,48,59,125,125,59,10,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34, +93,46,114,101,108,111,97,100,40,41,59,255,171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110,97,109,101,34, +58,34,65,108,97,114,109,115,34,44,34,115,114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106,115,34,44,34, +105,99,111,110,34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,51, +50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116,34,44,34,102, +105,108,101,115,34,58,34,97,108,97,114,109,46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46,106,115,44,97, +108,97,114,109,46,105,109,103,44,97,108,97,114,109,46,119,105,100,46,106,115,34,125,255, }; diff --git a/libs/banglejs/banglejs2_storage_default.c b/libs/banglejs/banglejs2_storage_default.c index 33341f7a48..947ea40d14 100644 --- a/libs/banglejs/banglejs2_storage_default.c +++ b/libs/banglejs/banglejs2_storage_default.c @@ -1,7 +1,7 @@ // Initial storage contents for Bangle.js 2.0 // Generated by BangleApps/bin/build_bangles_c.js -const int jsfStorageInitialContentLength = 93140; +const int jsfStorageInitialContentLength = 104588; const char jsfStorageInitialContents[] = { 48,0,0,0,46,98,111,111,116,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 10,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98, @@ -338,7 +338,7 @@ const char jsfStorageInitialContents[] = { 101,100,162,123,163,40,108,111,99,107,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,108, 111,99,107,84,105,109,101,111,117,116,41,59,108,111,99,107,84,105,109,101,111,117,116,61,183,59,163,40,108,111,99,107, 101,100,41,108,111,99,107,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,95,162,108,111,97,100, -40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,29,3,0,0,108,97,117,110,99,104,46,115,101,116,116,105, +40,41,44,49,48,48,48,48,41,59,125,41,59,255,255,255,241,2,0,0,108,97,117,110,99,104,46,115,101,116,116,105, 110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, 103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,104,111,119,67,108,111,99,107,115,58,180,44,102, 117,108,108,115,99,114,101,101,110,58,181,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, @@ -358,2560 +358,2918 @@ const char jsfStorageInitialContents[] = { 114,115,105,122,101,160,49,48,44,109,105,110,58,49,48,44,109,97,120,58,50,48,44,115,116,101,112,58,49,44,119,114, 97,112,58,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,118,101,99,116,111,114,115, 105,122,101,34,44,109,41,125,125,44,34,83,104,111,119,32,67,108,111,99,107,115,34,58,123,118,97,108,117,101,58,115, -101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,102,111,114,109,97,116,58,118,162,118,63, -34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,115, -104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115,99,114,101,101,110,34,58,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101,110,138,180,44,102,111,114,109,97,116, -58,118,162,118,63,34,89,101,115,34,58,34,78,111,34,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97, -118,101,40,34,102,117,108,108,115,99,114,101,101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117, -40,97,112,112,77,101,110,117,41,59,125,41,59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34, -110,97,109,101,34,58,34,76,97,117,110,99,104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34, -44,34,115,114,99,34,58,34,108,97,117,110,99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101, -114,34,58,45,49,48,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,51,34,44,34,116,97,103,115,34,58,34, -116,111,111,108,44,115,121,115,116,101,109,44,108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108, -97,117,110,99,104,46,105,110,102,111,44,108,97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46, -115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110, -34,125,255,255,163,52,0,0,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0, -0,0,0,0,10,174,83,69,84,84,73,78,71,83,70,73,76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111, -110,34,59,10,71,114,97,112,104,105,99,115,46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110, -116,111,110,61,170,40,115,99,97,108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111, -98,40,34,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102, -47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65, +101,116,116,105,110,103,115,46,115,104,111,119,67,108,111,99,107,115,138,180,44,111,110,99,104,97,110,103,101,58,40,109, +41,162,123,115,97,118,101,40,34,115,104,111,119,67,108,111,99,107,115,34,44,109,41,125,125,44,34,70,117,108,108,115, +99,114,101,101,110,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,102,117,108,108,115,99,114,101,101, +110,138,180,44,111,110,99,104,97,110,103,101,58,40,109,41,162,123,115,97,118,101,40,34,102,117,108,108,115,99,114,101, +101,110,34,44,109,41,125,125,125,59,69,46,115,104,111,119,77,101,110,117,40,97,112,112,77,101,110,117,41,59,125,41, +59,255,255,255,210,0,0,0,108,97,117,110,99,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,108,97,117,110,99,104,34,44,34,110,97,109,101,34,58,34,76,97,117,110,99, +104,101,114,34,44,34,116,121,112,101,34,58,34,108,97,117,110,99,104,34,44,34,115,114,99,34,58,34,108,97,117,110, +99,104,46,97,112,112,46,106,115,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,49,48,44,34,118,101,114,115, +105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44, +108,97,117,110,99,104,101,114,34,44,34,102,105,108,101,115,34,58,34,108,97,117,110,99,104,46,105,110,102,111,44,108, +97,117,110,99,104,46,97,112,112,46,106,115,44,108,97,117,110,99,104,46,115,101,116,116,105,110,103,115,46,106,115,34, +44,34,100,97,116,97,34,58,34,108,97,117,110,99,104,46,106,115,111,110,34,125,255,255,163,52,0,0,97,110,116,111, +110,99,108,107,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,10,174,83,69,84,84,73,78, +71,83,70,73,76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,59,10,71,114,97,112,104,105,99,115, +46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110,116,111,110,61,170,40,115,99,97,108,101,41, +123,103,46,115,101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111,98,40,34,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65, 65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65, 102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65, 65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65, -65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65, +65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65, +65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,103,65,65,65,65,65,65, +65,65,65,65,65,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,72,47,47, +103,65,65,65,65,65,65,65,65,66,47,47,47,103,65,65,65,65,65,65,65,65,102,47,47,47,103,65,65,65,65,65, +65,65,80,47,47,47,47,103,65,65,65,65,65,65,68,47,47,47,47,47,103,65,65,65,65,65,65,47,47,47,47,47, +47,103,65,65,65,65,65,80,47,47,47,47,47,47,103,65,65,65,65,72,47,47,47,47,47,47,47,103,65,65,65,66, +47,47,47,47,47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47,47,103,65,65,80,47,47,47,47,47,47,47, +47,47,103,65,68,47,47,47,47,47,47,47,47,47,47,65,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47,47, +47,47,47,47,47,47,47,52,65,65,65,47,47,47,47,47,47,47,47,43,65,65,65,65,47,47,47,47,47,47,47,47, +103,65,65,65,65,47,47,47,47,47,47,47,119,65,65,65,65,65,47,47,47,47,47,47,56,65,65,65,65,65,65,47, +47,47,47,47,47,65,65,65,65,65,65,65,47,47,47,47,47,103,65,65,65,65,65,65,65,47,47,47,47,52,65,65, +65,65,65,65,65,65,47,47,47,43,65,65,65,65,65,65,65,65,65,47,47,47,103,65,65,65,65,65,65,65,65,65, +47,47,119,65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,65,65,65,47,65,65,65,65,65, +65,65,65,65,65,65,65,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,65,65,65,65,65,66,47,47,47, +47,47,47,47,56,65,65,65,65,72,47,47,47,47,47,47,47,47,65,65,65,65,102,47,47,47,47,47,47,47,47,119, +65,65,65,47,47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,68,47,47,47, +47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47, +47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47, +47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47, +47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,56,65,65,65,65,65,66,47,47,52,65,47,47, +119,65,65,65,65,65,65,102,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,103,65,65,65,65,65, +65,80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,119,65,65,65,65,65,65,102,47,52,65,47, +47,47,47,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47, +47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65, +80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47, +47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,68,47,47,47,47,47,47,47,47,47,43,65, +65,66,47,47,47,47,47,47,47,47,47,56,65,65,65,47,47,47,47,47,47,47,47,47,52,65,65,65,80,47,47,47, +47,47,47,47,47,103,65,65,65,68,47,47,47,47,47,47,47,43,65,65,65,65,65,102,47,47,47,47,47,47,52,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,68,103,65,65,65,65,65,65,65,65,65,65,65,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103, -65,65,65,65,65,65,65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66,47,47,47,103,65,65,65,65,65,65, -65,65,102,47,47,47,103,65,65,65,65,65,65,65,80,47,47,47,47,103,65,65,65,65,65,65,68,47,47,47,47,47, -103,65,65,65,65,65,65,47,47,47,47,47,47,103,65,65,65,65,65,80,47,47,47,47,47,47,103,65,65,65,65,72, -47,47,47,47,47,47,47,103,65,65,65,66,47,47,47,47,47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47, -47,103,65,65,80,47,47,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,47,47,47,47,65,65,47,47,47, -47,47,47,47,47,47,47,103,65,65,47,47,47,47,47,47,47,47,47,52,65,65,65,47,47,47,47,47,47,47,47,43, -65,65,65,65,47,47,47,47,47,47,47,47,103,65,65,65,65,47,47,47,47,47,47,47,119,65,65,65,65,65,47,47, -47,47,47,47,56,65,65,65,65,65,65,47,47,47,47,47,47,65,65,65,65,65,65,65,47,47,47,47,47,103,65,65, -65,65,65,65,65,47,47,47,47,52,65,65,65,65,65,65,65,65,47,47,47,43,65,65,65,65,65,65,65,65,65,47, -47,47,103,65,65,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65, -65,65,65,65,65,65,47,65,65,65,65,65,65,65,65,65,65,65,65,103,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47, -47,47,47,65,65,65,65,65,66,47,47,47,47,47,47,47,56,65,65,65,65,72,47,47,47,47,47,47,47,47,65,65, -65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47, -47,47,47,47,47,56,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47, -65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47, -47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, -47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,56, -65,65,65,65,65,66,47,47,52,65,47,47,119,65,65,65,65,65,65,102,47,52,65,47,47,103,65,65,65,65,65,65, -80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47,103,65,65,65,65,65,65,80,47,52,65,47,47, -119,65,65,65,65,65,65,102,47,52,65,47,47,47,47,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, -47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102, -47,47,47,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47, -47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65, -68,47,47,47,47,47,47,47,47,47,43,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,65,47,47,47,47,47, -47,47,47,47,52,65,65,65,80,47,47,47,47,47,47,47,47,103,65,65,65,68,47,47,47,47,47,47,47,43,65,65, -65,65,65,102,47,47,47,47,47,47,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65, -65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103, -65,65,65,65,65,65,65,65,65,65,102,47,65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65, -65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,66,47,56,65,65,65,65,65,65,65,65,65,65,68,47,47, -47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47, -47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47, -47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47, +65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65,65,65,65,65,80,47,103,65,65,65,65,65,65, +65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47,103,65,65,65,65,65,65,65,65,65,65,102,47, +65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65, +65,65,65,65,66,47,56,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,47,47,47,47,103,65,72,47, +47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47, 47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47, 47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47, 47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,52,65,65,65,65,66,47,103, -65,65,68,47,47,52,65,65,65,65,102,47,103,65,65,80,47,47,52,65,65,65,66,47,47,103,65,65,47,47,47,52, -65,65,65,72,47,47,103,65,66,47,47,47,52,65,65,65,102,47,47,103,65,68,47,47,47,52,65,65,65,47,47,47, -103,65,72,47,47,47,52,65,65,68,47,47,47,103,65,80,47,47,47,52,65,65,72,47,47,47,103,65,80,47,47,47, -52,65,65,80,47,47,47,103,65,102,47,47,47,52,65,65,102,47,47,47,103,65,102,47,47,47,52,65,66,47,47,47, -47,103,65,102,47,47,47,52,65,68,47,47,47,47,103,65,47,47,47,47,52,65,72,47,47,47,47,103,65,47,47,47, -47,52,65,102,47,47,47,47,103,65,47,47,47,47,52,65,47,47,47,47,47,103,65,47,47,119,65,65,66,47,47,47, -47,47,103,65,47,47,103,65,65,72,47,47,47,47,47,103,65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47, -103,65,65,47,47,47,56,47,47,103,65,47,47,103,65,68,47,47,47,119,47,47,103,65,47,47,119,65,47,47,47,47, -103,47,47,103,65,47,47,47,47,47,47,47,47,65,47,47,103,65,47,47,47,47,47,47,47,56,65,47,47,103,65,47, -47,47,47,47,47,47,52,65,47,47,103,65,102,47,47,47,47,47,47,119,65,47,47,103,65,102,47,47,47,47,47,47, -103,65,47,47,103,65,102,47,47,47,47,47,43,65,65,47,47,103,65,80,47,47,47,47,47,56,65,65,47,47,103,65, -80,47,47,47,47,47,52,65,65,47,47,103,65,72,47,47,47,47,47,103,65,65,47,47,103,65,68,47,47,47,47,47, -65,65,65,47,47,103,65,66,47,47,47,47,56,65,65,65,47,47,103,65,65,47,47,47,47,119,65,65,65,47,47,103, -65,65,80,47,47,47,65,65,65,65,47,47,103,65,65,68,47,47,56,65,65,65,65,47,47,103,65,65,65,80,43,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,66,47,43,65,65,65,65,65,68,47,119,65,65,66,47,47,56,65,65,65,65,80,47,119, -65,65,66,47,47,47,65,65,65,65,47,47,119,65,65,66,47,47,47,119,65,65,66,47,47,119,65,65,66,47,47,47, -52,65,65,68,47,47,119,65,65,66,47,47,47,56,65,65,72,47,47,119,65,65,66,47,47,47,43,65,65,80,47,47, -119,65,65,66,47,47,47,43,65,65,80,47,47,119,65,65,66,47,47,47,47,65,65,102,47,47,119,65,65,66,47,47, -47,47,65,65,102,47,47,119,65,65,66,47,47,47,47,103,65,102,47,47,119,65,65,66,47,47,47,47,103,65,47,47, -47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,47,47,65,65, -102,47,47,119,65,47,47,52,65,47,47,65,65,65,47,47,119,65,47,47,103,65,47,47,65,65,65,102,47,119,65,47, -47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,68,47,47,119, -65,65,47,47,119,65,47,47,119,72,47,47,56,65,66,47,47,119,65,47,47,47,47,47,47,47,47,47,47,47,103,65, 47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47, -47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,65,65,102,47,47,47,47,47,47,47,47,47,47,65, -65,80,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47, -47,47,47,47,47,56,65,65,72,47,47,47,43,47,47,47,47,47,52,65,65,68,47,47,47,43,102,47,47,47,47,119, -65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,65,102,47,47,52,72,47,47,47,43,65,65,65,65,72,47,47, -103,66,47,47,47,119,65,65,65,65,65,80,52,65,65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65, -65,65,65,65,47,47,119,65,65,65,65,65,65,65,65,65,80,47,47,119,65,65,65,65,65,65,65,65,66,47,47,47, -119,65,65,65,65,65,65,65,65,102,47,47,47,119,65,65,65,65,65,65,65,72,47,47,47,47,119,65,65,65,65,65, -65,65,47,47,47,47,47,119,65,65,65,65,65,65,80,47,47,47,47,47,119,65,65,65,65,65,66,47,47,47,47,47, -47,119,65,65,65,65,65,102,47,47,47,47,47,47,119,65,65,65,65,72,47,47,47,47,47,47,47,119,65,65,65,65, -47,47,47,47,47,47,47,47,119,65,65,65,80,47,47,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47, -72,47,119,65,65,65,47,47,47,47,47,47,119,72,47,119,65,65,65,47,47,47,47,47,56,65,72,47,119,65,65,65, -47,47,47,47,47,65,65,72,47,119,65,65,65,47,47,47,47,103,65,65,72,47,119,65,65,65,47,47,47,52,65,65, -65,72,47,119,65,65,65,47,47,43,65,65,65,65,72,47,119,65,65,65,47,47,47,47,47,47,47,47,47,47,47,103, -65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47, -47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47, +47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,72,47,52,65,65,65,65,66,47,103,65,65,68,47,47,52,65,65,65,65,102,47, +103,65,65,80,47,47,52,65,65,65,66,47,47,103,65,65,47,47,47,52,65,65,65,72,47,47,103,65,66,47,47,47, +52,65,65,65,102,47,47,103,65,68,47,47,47,52,65,65,65,47,47,47,103,65,72,47,47,47,52,65,65,68,47,47, +47,103,65,80,47,47,47,52,65,65,72,47,47,47,103,65,80,47,47,47,52,65,65,80,47,47,47,103,65,102,47,47, +47,52,65,65,102,47,47,47,103,65,102,47,47,47,52,65,66,47,47,47,47,103,65,102,47,47,47,52,65,68,47,47, +47,47,103,65,47,47,47,47,52,65,72,47,47,47,47,103,65,47,47,47,47,52,65,102,47,47,47,47,103,65,47,47, +47,47,52,65,47,47,47,47,47,103,65,47,47,119,65,65,66,47,47,47,47,47,103,65,47,47,103,65,65,72,47,47, +47,47,47,103,65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47,103,65,65,47,47,47,56,47,47,103,65,47, +47,103,65,68,47,47,47,119,47,47,103,65,47,47,119,65,47,47,47,47,103,47,47,103,65,47,47,47,47,47,47,47, +47,65,47,47,103,65,47,47,47,47,47,47,47,56,65,47,47,103,65,47,47,47,47,47,47,47,52,65,47,47,103,65, +102,47,47,47,47,47,47,119,65,47,47,103,65,102,47,47,47,47,47,47,103,65,47,47,103,65,102,47,47,47,47,47, +43,65,65,47,47,103,65,80,47,47,47,47,47,56,65,65,47,47,103,65,80,47,47,47,47,47,52,65,65,47,47,103, +65,72,47,47,47,47,47,103,65,65,47,47,103,65,68,47,47,47,47,47,65,65,65,47,47,103,65,66,47,47,47,47, +56,65,65,65,47,47,103,65,65,47,47,47,47,119,65,65,65,47,47,103,65,65,80,47,47,47,65,65,65,65,47,47, +103,65,65,68,47,47,56,65,65,65,65,47,47,103,65,65,65,80,43,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,66,47,43,65, +65,65,65,65,68,47,119,65,65,66,47,47,56,65,65,65,65,80,47,119,65,65,66,47,47,47,65,65,65,65,47,47, +119,65,65,66,47,47,47,119,65,65,66,47,47,119,65,65,66,47,47,47,52,65,65,68,47,47,119,65,65,66,47,47, +47,56,65,65,72,47,47,119,65,65,66,47,47,47,43,65,65,80,47,47,119,65,65,66,47,47,47,43,65,65,80,47, +47,119,65,65,66,47,47,47,47,65,65,102,47,47,119,65,65,66,47,47,47,47,65,65,102,47,47,119,65,65,66,47, +47,47,47,103,65,102,47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,65,65,66,47,47,47,47,103,65,47, +47,47,119,65,65,66,47,47,47,47,103,65,47,47,47,119,47,47,65,65,102,47,47,119,65,47,47,52,65,47,47,65, +65,65,47,47,119,65,47,47,103,65,47,47,65,65,65,102,47,119,65,47,47,103,66,47,47,103,65,65,102,47,119,65, +47,47,103,66,47,47,103,65,65,102,47,119,65,47,47,103,68,47,47,119,65,65,47,47,119,65,47,47,119,72,47,47, +56,65,66,47,47,119,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103, +65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47, +47,47,47,47,47,47,65,65,102,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47, +65,65,80,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,56,65,65,72,47,47,47, +43,47,47,47,47,47,52,65,65,68,47,47,47,43,102,47,47,47,47,119,65,65,65,47,47,47,56,80,47,47,47,47, +103,65,65,65,102,47,47,52,72,47,47,47,43,65,65,65,65,72,47,47,103,66,47,47,47,119,65,65,65,65,65,80, +52,65,65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65, +65,65,65,65,80,47,47,119,65,65,65,65,65,65,65,65,66,47,47,47,119,65,65,65,65,65,65,65,65,102,47,47, +47,119,65,65,65,65,65,65,65,72,47,47,47,47,119,65,65,65,65,65,65,65,47,47,47,47,47,119,65,65,65,65, +65,65,80,47,47,47,47,47,119,65,65,65,65,65,66,47,47,47,47,47,47,119,65,65,65,65,65,102,47,47,47,47, +47,47,119,65,65,65,65,72,47,47,47,47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47,47,119,65,65,65, +80,47,47,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,47,72,47,119,65,65,65,47,47,47,47,47,47, +119,72,47,119,65,65,65,47,47,47,47,47,56,65,72,47,119,65,65,65,47,47,47,47,47,65,65,72,47,119,65,65, +65,47,47,47,47,103,65,65,72,47,119,65,65,65,47,47,47,52,65,65,65,72,47,119,65,65,65,47,47,43,65,65, +65,65,72,47,119,65,65,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47, 103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47, 47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47, 47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47, -47,47,47,47,47,47,47,47,103,65,65,65,65,65,65,65,65,72,47,52,65,65,65,65,65,65,65,65,65,65,72,47, -119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65, +47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47, +47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,47,103,65,65,65, +65,65,65,65,65,72,47,52,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,72, +47,119,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,66, +47,47,56,65,65,65,47,47,47,47,47,43,66,47,47,47,65,65,65,47,47,47,47,47,43,66,47,47,47,119,65,65, +47,47,47,47,47,43,66,47,47,47,52,65,65,47,47,47,47,47,43,66,47,47,47,56,65,65,47,47,47,47,47,43, +66,47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47,43,65,65,47,47,47,47,47,43,66,47,47,47,47,65, +65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47, +43,66,47,47,47,47,103,65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,66,47,47,47,47, +103,65,47,47,47,47,47,43,65,47,47,47,47,103,65,47,47,103,80,47,103,65,65,66,47,47,119,65,47,47,103,102, +47,65,65,65,65,47,47,119,65,47,47,103,102,47,65,65,65,65,102,47,119,65,47,47,103,47,47,65,65,65,65,102, +47,119,65,47,47,103,47,47,65,65,65,65,47,47,119,65,47,47,103,47,47,103,65,65,65,47,47,119,65,47,47,103, +47,47,43,65,65,80,47,47,119,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47, +47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47, +103,47,47,47,47,47,47,47,47,65,65,47,47,103,102,47,47,47,47,47,47,47,65,65,47,47,103,102,47,47,47,47, +47,47,43,65,65,47,47,103,80,47,47,47,47,47,47,43,65,65,47,47,103,72,47,47,47,47,47,47,56,65,65,47, +47,103,68,47,47,47,47,47,47,52,65,65,47,47,103,66,47,47,47,47,47,47,119,65,65,47,47,103,65,47,47,47, +47,47,47,65,65,65,65,65,65,65,72,47,47,47,47,56,65,65,65,65,65,65,65,65,47,47,47,47,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,66,47,47,56,65,65,65,47,47,47,47,47,43,66,47,47,47,65,65,65,47, -47,47,47,47,43,66,47,47,47,119,65,65,47,47,47,47,47,43,66,47,47,47,52,65,65,47,47,47,47,47,43,66, -47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47,56,65,65,47,47,47,47,47,43,66,47,47,47,43,65,65, -47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,65,65,47,47,47,47,47,43, -66,47,47,47,47,65,65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,66,47,47,47,47,103, -65,47,47,47,47,47,43,66,47,47,47,47,103,65,47,47,47,47,47,43,65,47,47,47,47,103,65,47,47,103,80,47, -103,65,65,66,47,47,119,65,47,47,103,102,47,65,65,65,65,47,47,119,65,47,47,103,102,47,65,65,65,65,102,47, -119,65,47,47,103,47,47,65,65,65,65,102,47,119,65,47,47,103,47,47,65,65,65,65,47,47,119,65,47,47,103,47, -47,103,65,65,65,47,47,119,65,47,47,103,47,47,43,65,65,80,47,47,119,65,47,47,103,47,47,47,47,47,47,47, -47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,103,65,47,47,103, -47,47,47,47,47,47,47,47,103,65,47,47,103,47,47,47,47,47,47,47,47,65,65,47,47,103,102,47,47,47,47,47, -47,47,65,65,47,47,103,102,47,47,47,47,47,47,43,65,65,47,47,103,80,47,47,47,47,47,47,43,65,65,47,47, -103,72,47,47,47,47,47,47,56,65,65,47,47,103,68,47,47,47,47,47,47,52,65,65,47,47,103,66,47,47,47,47, -47,47,119,65,65,47,47,103,65,47,47,47,47,47,47,65,65,65,65,65,65,65,72,47,47,47,47,56,65,65,65,65, -65,65,65,65,47,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,47,103,65,65, +65,65,66,47,47,47,47,47,47,47,43,65,65,65,65,72,47,47,47,47,47,47,47,47,103,65,65,65,102,47,47,47, +47,47,47,47,47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65,65,68,47,47,47,47,47,47,47,47,47,43, +65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47, +47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47, +47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47, +47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,52,65,47,47,119,65,68,47,52,65,65, +102,47,52,65,47,47,103,65,72,47,119,65,65,80,47,52,65,47,47,103,65,72,47,119,65,65,80,47,52,65,47,47, +103,65,80,47,119,65,65,80,47,52,65,47,47,103,65,80,47,52,65,65,102,47,52,65,47,47,119,65,80,47,43,65, +68,47,47,52,65,47,47,47,119,80,47,47,47,47,47,47,52,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102, +47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47, +47,47,47,47,119,65,80,47,47,52,80,47,47,47,47,47,47,103,65,80,47,47,52,72,47,47,47,47,47,47,103,65, +72,47,47,52,72,47,47,47,47,47,47,65,65,72,47,47,52,68,47,47,47,47,47,43,65,65,68,47,47,52,68,47, +47,47,47,47,56,65,65,66,47,47,52,66,47,47,47,47,47,52,65,65,65,47,47,52,65,47,47,47,47,47,119,65, +65,65,80,47,52,65,80,47,47,47,47,65,65,65,65,66,47,52,65,68,47,47,47,52,65,65,65,65,65,65,65,65, +65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,65,65,65,47,47,103,65, +65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65, +68,103,65,47,47,103,65,65,65,65,65,65,80,47,103,65,47,47,103,65,65,65,65,65,72,47,47,103,65,47,47,103, +65,65,65,65,66,47,47,47,103,65,47,47,103,65,65,65,65,80,47,47,47,103,65,47,47,103,65,65,65,68,47,47, +47,47,103,65,47,47,103,65,65,65,102,47,47,47,47,103,65,47,47,103,65,65,66,47,47,47,47,47,103,65,47,47, +103,65,65,80,47,47,47,47,47,103,65,47,47,103,65,66,47,47,47,47,47,47,103,65,47,47,103,65,72,47,47,47, +47,47,47,103,65,47,47,103,65,47,47,47,47,47,47,47,103,65,47,47,103,68,47,47,47,47,47,47,47,103,65,47, +47,103,102,47,47,47,47,47,47,47,103,65,47,47,104,47,47,47,47,47,47,47,47,103,65,47,47,110,47,47,47,47, +47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47,47,47,47,47,47,47,47,47,65,65,65,65, +47,47,47,47,47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47,52,65,65,65,65,65,47,47,47,47,47,47, +47,65,65,65,65,65,65,47,47,47,47,47,47,52,65,65,65,65,65,65,47,47,47,47,47,47,65,65,65,65,65,65, +65,47,47,47,47,47,52,65,65,65,65,65,65,65,47,47,47,47,47,65,65,65,65,65,65,65,65,47,47,47,47,56, +65,65,65,65,65,65,65,65,47,47,47,47,103,65,65,65,65,65,65,65,65,47,47,47,43,65,65,65,65,65,65,65, +65,65,47,47,47,52,65,65,65,65,65,65,65,65,65,47,47,47,65,65,65,65,65,65,65,65,65,65,47,47,52,65, +65,65,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,68,47,47,47,47,47,47,103,65,65,65,65,66,47,47,47,47,47,47,47,43,65,65,65,65,72,47,47,47,47, -47,47,47,47,103,65,65,65,102,47,47,47,47,47,47,47,47,52,65,65,66,47,47,47,47,47,47,47,47,47,56,65, -65,68,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47, -47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47, -103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47, -47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, -47,52,65,47,47,119,65,68,47,52,65,65,102,47,52,65,47,47,103,65,72,47,119,65,65,80,47,52,65,47,47,103, -65,72,47,119,65,65,80,47,52,65,47,47,103,65,80,47,119,65,65,80,47,52,65,47,47,103,65,80,47,52,65,65, -102,47,52,65,47,47,119,65,80,47,43,65,68,47,47,52,65,47,47,47,119,80,47,47,47,47,47,47,52,65,102,47, -47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,102,47,47,52,80,47,47,47, -47,47,47,119,65,102,47,47,52,80,47,47,47,47,47,47,119,65,80,47,47,52,80,47,47,47,47,47,47,103,65,80, -47,47,52,72,47,47,47,47,47,47,103,65,72,47,47,52,72,47,47,47,47,47,47,65,65,72,47,47,52,68,47,47, -47,47,47,43,65,65,68,47,47,52,68,47,47,47,47,47,56,65,65,66,47,47,52,66,47,47,47,47,47,52,65,65, -65,47,47,52,65,47,47,47,47,47,119,65,65,65,80,47,52,65,80,47,47,47,47,65,65,65,65,66,47,52,65,68, -47,47,47,52,65,65,65,65,65,65,65,65,65,72,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,47,47,65,65,65, -65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65,65,65,47,47,103,65,65,65,65,65,65,65,65, -65,65,47,47,103,65,65,65,65,65,65,65,68,103,65,47,47,103,65,65,65,65,65,65,80,47,103,65,47,47,103,65, -65,65,65,65,72,47,47,103,65,47,47,103,65,65,65,65,66,47,47,47,103,65,47,47,103,65,65,65,65,80,47,47, -47,103,65,47,47,103,65,65,65,68,47,47,47,47,103,65,47,47,103,65,65,65,102,47,47,47,47,103,65,47,47,103, -65,65,66,47,47,47,47,47,103,65,47,47,103,65,65,80,47,47,47,47,47,103,65,47,47,103,65,66,47,47,47,47, -47,47,103,65,47,47,103,65,72,47,47,47,47,47,47,103,65,47,47,103,65,47,47,47,47,47,47,47,103,65,47,47, -103,68,47,47,47,47,47,47,47,103,65,47,47,103,102,47,47,47,47,47,47,47,103,65,47,47,104,47,47,47,47,47, -47,47,47,103,65,47,47,110,47,47,47,47,47,47,47,47,103,65,47,47,47,47,47,47,47,47,47,47,103,65,65,47, -47,47,47,47,47,47,47,47,65,65,65,65,47,47,47,47,47,47,47,47,119,65,65,65,65,47,47,47,47,47,47,47, -52,65,65,65,65,65,47,47,47,47,47,47,47,65,65,65,65,65,65,47,47,47,47,47,47,52,65,65,65,65,65,65, -47,47,47,47,47,47,65,65,65,65,65,65,65,47,47,47,47,47,52,65,65,65,65,65,65,65,47,47,47,47,47,65, -65,65,65,65,65,65,65,47,47,47,47,56,65,65,65,65,65,65,65,65,47,47,47,47,103,65,65,65,65,65,65,65, -65,47,47,47,43,65,65,65,65,65,65,65,65,65,47,47,47,52,65,65,65,65,65,65,65,65,65,47,47,47,65,65, -65,65,65,65,65,65,65,65,47,47,52,65,65,65,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,68,47,47,103,66,47,47,47,119,65,65,65,65,80,47,47,52,72,47,47,47, +43,65,65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,66,47,47,47,43,102,47,47,47,47,52,65,65,68,47, +47,47,43,47,47,47,47,47,56,65,65,72,47,47,47,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47, +47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,102, +47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47, +47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47,47,47,47,47,47,47,47,47,47,47,119,65, +47,47,52,68,47,47,119,65,66,47,47,52,65,47,47,119,66,47,47,103,65,65,47,47,52,65,47,47,103,65,47,47, +103,65,65,102,47,52,65,47,47,103,65,47,47,65,65,65,102,47,52,65,47,47,103,65,47,47,103,65,65,102,47,52, +65,47,47,119,66,47,47,103,65,65,47,47,52,65,47,47,47,80,47,47,56,65,72,47,47,52,65,102,47,47,47,47, +47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47, +119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47, +47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47, +47,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47,43,47,47,47,47,47,56,65,65,66,47,47, +47,56,102,47,47,47,47,119,65,65,65,102,47,47,52,80,47,47,47,47,65,65,65,65,72,47,47,119,68,47,47,47, +56,65,65,65,65,65,47,43,65,65,102,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,103,66,47,47,47,119, -65,65,65,65,80,47,47,52,72,47,47,47,43,65,65,65,65,47,47,47,56,80,47,47,47,47,103,65,65,66,47,47, -47,43,102,47,47,47,47,52,65,65,68,47,47,47,43,47,47,47,47,47,56,65,65,72,47,47,47,47,47,47,47,47, -47,43,65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47, -47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47,47,47,47,103,65,102,47,47,47,47,47,47,47, -47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,47, -47,47,47,47,47,47,47,47,47,47,119,65,47,47,52,68,47,47,119,65,66,47,47,52,65,47,47,119,66,47,47,103, -65,65,47,47,52,65,47,47,103,65,47,47,103,65,65,102,47,52,65,47,47,103,65,47,47,65,65,65,102,47,52,65, -47,47,103,65,47,47,103,65,65,102,47,52,65,47,47,119,66,47,47,103,65,65,47,47,52,65,47,47,47,80,47,47, -56,65,72,47,47,52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119, -65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47, -47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47, -65,65,72,47,47,47,47,47,47,47,47,47,47,65,65,68,47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47, -43,47,47,47,47,47,56,65,65,66,47,47,47,56,102,47,47,47,47,119,65,65,65,102,47,47,52,80,47,47,47,47, -65,65,65,65,72,47,47,119,68,47,47,47,56,65,65,65,65,65,47,43,65,65,102,47,47,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66,47,47,47,43,65,65,47,43,65,65,65,65, +80,47,47,47,47,103,65,47,47,119,65,65,65,102,47,47,47,47,119,65,47,47,52,65,65,66,47,47,47,47,47,52, +65,47,47,56,65,65,68,47,47,47,47,47,56,65,47,47,43,65,65,68,47,47,47,47,47,43,65,47,47,47,65,65, +72,47,47,47,47,47,43,65,47,47,47,65,65,80,47,47,47,47,47,47,65,47,47,47,103,65,80,47,47,47,47,47, +47,65,47,47,47,103,65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119, +65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119,65,47,47,47,47,47, +47,47,65,66,47,47,52,65,47,47,52,65,68,47,47,65,65,80,47,52,65,47,47,103,65,66,47,47,65,65,80,47, +52,65,47,47,103,65,65,47,47,65,65,80,47,52,65,47,47,103,65,65,47,43,65,65,80,47,52,65,47,47,103,65, +66,47,56,65,65,80,47,52,65,47,47,119,65,66,47,56,65,65,102,47,52,65,102,47,47,47,47,47,47,47,47,47, +47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47, +47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,47, +47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,47,47,47,65,65,72,47, +47,47,47,47,47,47,47,47,43,65,65,68,47,47,47,47,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,47, +47,47,52,65,65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,80,47,47,47,47,47,47,47,47,65,65,65,65, +66,47,47,47,47,47,47,47,52,65,65,65,65,65,68,47,47,47,47,47,119,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,103,65,65,65,65,65,65,65,65,66, -47,47,47,43,65,65,47,43,65,65,65,65,80,47,47,47,47,103,65,47,47,119,65,65,65,102,47,47,47,47,119,65, -47,47,52,65,65,66,47,47,47,47,47,52,65,47,47,56,65,65,68,47,47,47,47,47,56,65,47,47,43,65,65,68, -47,47,47,47,47,43,65,47,47,47,65,65,72,47,47,47,47,47,43,65,47,47,47,65,65,80,47,47,47,47,47,47, -65,47,47,47,103,65,80,47,47,47,47,47,47,65,47,47,47,103,65,102,47,47,47,47,47,47,65,47,47,47,119,65, -102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47,47,65,47,47,47,119,65,102,47,47,47,47,47, -47,65,47,47,47,119,65,47,47,47,47,47,47,47,65,66,47,47,52,65,47,47,52,65,68,47,47,65,65,80,47,52, -65,47,47,103,65,66,47,47,65,65,80,47,52,65,47,47,103,65,65,47,47,65,65,80,47,52,65,47,47,103,65,65, -47,43,65,65,80,47,52,65,47,47,103,65,66,47,56,65,65,80,47,52,65,47,47,119,65,66,47,56,65,65,102,47, -52,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47, -47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,47,47, -47,119,65,80,47,47,47,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,47,47,47,103,65,72,47,47, -47,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,47,47,43,65,65,68,47,47,47,47,47,47,47,47, -47,56,65,65,66,47,47,47,47,47,47,47,47,47,52,65,65,65,102,47,47,47,47,47,47,47,47,119,65,65,65,80, -47,47,47,47,47,47,47,47,65,65,65,65,66,47,47,47,47,47,47,47,52,65,65,65,65,65,68,47,47,47,47,47, -119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,47,65,65,66,47,56,65,65,65,65,65,65,47,47,65,65,68, -47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65, -65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65, +65,65,102,47,65,65,66,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65, 68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65, 65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65, 65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,61,61,34,41,44,52,54,44,97,116,111,98,40,34,69,105,65,110,71,105,99,110,74, -121,99,110,74,121,99,110,69,119,61,61,34,41,44,55,56,43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54, -41,41,59,125,59,10,71,114,97,112,104,105,99,115,46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116, -65,110,116,111,110,83,109,97,108,108,61,170,40,115,99,97,108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115, -116,111,109,40,97,116,111,98,40,34,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65, +65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,47,47, +65,65,68,47,56,65,65,65,65,65,65,47,47,65,65,68,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,34, +41,44,52,54,44,97,116,111,98,40,34,69,105,65,110,71,105,99,110,74,121,99,110,74,121,99,110,69,119,61,61,34, +41,44,55,56,43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54,41,41,59,125,59,10,71,114,97,112,104,105, +99,115,46,112,114,111,116,111,116,121,112,101,46,115,101,116,70,111,110,116,65,110,116,111,110,83,109,97,108,108,61,170, +40,115,99,97,108,101,41,123,103,46,115,101,116,70,111,110,116,67,117,115,116,111,109,40,97,116,111,98,40,34,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65, 65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65, 102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56, -65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,77,65, -65,65,65,65,65,65,65,68,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,102,47,56,65,65,65, -65,65,65,72,47,47,56,65,65,65,65,65,66,47,47,47,56,65,65,65,65,65,47,47,47,47,56,65,65,65,65,80, -47,47,47,47,56,65,65,65,68,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,56,65,65,102,47,47,47,47, -47,47,56,65,72,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,43,65,65,47,47,47,47,47,47,47,65, -65,65,47,47,47,47,47,47,119,65,65,65,47,47,47,47,47,56,65,65,65,65,47,47,47,47,43,65,65,65,65,65, -47,47,47,47,103,65,65,65,65,65,47,47,47,52,65,65,65,65,65,65,47,47,56,65,65,65,65,65,65,65,47,47, -65,65,65,65,65,65,65,65,47,119,65,65,65,65,65,65,65,65,52,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,47,47,47,119,65,65,65,47,47,47,47,47, -47,56,65,65,66,47,47,47,47,47,47,43,65,65,72,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47, -103,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65, -47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47, -65,65,65,65,68,47,56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65, -65,65,65,47,56,65,47,43,65,65,65,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, -47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, -52,65,80,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65, -68,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,56,65,65,65,80,47,47,47,47,47,119,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,102,119,65,65,65,65,65,65,65,65,47,52,65, -65,65,65,65,65,65,65,47,52,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65, -65,65,65,65,68,47,119,65,65,65,65,65,65,65,68,47,103,65,65,65,65,65,65,65,72,47,47,47,47,47,47,47, -56,65,80,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, +65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65,65,65,65,65,65,65,102,56,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,77,65,65,65,65,65,65,65,65,68,56,65,65,65, +65,65,65,65,65,47,56,65,65,65,65,65,65,65,102,47,56,65,65,65,65,65,65,72,47,47,56,65,65,65,65,65, +66,47,47,47,56,65,65,65,65,65,47,47,47,47,56,65,65,65,65,80,47,47,47,47,56,65,65,65,68,47,47,47, +47,47,56,65,65,66,47,47,47,47,47,47,56,65,65,102,47,47,47,47,47,47,56,65,72,47,47,47,47,47,47,47, +52,65,47,47,47,47,47,47,47,43,65,65,47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,119,65,65,65, +47,47,47,47,47,56,65,65,65,65,47,47,47,47,43,65,65,65,65,65,47,47,47,47,103,65,65,65,65,65,47,47, +47,52,65,65,65,65,65,65,47,47,56,65,65,65,65,65,65,65,47,47,65,65,65,65,65,65,65,65,47,119,65,65, +65,65,65,65,65,65,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,72,47,47,47,47,47,119,65,65,65,47,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,43, +65,65,72,47,47,47,47,47,47,47,103,65,72,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47,47,47,119,65, +102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,47,56,65,47,47, +47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,65,65,65,65,68,47,56,65,47,56,65,65, +65,65,65,47,56,65,47,56,65,65,65,65,65,47,56,65,47,56,65,65,65,65,65,47,56,65,47,43,65,65,65,65, +66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, +56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,80,47,47,47,47,47,47,47,119,65, +80,47,47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,47,65,65,65,47, +47,47,47,47,47,56,65,65,65,80,47,47,47,47,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,102,119,65,65,65,65,65,65,65,65,47,52,65,65,65,65,65,65,65,65,47,52,65,65,65, +65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65, +65,65,68,47,103,65,65,65,65,65,65,65,72,47,47,47,47,47,47,47,56,65,80,47,47,47,47,47,47,47,56,65, 47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47, 47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47, -47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,52,65,65,65,80,56,65,65,47,47,52,65,65,65,47, -56,65,66,47,47,52,65,65,72,47,56,65,72,47,47,52,65,65,80,47,56,65,80,47,47,52,65,65,47,47,56,65, -80,47,47,52,65,66,47,47,56,65,102,47,47,52,65,68,47,47,56,65,102,47,47,52,65,80,47,47,56,65,47,47, -47,52,65,102,47,47,56,65,47,47,47,52,65,47,47,47,56,65,47,47,47,52,68,47,47,47,56,65,47,47,65,65, -72,47,47,47,56,65,47,56,65,65,80,47,47,47,56,65,47,56,65,65,47,47,43,47,56,65,47,56,65,68,47,47, -56,47,56,65,47,43,65,102,47,47,119,47,56,65,47,47,47,47,47,47,103,47,56,65,47,47,47,47,47,43,65,47, -56,65,47,47,47,47,47,56,65,47,56,65,102,47,47,47,47,52,65,47,56,65,102,47,47,47,47,119,65,47,56,65, -80,47,47,47,47,65,65,47,56,65,80,47,47,47,43,65,65,47,56,65,72,47,47,47,56,65,65,47,56,65,68,47, -47,47,119,65,65,47,56,65,65,47,47,47,65,65,65,47,56,65,65,80,47,52,65,65,65,47,56,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,52,65,65,102,47,103,65,65,65,47,52,65,65,102, -47,56,65,65,68,47,52,65,65,102,47,47,65,65,72,47,52,65,65,102,47,47,103,65,80,47,52,65,65,102,47,47, -119,65,80,47,52,65,65,102,47,47,119,65,102,47,52,65,65,102,47,47,52,65,102,47,52,65,65,102,47,47,52,65, -47,47,52,65,65,102,47,47,56,65,47,47,52,65,65,102,47,47,56,65,47,47,52,65,65,80,47,47,56,65,47,47, -65,47,56,65,66,47,56,65,47,56,65,47,56,65,65,47,56,65,47,56,66,47,56,65,65,47,56,65,47,56,66,47, -56,65,65,47,56,65,47,43,68,47,47,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, -47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, -52,65,102,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,103,65,72,47,47,57,47,47,47,47,103,65, -68,47,47,52,47,47,47,43,65,65,66,47,47,119,102,47,47,52,65,65,65,80,47,65,72,47,47,103,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65, -66,47,47,119,65,65,65,65,65,65,80,47,47,119,65,65,65,65,65,68,47,47,47,119,65,65,65,65,65,47,47,47, -47,119,65,65,65,65,72,47,47,47,47,119,65,65,65,66,47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,119, -65,65,68,47,47,47,47,47,47,119,65,65,47,47,47,47,47,47,47,119,65,65,47,47,47,47,47,104,47,119,65,65, -47,47,47,47,119,66,47,119,65,65,47,47,47,56,65,66,47,119,65,65,47,47,47,65,65,66,47,119,65,65,47,47, -103,65,65,66,47,119,65,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47, +47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,72,47,52,65,65,65,80,56,65,65,47,47,52,65,65,65,47,56,65,66,47,47,52,65,65,72,47,56,65, +72,47,47,52,65,65,80,47,56,65,80,47,47,52,65,65,47,47,56,65,80,47,47,52,65,66,47,47,56,65,102,47, +47,52,65,68,47,47,56,65,102,47,47,52,65,80,47,47,56,65,47,47,47,52,65,102,47,47,56,65,47,47,47,52, +65,47,47,47,56,65,47,47,47,52,68,47,47,47,56,65,47,47,65,65,72,47,47,47,56,65,47,56,65,65,80,47, +47,47,56,65,47,56,65,65,47,47,43,47,56,65,47,56,65,68,47,47,56,47,56,65,47,43,65,102,47,47,119,47, +56,65,47,47,47,47,47,47,103,47,56,65,47,47,47,47,47,43,65,47,56,65,47,47,47,47,47,56,65,47,56,65, +102,47,47,47,47,52,65,47,56,65,102,47,47,47,47,119,65,47,56,65,80,47,47,47,47,65,65,47,56,65,80,47, +47,47,43,65,65,47,56,65,72,47,47,47,56,65,65,47,56,65,68,47,47,47,119,65,65,47,56,65,65,47,47,47, +65,65,65,47,56,65,65,80,47,52,65,65,65,47,56,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,72,52,65,65,102,47,103,65,65,65,47,52,65,65,102,47,56,65,65,68,47,52,65,65,102,47,47, +65,65,72,47,52,65,65,102,47,47,103,65,80,47,52,65,65,102,47,47,119,65,80,47,52,65,65,102,47,47,119,65, +102,47,52,65,65,102,47,47,52,65,102,47,52,65,65,102,47,47,52,65,47,47,52,65,65,102,47,47,56,65,47,47, +52,65,65,102,47,47,56,65,47,47,52,65,65,80,47,47,56,65,47,47,65,47,56,65,66,47,56,65,47,56,65,47, +56,65,65,47,56,65,47,56,66,47,56,65,65,47,56,65,47,56,66,47,56,65,65,47,56,65,47,43,68,47,47,65, +66,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, +56,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,119,65, +80,47,47,47,47,47,47,47,103,65,72,47,47,57,47,47,47,47,103,65,68,47,47,52,47,47,47,43,65,65,66,47, +47,119,102,47,47,52,65,65,65,80,47,65,72,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,72,47,119,65,65,65,65,65,65,66,47,47,119,65,65,65,65,65,65,80,47, +47,119,65,65,65,65,65,68,47,47,47,119,65,65,65,65,65,47,47,47,47,119,65,65,65,65,72,47,47,47,47,119, +65,65,65,66,47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,119,65,65,68,47,47,47,47,47,47,119,65,65, +47,47,47,47,47,47,47,119,65,65,47,47,47,47,47,104,47,119,65,65,47,47,47,47,119,66,47,119,65,65,47,47, +47,56,65,66,47,119,65,65,47,47,47,65,65,66,47,119,65,65,47,47,103,65,65,66,47,119,65,65,47,47,47,47, 47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47, 47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, -56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,65,65,65,65,65,66,47,119,65,65, -65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,80,47,52,65,65,47,47,47,47,52,80,47,43,65,65,47,47,47,47, -52,80,47,47,65,65,47,47,47,47,52,80,47,47,103,65,47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80, -47,47,119,65,47,47,47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47, -56,65,47,47,47,47,52,80,47,47,56,65,47,47,47,47,52,80,47,47,56,65,47,56,72,47,65,65,66,47,56,65, -47,56,72,43,65,65,65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56, -80,47,103,65,68,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47, -47,47,47,47,56,65,47,56,80,47,47,47,47,47,52,65,47,56,72,47,47,47,47,47,52,65,47,56,72,47,47,47, -47,47,119,65,47,56,68,47,47,47,47,47,119,65,47,56,66,47,47,47,47,47,103,65,47,56,65,47,47,47,47,43, -65,65,47,56,65,80,47,47,47,52,65,65,65,65,65,66,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68, -47,47,47,47,47,119,65,65,65,102,47,47,47,47,47,56,65,65,66,47,47,47,47,47,47,47,65,65,72,47,47,47, -47,47,47,47,103,65,80,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47, -47,47,52,65,102,47,47,47,47,47,47,47,52,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47, -56,65,47,47,47,47,47,47,47,47,56,65,47,43,65,72,47,65,66,47,56,65,47,56,65,80,43,65,65,47,56,65, -47,52,65,102,43,65,65,47,56,65,47,56,65,102,43,65,65,47,56,65,47,56,65,102,47,103,72,47,56,65,47,47, -52,102,47,47,47,47,56,65,47,47,52,102,47,47,47,47,56,65,47,47,52,102,47,47,47,47,56,65,102,47,52,102, -47,47,47,47,52,65,102,47,52,102,47,47,47,47,52,65,80,47,52,80,47,47,47,47,119,65,80,47,52,80,47,47, -47,47,103,65,72,47,52,72,47,47,47,47,65,65,68,47,52,68,47,47,47,43,65,65,66,47,52,66,47,47,47,52, -65,65,65,80,52,65,80,47,47,103,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56, -65,65,65,65,65,66,56,65,47,56,65,65,65,65,66,47,56,65,47,56,65,65,65,65,102,47,56,65,47,56,65,65, -65,72,47,47,56,65,47,56,65,65,65,47,47,47,56,65,47,56,65,65,72,47,47,47,56,65,47,56,65,65,47,47, -47,47,56,65,47,56,65,68,47,47,47,47,56,65,47,56,65,102,47,47,47,47,56,65,47,56,66,47,47,47,47,47, -56,65,47,56,80,47,47,47,47,47,56,65,47,56,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,65,65, -47,47,47,47,47,47,47,65,65,65,47,47,47,47,47,47,103,65,65,65,47,47,47,47,47,52,65,65,65,65,47,47, -47,47,47,65,65,65,65,65,47,47,47,47,52,65,65,65,65,65,47,47,47,47,65,65,65,65,65,65,47,47,47,56, -65,65,65,65,65,65,47,47,47,103,65,65,65,65,65,65,47,47,43,65,65,65,65,65,65,65,47,47,119,65,65,65, -65,65,65,65,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,103,68,47,47,103,65,65,65,47,47,52,80,47,47,56,65,65, -68,47,47,56,102,47,47,47,65,65,72,47,47,43,47,47,47,47,103,65,72,47,47,47,47,47,47,47,119,65,80,47, -47,47,47,47,47,47,52,65,80,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47, -47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,47,47,47,47,47,47,47,47,43,65,47,47,66,47,47,65, -66,47,43,65,47,43,65,47,43,65,65,47,43,65,47,56,65,102,43,65,65,47,43,65,47,43,65,102,43,65,65,47, -43,65,47,47,65,47,47,65,66,47,43,65,47,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65, -102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,80,47, -47,47,47,47,47,47,52,65,72,47,47,47,47,47,47,47,52,65,72,47,47,43,47,47,47,47,119,65,68,47,47,43, -47,47,47,47,65,65,65,47,47,52,80,47,47,43,65,65,65,80,47,103,72,47,47,119,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,72,47,47,103,65,102,103,65,65,65,47,47,47,56,65,47,56,65,65,66,47,47,47,43,65,47,47,65,65, -72,47,47,47,47,65,47,47,103,65,72,47,47,47,47,103,47,47,119,65,80,47,47,47,47,103,47,47,119,65,102,47, -47,47,47,119,47,47,52,65,102,47,47,47,47,119,47,47,52,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47, -47,119,47,47,56,65,47,47,47,47,47,119,47,47,56,65,47,47,103,80,47,119,65,47,56,65,47,56,65,68,47,119, -65,47,56,65,47,56,65,68,47,119,65,102,56,65,47,56,65,68,47,103,65,47,56,65,47,43,65,72,47,65,66,47, 56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, -102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,119,65,80,47, -47,47,47,47,47,47,119,65,72,47,47,47,47,47,47,47,103,65,68,47,47,47,47,47,47,43,65,65,65,47,47,47, -47,47,47,52,65,65,65,80,47,47,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65, +47,47,47,47,47,47,47,47,56,65,65,65,65,65,65,66,47,119,65,65,65,65,65,65,65,66,47,119,65,65,65,65, +65,65,65,66,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,80,47,52,65,65,47,47,47,47,52,80,47,43,65,65,47,47,47,47,52,80,47,47,65,65,47,47,47,47,52,80, +47,47,103,65,47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80,47,47,119,65,47,47,47,47,52,80,47,47, +52,65,47,47,47,47,52,80,47,47,52,65,47,47,47,47,52,80,47,47,56,65,47,47,47,47,52,80,47,47,56,65, +47,47,47,47,52,80,47,47,56,65,47,56,72,47,65,65,66,47,56,65,47,56,72,43,65,65,65,47,56,65,47,56, +80,43,65,65,65,47,56,65,47,56,80,43,65,65,65,47,56,65,47,56,80,47,103,65,68,47,56,65,47,56,80,47, +47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65,47,56,80,47,47,47, +47,47,52,65,47,56,72,47,47,47,47,47,52,65,47,56,72,47,47,47,47,47,119,65,47,56,68,47,47,47,47,47, +119,65,47,56,66,47,47,47,47,47,103,65,47,56,65,47,47,47,47,43,65,65,47,56,65,80,47,47,47,52,65,65, +65,65,65,66,47,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,68,47,47,47,47,47,119,65,65,65,102,47,47, +47,47,47,56,65,65,66,47,47,47,47,47,47,47,65,65,72,47,47,47,47,47,47,47,103,65,80,47,47,47,47,47, +47,47,119,65,80,47,47,47,47,47,47,47,119,65,102,47,47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47, +52,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65, +47,43,65,72,47,65,66,47,56,65,47,56,65,80,43,65,65,47,56,65,47,52,65,102,43,65,65,47,56,65,47,56, +65,102,43,65,65,47,56,65,47,56,65,102,47,103,72,47,56,65,47,47,52,102,47,47,47,47,56,65,47,47,52,102, +47,47,47,47,56,65,47,47,52,102,47,47,47,47,56,65,102,47,52,102,47,47,47,47,52,65,102,47,52,102,47,47, +47,47,52,65,80,47,52,80,47,47,47,47,119,65,80,47,52,80,47,47,47,47,103,65,72,47,52,72,47,47,47,47, +65,65,68,47,52,68,47,47,47,43,65,65,66,47,52,66,47,47,47,52,65,65,65,80,52,65,80,47,47,103,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,47,56, +65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,65,65,65,47,56,65,65,65,65,65,66,56,65,47,56,65,65, +65,65,66,47,56,65,47,56,65,65,65,65,102,47,56,65,47,56,65,65,65,72,47,47,56,65,47,56,65,65,65,47, +47,47,56,65,47,56,65,65,72,47,47,47,56,65,47,56,65,65,47,47,47,47,56,65,47,56,65,68,47,47,47,47, +56,65,47,56,65,102,47,47,47,47,56,65,47,56,66,47,47,47,47,47,56,65,47,56,80,47,47,47,47,47,56,65, +47,56,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,65,65,47,47,47,47,47,47,47,65,65,65,47,47, +47,47,47,47,103,65,65,65,47,47,47,47,47,52,65,65,65,65,47,47,47,47,47,65,65,65,65,65,47,47,47,47, +52,65,65,65,65,65,47,47,47,47,65,65,65,65,65,65,47,47,47,56,65,65,65,65,65,65,47,47,47,103,65,65, +65,65,65,65,47,47,43,65,65,65,65,65,65,65,47,47,119,65,65,65,65,65,65,65,47,43,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,72,47,103,68,47,47,103,65,65,65,47,47,52,80,47,47,56,65,65,68,47,47,56,102,47,47,47,65,65,72,47, +47,43,47,47,47,47,103,65,72,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,52,65,80,47,47,47, +47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47, +47,47,43,65,47,47,47,47,47,47,47,47,43,65,47,47,66,47,47,65,66,47,43,65,47,43,65,47,43,65,65,47, +43,65,47,56,65,102,43,65,65,47,43,65,47,43,65,102,43,65,65,47,43,65,47,47,65,47,47,65,66,47,43,65, +47,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,102,47,47,47,47,47,47,47,43,65,102,47, +47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,56,65,80,47,47,47,47,47,47,47,52,65,72,47,47,47, +47,47,47,47,52,65,72,47,47,43,47,47,47,47,119,65,68,47,47,43,47,47,47,47,65,65,65,47,47,52,80,47, +47,43,65,65,65,80,47,103,72,47,47,119,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,47,103,65,102,103,65,65, +65,47,47,47,56,65,47,56,65,65,66,47,47,47,43,65,47,47,65,65,72,47,47,47,47,65,47,47,103,65,72,47, +47,47,47,103,47,47,119,65,80,47,47,47,47,103,47,47,119,65,102,47,47,47,47,119,47,47,52,65,102,47,47,47, +47,119,47,47,52,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47,47,119,47,47,56,65,47,47,47,47,47,119, +47,47,56,65,47,47,103,80,47,119,65,47,56,65,47,56,65,68,47,119,65,47,56,65,47,56,65,68,47,119,65,102, +56,65,47,56,65,68,47,103,65,47,56,65,47,43,65,72,47,65,66,47,56,65,47,47,47,47,47,47,47,47,56,65, +47,47,47,47,47,47,47,47,56,65,47,47,47,47,47,47,47,47,56,65,102,47,47,47,47,47,47,47,52,65,102,47, +47,47,47,47,47,47,52,65,102,47,47,47,47,47,47,47,119,65,80,47,47,47,47,47,47,47,119,65,72,47,47,47, +47,47,47,47,103,65,68,47,47,47,47,47,47,43,65,65,65,47,47,47,47,47,47,52,65,65,65,80,47,47,47,47, +47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65, 65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80, -43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,34,41,44,52,54,44,97,116,111,98,40,34,68,104, -103,101,70,66,52,101,72,104,52,101,72,104,52,101,68,119,61,61,34,41,44,54,48,43,40,115,99,97,108,101,143,56, -41,43,40,49,143,49,54,41,41,59,125,59,10,172,115,101,99,111,110,100,115,77,111,100,101,59,10,172,115,101,99,111, -110,100,115,67,111,108,111,117,114,101,100,59,10,172,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,59,10, -172,100,97,116,101,79,110,77,97,105,110,59,10,172,100,97,116,101,79,110,83,101,99,115,59,10,172,119,101,101,107,68, -97,121,59,10,172,99,97,108,87,101,101,107,59,10,172,117,112,112,101,114,67,97,115,101,59,10,172,118,101,99,116,111, -114,70,111,110,116,59,10,172,100,114,97,119,84,105,109,101,111,117,116,59,10,172,113,117,101,117,101,77,105,108,108,105, -115,61,49,48,48,48,59,10,172,115,101,99,111,110,100,115,83,99,114,101,101,110,61,180,59,10,172,105,115,66,97,110, -103,108,101,49,61,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,59,10, -170,108,111,97,100,83,101,116,116,105,110,103,115,40,41,123,170,100,101,102,40,118,97,108,117,101,44,100,101,102,41,123, -171,118,97,108,117,101,141,183,63,118,97,108,117,101,58,100,101,102,59,125,172,115,101,116,116,105,110,103,115,61,114,101, -113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,83,69,84,84,73,78, -71,83,70,73,76,69,44,180,41,160,123,125,59,115,101,99,111,110,100,115,77,111,100,101,61,100,101,102,40,115,101,116, -116,105,110,103,115,46,115,101,99,111,110,100,115,77,111,100,101,44,34,78,101,118,101,114,34,41,59,115,101,99,111,110, -100,115,67,111,108,111,117,114,101,100,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67, -111,108,111,117,114,101,100,44,180,41,59,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,100,101,102,40, -115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,44,180,41,59,100,97,116, -101,79,110,77,97,105,110,61,100,101,102,40,115,101,116,116,105,110,103,115,46,100,97,116,101,79,110,77,97,105,110,44, -34,76,111,110,103,34,41,59,100,97,116,101,79,110,83,101,99,115,61,100,101,102,40,115,101,116,116,105,110,103,115,46, -100,97,116,101,79,110,83,101,99,115,44,34,89,101,97,114,34,41,59,119,101,101,107,68,97,121,61,100,101,102,40,115, -101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,44,180,41,59,99,97,108,87,101,101,107,61,100,101,102,40,115, -101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,44,181,41,59,117,112,112,101,114,67,97,115,101,61,100,101,102, -40,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,44,180,41,59,118,101,99,116,111,114,70,111,110, -116,61,100,101,102,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,44,181,41,59,163,40,100, -97,116,101,79,110,83,101,99,115,139,180,41,100,97,116,101,79,110,83,101,99,115,61,34,89,101,97,114,34,59,163,40, -100,97,116,101,79,110,83,101,99,115,139,181,41,100,97,116,101,79,110,83,101,99,115,61,34,78,111,34,59,125,10,170, -113,117,101,117,101,68,114,97,119,40,41,123,163,40,100,114,97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84, -105,109,101,111,117,116,40,100,114,97,119,84,105,109,101,111,117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61, -115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,100,114,97,119,84,105,109,101,111,117,116,61,183,59,100,114,97, -119,40,41,59,125,44,113,117,101,117,101,77,105,108,108,105,115,45,40,68,97,116,101,46,110,111,119,40,41,37,113,117, -101,117,101,77,105,108,108,105,115,41,41,59,125,10,170,117,112,100,97,116,101,83,116,97,116,101,40,41,123,163,40,66, -97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,41,123,163,40,40,115,101,99,111,110,100,115,77,111,100,101,139, -34,85,110,108,111,99,107,101,100,34,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,41,160,115, -101,99,111,110,100,115,77,111,100,101,139,34,65,108,119,97,121,115,34,41,123,115,101,99,111,110,100,115,83,99,114,101, -101,110,61,180,59,113,117,101,117,101,77,105,108,108,105,115,61,49,48,48,48,59,125,164,123,115,101,99,111,110,100,115, -83,99,114,101,101,110,61,181,59,113,117,101,117,101,77,105,108,108,105,115,61,54,48,48,48,48,59,125,100,114,97,119, -40,41,59,125,164,123,163,40,100,114,97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116, -40,100,114,97,119,84,105,109,101,111,117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61,183,59,125,125,10,170, -105,115,111,83,116,114,40,100,97,116,101,41,123,171,100,97,116,101,46,103,101,116,70,117,108,108,89,101,97,114,40,41, -43,34,45,34,43,40,34,48,34,43,40,100,97,116,101,46,103,101,116,77,111,110,116,104,40,41,43,49,41,41,46,115, -108,105,99,101,40,45,50,41,43,34,45,34,43,40,34,48,34,43,100,97,116,101,46,103,101,116,68,97,116,101,40,41, -41,46,115,108,105,99,101,40,45,50,41,59,125,10,172,99,97,108,87,101,101,107,66,117,102,102,101,114,61,91,181,44, -181,44,181,93,59,10,170,73,83,79,56,54,48,49,99,97,108,87,101,101,107,40,100,97,116,101,41,123,100,97,116,101, -78,111,84,105,109,101,61,100,97,116,101,59,100,97,116,101,78,111,84,105,109,101,46,115,101,116,72,111,117,114,115,40, -48,44,48,44,48,44,48,41,59,163,40,99,97,108,87,101,101,107,66,117,102,102,101,114,91,48,93,139,100,97,116,101, -46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41,158,99,97,108,87,101,101,107,66,117,102,102, -101,114,91,49,93,139,100,97,116,101,78,111,84,105,109,101,41,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91, -50,93,59,99,97,108,87,101,101,107,66,117,102,102,101,114,91,48,93,61,100,97,116,101,46,103,101,116,84,105,109,101, -122,111,110,101,79,102,102,115,101,116,40,41,59,99,97,108,87,101,101,107,66,117,102,102,101,114,91,49,93,61,100,97, -116,101,78,111,84,105,109,101,59,172,116,100,116,61,184,68,97,116,101,40,100,97,116,101,46,118,97,108,117,101,79,102, -40,41,41,59,172,100,97,121,110,61,40,100,97,116,101,46,103,101,116,68,97,121,40,41,43,54,41,37,55,59,116,100, -116,46,115,101,116,68,97,116,101,40,116,100,116,46,103,101,116,68,97,116,101,40,41,45,100,97,121,110,43,51,41,59, -172,102,105,114,115,116,84,104,117,114,115,100,97,121,61,116,100,116,46,118,97,108,117,101,79,102,40,41,59,116,100,116, -46,115,101,116,77,111,110,116,104,40,48,44,49,41,59,163,40,116,100,116,46,103,101,116,68,97,121,40,41,141,52,41, -123,116,100,116,46,115,101,116,77,111,110,116,104,40,48,44,49,43,40,40,52,45,116,100,116,46,103,101,116,68,97,121, -40,41,41,43,55,41,37,55,41,59,125,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,61,49,43,77,97, -116,104,46,99,101,105,108,40,40,102,105,114,115,116,84,104,117,114,115,100,97,121,45,116,100,116,41,47,54,48,52,56, -48,48,48,48,48,41,59,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,59,125,10,170,100,111,67,111, -108,111,114,40,41,123,171,33,105,115,66,97,110,103,108,101,49,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107, -101,100,40,41,158,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,59,125,10,170,100,114,97,119,40,41,123,172, -120,61,103,46,103,101,116,87,105,100,116,104,40,41,47,50,59,172,121,61,103,46,103,101,116,72,101,105,103,104,116,40, -41,47,50,45,40,115,101,99,111,110,100,115,77,111,100,101,141,34,78,101,118,101,114,34,63,50,52,58,40,118,101,99, -116,111,114,70,111,110,116,63,49,50,58,48,41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,99,108,101,97,114, -82,101,99,116,40,48,44,50,52,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103, -104,116,40,41,45,50,52,41,59,172,100,97,116,101,61,184,68,97,116,101,40,41,59,172,116,105,109,101,83,116,114,61, -114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,116,105,109,101,40,100,97,116,101,44,49,41,59,103, -46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,65,110,116,111, -110,34,41,46,100,114,97,119,83,116,114,105,110,103,40,116,105,109,101,83,116,114,44,120,44,121,41,59,163,40,115,101, -99,111,110,100,115,83,99,114,101,101,110,41,123,121,150,54,53,59,172,115,101,99,83,116,114,61,40,115,101,99,111,110, -100,115,87,105,116,104,67,111,108,111,110,63,34,58,34,58,34,34,41,43,40,34,48,34,43,100,97,116,101,46,103,101, -116,83,101,99,111,110,100,115,40,41,41,46,115,108,105,99,101,40,45,50,41,59,163,40,100,111,67,111,108,111,114,40, -41,41,103,46,115,101,116,67,111,108,111,114,40,48,44,48,44,49,41,59,103,46,115,101,116,70,111,110,116,40,34,65, -110,116,111,110,83,109,97,108,108,34,41,59,163,40,100,97,116,101,79,110,83,101,99,115,141,34,78,111,34,41,123,103, -46,115,101,116,70,111,110,116,65,108,105,103,110,40,49,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101, -99,83,116,114,44,103,46,103,101,116,87,105,100,116,104,40,41,45,40,105,115,66,97,110,103,108,101,49,63,51,50,58, -50,41,44,121,41,59,121,151,40,118,101,99,116,111,114,70,111,110,116,63,49,53,58,49,51,41,59,120,61,103,46,103, -101,116,87,105,100,116,104,40,41,47,52,43,40,105,115,66,97,110,103,108,101,49,63,49,50,58,52,41,43,40,115,101, -99,111,110,100,115,87,105,116,104,67,111,108,111,110,63,48,58,103,46,115,116,114,105,110,103,87,105,100,116,104,40,34, -58,34,41,47,50,41,59,172,100,97,116,101,83,116,114,50,61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83, -79,56,54,48,49,34,63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99, -97,108,101,34,41,46,100,97,116,101,40,100,97,116,101,44,49,41,41,59,172,121,101,97,114,59,172,109,100,59,172,121, -101,97,114,102,105,114,115,116,59,163,40,100,97,116,101,83,116,114,50,46,109,97,116,99,104,40,47,92,100,92,100,92, -100,92,100,36,47,41,41,123,121,101,97,114,61,40,100,97,116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63, -100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,45,52,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97, -108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109,100,61,100,97,116,101,83,116,114,50,46,115,108, -105,99,101,40,48,44,45,52,41,59,163,40,33,109,100,46,101,110,100,115,87,105,116,104,40,34,46,34,41,41,109,100, -61,109,100,46,115,108,105,99,101,40,48,44,45,49,41,59,121,101,97,114,102,105,114,115,116,61,181,59,125,164,123,163, -40,33,100,97,116,101,83,116,114,50,46,109,97,116,99,104,40,47,94,92,100,92,100,92,100,92,100,47,41,41,100,97, -116,101,83,116,114,50,61,105,115,111,83,116,114,40,100,97,116,101,41,59,121,101,97,114,61,40,100,97,116,101,79,110, -83,101,99,115,139,34,89,101,97,114,34,63,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,48,44,52,41,58, -114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109, -100,61,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,53,41,59,121,101,97,114,102,105,114,115,116,61,180,59, -125,163,40,100,97,116,101,79,110,83,101,99,115,139,34,87,101,101,107,100,97,121,34,158,117,112,112,101,114,67,97,115, -101,41,121,101,97,114,61,121,101,97,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70, -111,110,116,65,108,105,103,110,40,48,44,48,41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116, -70,111,110,116,40,34,86,101,99,116,111,114,34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120, -56,34,44,50,41,59,163,40,100,111,67,111,108,111,114,40,41,41,103,46,115,101,116,67,111,108,111,114,40,49,44,48, -44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,109,100,44,120,44,40,121,101,97,114,102,105,114,115,116, -63,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,58,121,41,41,59,103,46,100,114,97,119, -83,116,114,105,110,103,40,121,101,97,114,44,120,44,40,121,101,97,114,102,105,114,115,116,63,121,58,121,43,40,118,101, -99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,41,41,59,125,164,123,103,46,115,101,116,70,111,110,116,65,108, -105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101,99,83,116,114,44,120,44,121,41,59, -125,125,164,123,121,150,40,118,101,99,116,111,114,70,111,110,116,63,53,48,58,40,115,101,99,111,110,100,115,77,111,100, -101,141,34,78,101,118,101,114,34,41,63,53,50,58,52,48,41,59,172,100,97,116,101,83,116,114,61,40,100,97,116,101, -79,110,77,97,105,110,139,34,73,83,79,56,54,48,49,34,63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101, -113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,97,116,101,40,100,97,116,101,44,40,100,97,116,101,79, -110,77,97,105,110,139,34,76,111,110,103,34,63,48,58,49,41,41,41,59,163,40,117,112,112,101,114,67,97,115,101,41, -100,97,116,101,83,116,114,61,100,97,116,101,83,116,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46, -115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103, -46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114,34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116, -40,34,54,120,56,34,44,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,97,116,101,83,116,114,44,120, -44,121,41,59,163,40,99,97,108,87,101,101,107,160,119,101,101,107,68,97,121,41,123,172,100,111,119,99,119,83,116,114, -61,34,34,59,163,40,99,97,108,87,101,101,107,41,100,111,119,99,119,83,116,114,61,34,32,35,34,43,40,34,48,34, -43,73,83,79,56,54,48,49,99,97,108,87,101,101,107,40,100,97,116,101,41,41,46,115,108,105,99,101,40,45,50,41, -59,163,40,119,101,101,107,68,97,121,41,100,111,119,99,119,83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99, -97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,99,97,108,87,101,101,107,63,49,58,48,41,43,100,111,119,99, -119,83,116,114,59,164,100,111,119,99,119,83,116,114,61,34,119,101,101,107,34,43,100,111,119,99,119,83,116,114,59,163, -40,117,112,112,101,114,67,97,115,101,41,100,111,119,99,119,83,116,114,61,100,111,119,99,119,83,116,114,46,116,111,85, -112,112,101,114,67,97,115,101,40,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,100,111,119,99,119,83,116,114, -44,120,44,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58,49,54,41,41,59,125,125,113,117,101,117,101, -68,114,97,119,40,41,59,125,10,108,111,97,100,83,101,116,116,105,110,103,115,40,41,59,10,103,46,99,108,101,97,114, -40,41,59,10,117,112,100,97,116,101,83,116,97,116,101,40,41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,99, -100,80,111,119,101,114,39,44,111,110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97, -110,103,108,101,46,111,110,40,39,108,111,99,107,39,44,111,110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41, -59,125,41,59,10,66,97,110,103,108,101,46,115,101,116,85,73,40,34,99,108,111,99,107,34,41,59,10,66,97,110,103, -108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100, -103,101,116,115,40,41,59,255,176,6,0,0,97,110,116,111,110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115, -0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,172,70,73,76,69,61,34,97,110,116,111,110,99,108,107, -46,106,115,111,110,34,59,172,115,101,116,116,105,110,103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123, -115,101,99,111,110,100,115,79,110,85,110,108,111,99,107,58,181,44,125,44,114,101,113,117,105,114,101,40,39,83,116,111, -114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,70,73,76,69,44,180,41,160,123,125,41,59,170,119,114,105, -116,101,83,101,116,116,105,110,103,115,40,41,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46, -119,114,105,116,101,74,83,79,78,40,70,73,76,69,44,115,101,116,116,105,110,103,115,41,59,125,170,115,116,114,105,110, -103,73,116,101,109,115,40,115,116,97,114,116,118,97,108,117,101,44,119,114,105,116,101,114,44,118,97,108,117,101,115,41, -123,171,123,118,97,108,117,101,58,40,115,116,97,114,116,118,97,108,117,101,139,183,63,48,58,118,97,108,117,101,115,46, -105,110,100,101,120,79,102,40,115,116,97,114,116,118,97,108,117,101,41,41,44,102,111,114,109,97,116,58,118,162,118,97, -108,117,101,115,91,118,93,44,109,105,110,58,48,44,109,97,120,58,118,97,108,117,101,115,46,108,101,110,103,116,104,45, -49,44,119,114,97,112,58,180,44,115,116,101,112,58,49,44,111,110,99,104,97,110,103,101,58,118,162,123,119,114,105,116, -101,114,40,118,97,108,117,101,115,91,118,93,41,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, -59,125,170,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,110,97,109,101,44,118,97,108,117,101,115,41, -123,171,115,116,114,105,110,103,73,116,101,109,115,40,115,101,116,116,105,110,103,115,91,110,97,109,101,93,44,118,162,115, -101,116,116,105,110,103,115,91,110,97,109,101,93,61,118,44,118,97,108,117,101,115,41,59,125,172,109,97,105,110,109,101, -110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,110,116,111,110,32,99,108,111,99,107,34,125,44,34, -60,32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41,44,34,83,101,99,111,110,100,115,46,46,46,34,58,40, -41,162,69,46,115,104,111,119,77,101,110,117,40,115,101,99,109,101,110,117,41,44,34,68,97,116,101,34,58,115,116,114, -105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110,77,97,105,110,34,44,91,34,76,111,110, -103,34,44,34,83,104,111,114,116,34,44,34,73,83,79,56,54,48,49,34,93,41,44,34,83,104,111,119,32,87,101,101, -107,100,97,121,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,141,183, -63,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63, -34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, -119,101,101,107,68,97,121,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,83,104, -111,119,32,67,97,108,87,101,101,107,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,99,97,108, -87,101,101,107,141,183,63,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,58,181,41,44,102,111,114,109,97, -116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, -116,105,110,103,115,46,99,97,108,87,101,101,107,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59, -125,125,44,34,85,112,112,101,114,99,97,115,101,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46, -117,112,112,101,114,67,97,115,101,141,183,63,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,58,180, -41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101, -58,118,162,123,115,101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,61,118,59,119,114,105,116,101,83,101, -116,116,105,110,103,115,40,41,59,125,125,44,34,86,101,99,116,111,114,32,102,111,110,116,34,58,123,118,97,108,117,101, -58,40,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,141,183,63,115,101,116,116,105,110,103,115, -46,118,101,99,116,111,114,70,111,110,116,58,181,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34,58,34, -79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114, -70,111,110,116,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,125,59,172,115,101,99, -109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,83,104,111,119,32,115,101,99,111,110,100,115,46, -46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110, -109,101,110,117,41,44,34,83,104,111,119,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,115, -101,99,111,110,100,115,77,111,100,101,34,44,91,34,78,101,118,101,114,34,44,34,85,110,108,111,99,107,101,100,34,44, -34,65,108,119,97,121,115,34,93,41,44,34,87,105,116,104,32,92,34,58,92,34,34,58,123,118,97,108,117,101,58,40, -115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,141,183,63,115,101,116,116, -105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,58,180,41,44,102,111,114,109,97,116,58, -118,162,118,63,34,79,110,34,58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, -110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,118,59,119,114,105,116,101,83,101,116,116, -105,110,103,115,40,41,59,125,125,44,34,67,111,108,111,114,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110, -103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,141,183,63,115,101,116,116,105,110,103,115,46,115,101, -99,111,110,100,115,67,111,108,111,117,114,101,100,58,180,41,44,102,111,114,109,97,116,58,118,162,118,63,34,79,110,34, -58,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,115,101,99,111, -110,100,115,67,111,108,111,117,114,101,100,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, -44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110, -83,101,99,115,34,44,91,34,89,101,97,114,34,44,34,87,101,101,107,100,97,121,34,44,34,78,111,34,93,41,125,59, -69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,41,59,67,2,0,0,97,110,116,111, -110,99,108,107,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,2,255,255,255,255,255, +43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65,65,47,52,65,65,65,65,80,43,65, +65,47,52,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, +65,65,65,65,61,61,34,41,44,52,54,44,97,116,111,98,40,34,68,104,103,101,70,66,52,101,72,104,52,101,72,104, +52,101,68,119,61,61,34,41,44,54,48,43,40,115,99,97,108,101,143,56,41,43,40,49,143,49,54,41,41,59,125,59, +10,172,115,101,99,111,110,100,115,77,111,100,101,59,10,172,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,59, +10,172,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,59,10,172,100,97,116,101,79,110,77,97,105,110,59, +10,172,100,97,116,101,79,110,83,101,99,115,59,10,172,119,101,101,107,68,97,121,59,10,172,99,97,108,87,101,101,107, +59,10,172,117,112,112,101,114,67,97,115,101,59,10,172,118,101,99,116,111,114,70,111,110,116,59,10,172,100,114,97,119, +84,105,109,101,111,117,116,59,10,172,113,117,101,117,101,77,105,108,108,105,115,61,49,48,48,48,59,10,172,115,101,99, +111,110,100,115,83,99,114,101,101,110,61,180,59,10,172,105,115,66,97,110,103,108,101,49,61,40,112,114,111,99,101,115, +115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,59,10,170,108,111,97,100,83,101,116,116,105,110,103, +115,40,41,123,170,100,101,102,40,118,97,108,117,101,44,100,101,102,41,123,171,118,97,108,117,101,141,183,63,118,97,108, +117,101,58,100,101,102,59,125,172,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97, +103,101,39,41,46,114,101,97,100,74,83,79,78,40,83,69,84,84,73,78,71,83,70,73,76,69,44,180,41,160,123,125, +59,115,101,99,111,110,100,115,77,111,100,101,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100, +115,77,111,100,101,44,34,78,101,118,101,114,34,41,59,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,61,100, +101,102,40,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,44,180,41,59,115, +101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,100,101,102,40,115,101,116,116,105,110,103,115,46,115,101,99, +111,110,100,115,87,105,116,104,67,111,108,111,110,44,180,41,59,100,97,116,101,79,110,77,97,105,110,61,100,101,102,40, +115,101,116,116,105,110,103,115,46,100,97,116,101,79,110,77,97,105,110,44,34,76,111,110,103,34,41,59,100,97,116,101, +79,110,83,101,99,115,61,100,101,102,40,115,101,116,116,105,110,103,115,46,100,97,116,101,79,110,83,101,99,115,44,34, +89,101,97,114,34,41,59,119,101,101,107,68,97,121,61,100,101,102,40,115,101,116,116,105,110,103,115,46,119,101,101,107, +68,97,121,44,180,41,59,99,97,108,87,101,101,107,61,100,101,102,40,115,101,116,116,105,110,103,115,46,99,97,108,87, +101,101,107,44,181,41,59,117,112,112,101,114,67,97,115,101,61,100,101,102,40,115,101,116,116,105,110,103,115,46,117,112, +112,101,114,67,97,115,101,44,180,41,59,118,101,99,116,111,114,70,111,110,116,61,100,101,102,40,115,101,116,116,105,110, +103,115,46,118,101,99,116,111,114,70,111,110,116,44,181,41,59,163,40,100,97,116,101,79,110,83,101,99,115,139,180,41, +100,97,116,101,79,110,83,101,99,115,61,34,89,101,97,114,34,59,163,40,100,97,116,101,79,110,83,101,99,115,139,181, +41,100,97,116,101,79,110,83,101,99,115,61,34,78,111,34,59,125,10,170,113,117,101,117,101,68,114,97,119,40,41,123, +163,40,100,114,97,119,84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,100,114,97,119,84, +105,109,101,111,117,116,41,59,100,114,97,119,84,105,109,101,111,117,116,61,115,101,116,84,105,109,101,111,117,116,40,170, +40,41,123,100,114,97,119,84,105,109,101,111,117,116,61,183,59,100,114,97,119,40,41,59,125,44,113,117,101,117,101,77, +105,108,108,105,115,45,40,68,97,116,101,46,110,111,119,40,41,37,113,117,101,117,101,77,105,108,108,105,115,41,41,59, +125,10,170,117,112,100,97,116,101,83,116,97,116,101,40,41,123,163,40,66,97,110,103,108,101,46,105,115,76,67,68,79, +110,40,41,41,123,163,40,40,115,101,99,111,110,100,115,77,111,100,101,139,34,85,110,108,111,99,107,101,100,34,158,33, +66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,41,160,115,101,99,111,110,100,115,77,111,100,101,139,34, +65,108,119,97,121,115,34,41,123,115,101,99,111,110,100,115,83,99,114,101,101,110,61,180,59,113,117,101,117,101,77,105, +108,108,105,115,61,49,48,48,48,59,125,164,123,115,101,99,111,110,100,115,83,99,114,101,101,110,61,181,59,113,117,101, +117,101,77,105,108,108,105,115,61,54,48,48,48,48,59,125,100,114,97,119,40,41,59,125,164,123,163,40,100,114,97,119, +84,105,109,101,111,117,116,41,99,108,101,97,114,84,105,109,101,111,117,116,40,100,114,97,119,84,105,109,101,111,117,116, +41,59,100,114,97,119,84,105,109,101,111,117,116,61,183,59,125,125,10,170,105,115,111,83,116,114,40,100,97,116,101,41, +123,171,100,97,116,101,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,34,48,34,43,40,100, +97,116,101,46,103,101,116,77,111,110,116,104,40,41,43,49,41,41,46,115,108,105,99,101,40,45,50,41,43,34,45,34, +43,40,34,48,34,43,100,97,116,101,46,103,101,116,68,97,116,101,40,41,41,46,115,108,105,99,101,40,45,50,41,59, +125,10,172,99,97,108,87,101,101,107,66,117,102,102,101,114,61,91,181,44,181,44,181,93,59,10,170,73,83,79,56,54, +48,49,99,97,108,87,101,101,107,40,100,97,116,101,41,123,100,97,116,101,78,111,84,105,109,101,61,100,97,116,101,59, +100,97,116,101,78,111,84,105,109,101,46,115,101,116,72,111,117,114,115,40,48,44,48,44,48,44,48,41,59,163,40,99, +97,108,87,101,101,107,66,117,102,102,101,114,91,48,93,139,100,97,116,101,46,103,101,116,84,105,109,101,122,111,110,101, +79,102,102,115,101,116,40,41,158,99,97,108,87,101,101,107,66,117,102,102,101,114,91,49,93,139,100,97,116,101,78,111, +84,105,109,101,41,171,99,97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,59,99,97,108,87,101,101,107,66,117, +102,102,101,114,91,48,93,61,100,97,116,101,46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41, +59,99,97,108,87,101,101,107,66,117,102,102,101,114,91,49,93,61,100,97,116,101,78,111,84,105,109,101,59,172,116,100, +116,61,184,68,97,116,101,40,100,97,116,101,46,118,97,108,117,101,79,102,40,41,41,59,172,100,97,121,110,61,40,100, +97,116,101,46,103,101,116,68,97,121,40,41,43,54,41,37,55,59,116,100,116,46,115,101,116,68,97,116,101,40,116,100, +116,46,103,101,116,68,97,116,101,40,41,45,100,97,121,110,43,51,41,59,172,102,105,114,115,116,84,104,117,114,115,100, +97,121,61,116,100,116,46,118,97,108,117,101,79,102,40,41,59,116,100,116,46,115,101,116,77,111,110,116,104,40,48,44, +49,41,59,163,40,116,100,116,46,103,101,116,68,97,121,40,41,141,52,41,123,116,100,116,46,115,101,116,77,111,110,116, +104,40,48,44,49,43,40,40,52,45,116,100,116,46,103,101,116,68,97,121,40,41,41,43,55,41,37,55,41,59,125,99, +97,108,87,101,101,107,66,117,102,102,101,114,91,50,93,61,49,43,77,97,116,104,46,99,101,105,108,40,40,102,105,114, +115,116,84,104,117,114,115,100,97,121,45,116,100,116,41,47,54,48,52,56,48,48,48,48,48,41,59,171,99,97,108,87, +101,101,107,66,117,102,102,101,114,91,50,93,59,125,10,170,100,111,67,111,108,111,114,40,41,123,171,33,105,115,66,97, +110,103,108,101,49,158,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,158,115,101,99,111,110,100,115, +67,111,108,111,117,114,101,100,59,125,10,170,100,114,97,119,40,41,123,172,120,61,103,46,103,101,116,87,105,100,116,104, +40,41,47,50,59,172,121,61,103,46,103,101,116,72,101,105,103,104,116,40,41,47,50,45,40,115,101,99,111,110,100,115, +77,111,100,101,141,34,78,101,118,101,114,34,63,50,52,58,40,118,101,99,116,111,114,70,111,110,116,63,49,50,58,48, +41,41,59,103,46,114,101,115,101,116,40,41,59,103,46,99,108,101,97,114,82,101,99,116,40,48,44,50,52,44,103,46, +103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,45,50,52,41,59,172,100,97, +116,101,61,184,68,97,116,101,40,41,59,172,116,105,109,101,83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,46,116,105,109,101,40,100,97,116,101,44,49,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, +110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,65,110,116,111,110,34,41,46,100,114,97,119,83,116,114,105, +110,103,40,116,105,109,101,83,116,114,44,120,44,121,41,59,163,40,115,101,99,111,110,100,115,83,99,114,101,101,110,41, +123,121,150,54,53,59,172,115,101,99,83,116,114,61,40,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,63, +34,58,34,58,34,34,41,43,40,34,48,34,43,100,97,116,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,46, +115,108,105,99,101,40,45,50,41,59,163,40,100,111,67,111,108,111,114,40,41,41,103,46,115,101,116,67,111,108,111,114, +40,48,44,48,44,49,41,59,103,46,115,101,116,70,111,110,116,40,34,65,110,116,111,110,83,109,97,108,108,34,41,59, +163,40,100,97,116,101,79,110,83,101,99,115,141,34,78,111,34,41,123,103,46,115,101,116,70,111,110,116,65,108,105,103, +110,40,49,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,115,101,99,83,116,114,44,103,46,103,101,116,87,105, +100,116,104,40,41,45,40,105,115,66,97,110,103,108,101,49,63,51,50,58,50,41,44,121,41,59,121,151,40,118,101,99, +116,111,114,70,111,110,116,63,49,53,58,49,51,41,59,120,61,103,46,103,101,116,87,105,100,116,104,40,41,47,52,43, +40,105,115,66,97,110,103,108,101,49,63,49,50,58,52,41,43,40,115,101,99,111,110,100,115,87,105,116,104,67,111,108, +111,110,63,48,58,103,46,115,116,114,105,110,103,87,105,100,116,104,40,34,58,34,41,47,50,41,59,172,100,97,116,101, +83,116,114,50,61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83,79,56,54,48,49,34,63,105,115,111,83,116, +114,40,100,97,116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,97,116,101,40,100, +97,116,101,44,49,41,41,59,172,121,101,97,114,59,172,109,100,59,172,121,101,97,114,102,105,114,115,116,59,163,40,100, +97,116,101,83,116,114,50,46,109,97,116,99,104,40,47,92,100,92,100,92,100,92,100,36,47,41,41,123,121,101,97,114, +61,40,100,97,116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63,100,97,116,101,83,116,114,50,46,115,108,105, +99,101,40,45,52,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97,116, +101,44,49,41,41,59,109,100,61,100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,48,44,45,52,41,59,163,40, +33,109,100,46,101,110,100,115,87,105,116,104,40,34,46,34,41,41,109,100,61,109,100,46,115,108,105,99,101,40,48,44, +45,49,41,59,121,101,97,114,102,105,114,115,116,61,181,59,125,164,123,163,40,33,100,97,116,101,83,116,114,50,46,109, +97,116,99,104,40,47,94,92,100,92,100,92,100,92,100,47,41,41,100,97,116,101,83,116,114,50,61,105,115,111,83,116, +114,40,100,97,116,101,41,59,121,101,97,114,61,40,100,97,116,101,79,110,83,101,99,115,139,34,89,101,97,114,34,63, +100,97,116,101,83,116,114,50,46,115,108,105,99,101,40,48,44,52,41,58,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,46,100,111,119,40,100,97,116,101,44,49,41,41,59,109,100,61,100,97,116,101,83,116,114,50,46,115, +108,105,99,101,40,53,41,59,121,101,97,114,102,105,114,115,116,61,180,59,125,163,40,100,97,116,101,79,110,83,101,99, +115,139,34,87,101,101,107,100,97,121,34,158,117,112,112,101,114,67,97,115,101,41,121,101,97,114,61,121,101,97,114,46, +116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, +41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116,70,111,110,116,40,34,86,101,99,116,111,114, +34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,163,40,100,111,67,111, +108,111,114,40,41,41,103,46,115,101,116,67,111,108,111,114,40,49,44,48,44,48,41,59,103,46,100,114,97,119,83,116, +114,105,110,103,40,109,100,44,120,44,40,121,101,97,114,102,105,114,115,116,63,121,43,40,118,101,99,116,111,114,70,111, +110,116,63,50,54,58,49,54,41,58,121,41,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,121,101,97,114,44, +120,44,40,121,101,97,114,102,105,114,115,116,63,121,58,121,43,40,118,101,99,116,111,114,70,111,110,116,63,50,54,58, +49,54,41,41,41,59,125,164,123,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97, +119,83,116,114,105,110,103,40,115,101,99,83,116,114,44,120,44,121,41,59,125,125,164,123,121,150,40,118,101,99,116,111, +114,70,111,110,116,63,53,48,58,40,115,101,99,111,110,100,115,77,111,100,101,141,34,78,101,118,101,114,34,41,63,53, +50,58,52,48,41,59,172,100,97,116,101,83,116,114,61,40,100,97,116,101,79,110,77,97,105,110,139,34,73,83,79,56, +54,48,49,34,63,105,115,111,83,116,114,40,100,97,116,101,41,58,114,101,113,117,105,114,101,40,34,108,111,99,97,108, +101,34,41,46,100,97,116,101,40,100,97,116,101,44,40,100,97,116,101,79,110,77,97,105,110,139,34,76,111,110,103,34, +63,48,58,49,41,41,41,59,163,40,117,112,112,101,114,67,97,115,101,41,100,97,116,101,83,116,114,61,100,97,116,101, +83,116,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110, +40,48,44,48,41,59,163,40,118,101,99,116,111,114,70,111,110,116,41,103,46,115,101,116,70,111,110,116,40,34,86,101, +99,116,111,114,34,44,50,52,41,59,164,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,50,41,59,103,46, +100,114,97,119,83,116,114,105,110,103,40,100,97,116,101,83,116,114,44,120,44,121,41,59,163,40,99,97,108,87,101,101, +107,160,119,101,101,107,68,97,121,41,123,172,100,111,119,99,119,83,116,114,61,34,34,59,163,40,99,97,108,87,101,101, +107,41,100,111,119,99,119,83,116,114,61,34,32,35,34,43,40,34,48,34,43,73,83,79,56,54,48,49,99,97,108,87, +101,101,107,40,100,97,116,101,41,41,46,115,108,105,99,101,40,45,50,41,59,163,40,119,101,101,107,68,97,121,41,100, +111,119,99,119,83,116,114,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,100,97, +116,101,44,99,97,108,87,101,101,107,63,49,58,48,41,43,100,111,119,99,119,83,116,114,59,164,100,111,119,99,119,83, +116,114,61,34,119,101,101,107,34,43,100,111,119,99,119,83,116,114,59,163,40,117,112,112,101,114,67,97,115,101,41,100, +111,119,99,119,83,116,114,61,100,111,119,99,119,83,116,114,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,100,111,119,99,119,83,116,114,44,120,44,121,43,40,118,101,99,116,111,114, +70,111,110,116,63,50,54,58,49,54,41,41,59,125,125,113,117,101,117,101,68,114,97,119,40,41,59,125,10,108,111,97, +100,83,101,116,116,105,110,103,115,40,41,59,10,103,46,99,108,101,97,114,40,41,59,10,117,112,100,97,116,101,83,116, +97,116,101,40,41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,111,110,162,123, +117,112,100,97,116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97,110,103,108,101,46,111,110,40,39,108,111,99, +107,39,44,111,110,162,123,117,112,100,97,116,101,83,116,97,116,101,40,41,59,125,41,59,10,66,97,110,103,108,101,46, +115,101,116,85,73,40,34,99,108,111,99,107,34,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101, +116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,255,44,6,0,0, +97,110,116,111,110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,40,170,40,98, +97,99,107,41,123,172,70,73,76,69,61,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,59,172,115,101,116,116, +105,110,103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,115,101,99,111,110,100,115,79,110,85,110,108, +111,99,107,58,181,44,125,44,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74, +83,79,78,40,70,73,76,69,44,180,41,160,123,125,41,59,170,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41, +123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,74,83,79,78,40,70,73, +76,69,44,115,101,116,116,105,110,103,115,41,59,125,170,115,116,114,105,110,103,73,116,101,109,115,40,115,116,97,114,116, +118,97,108,117,101,44,119,114,105,116,101,114,44,118,97,108,117,101,115,41,123,171,123,118,97,108,117,101,58,40,115,116, +97,114,116,118,97,108,117,101,139,183,63,48,58,118,97,108,117,101,115,46,105,110,100,101,120,79,102,40,115,116,97,114, +116,118,97,108,117,101,41,41,44,102,111,114,109,97,116,58,118,162,118,97,108,117,101,115,91,118,93,44,109,105,110,58, +48,44,109,97,120,58,118,97,108,117,101,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,115,116,101, +112,58,49,44,111,110,99,104,97,110,103,101,58,118,162,123,119,114,105,116,101,114,40,118,97,108,117,101,115,91,118,93, +41,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,170,115,116,114,105,110,103,73,110,83, +101,116,116,105,110,103,115,40,110,97,109,101,44,118,97,108,117,101,115,41,123,171,115,116,114,105,110,103,73,116,101,109, +115,40,115,101,116,116,105,110,103,115,91,110,97,109,101,93,44,118,162,115,101,116,116,105,110,103,115,91,110,97,109,101, +93,61,118,44,118,97,108,117,101,115,41,59,125,172,109,97,105,110,109,101,110,117,61,123,34,34,58,123,34,116,105,116, +108,101,34,58,34,65,110,116,111,110,32,99,108,111,99,107,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,98, +97,99,107,40,41,44,34,83,101,99,111,110,100,115,46,46,46,34,58,40,41,162,69,46,115,104,111,119,77,101,110,117, +40,115,101,99,109,101,110,117,41,44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103, +115,40,34,100,97,116,101,79,110,77,97,105,110,34,44,91,34,76,111,110,103,34,44,34,83,104,111,114,116,34,44,34, +73,83,79,56,54,48,49,34,93,41,44,34,83,104,111,119,32,87,101,101,107,100,97,121,34,58,123,118,97,108,117,101, +58,40,115,101,116,116,105,110,103,115,46,119,101,101,107,68,97,121,141,183,63,115,101,116,116,105,110,103,115,46,119,101, +101,107,68,97,121,58,180,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,119,101, +101,107,68,97,121,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,83,104,111,119, +32,67,97,108,87,101,101,107,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,99,97,108,87,101, +101,107,141,183,63,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,58,181,41,44,111,110,99,104,97,110,103, +101,58,118,162,123,115,101,116,116,105,110,103,115,46,99,97,108,87,101,101,107,61,118,59,119,114,105,116,101,83,101,116, +116,105,110,103,115,40,41,59,125,125,44,34,85,112,112,101,114,99,97,115,101,34,58,123,118,97,108,117,101,58,40,115, +101,116,116,105,110,103,115,46,117,112,112,101,114,67,97,115,101,141,183,63,115,101,116,116,105,110,103,115,46,117,112,112, +101,114,67,97,115,101,58,180,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,117, +112,112,101,114,67,97,115,101,61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,86, +101,99,116,111,114,32,102,111,110,116,34,58,123,118,97,108,117,101,58,40,115,101,116,116,105,110,103,115,46,118,101,99, +116,111,114,70,111,110,116,141,183,63,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116,58,181,41, +44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,118,101,99,116,111,114,70,111,110,116, +61,118,59,119,114,105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,125,59,172,115,101,99,109,101,110,117, +61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,83,104,111,119,32,115,101,99,111,110,100,115,46,46,46,34,125, +44,34,60,32,66,97,99,107,34,58,40,41,162,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117, +41,44,34,83,104,111,119,34,58,115,116,114,105,110,103,73,110,83,101,116,116,105,110,103,115,40,34,115,101,99,111,110, +100,115,77,111,100,101,34,44,91,34,78,101,118,101,114,34,44,34,85,110,108,111,99,107,101,100,34,44,34,65,108,119, +97,121,115,34,93,41,44,34,87,105,116,104,32,92,34,58,92,34,34,58,123,118,97,108,117,101,58,40,115,101,116,116, +105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,141,183,63,115,101,116,116,105,110,103,115, +46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,58,180,41,44,111,110,99,104,97,110,103,101,58,118,162, +123,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,87,105,116,104,67,111,108,111,110,61,118,59,119,114,105, +116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,67,111,108,111,114,34,58,123,118,97,108,117,101,58,40, +115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,141,183,63,115,101,116,116,105, +110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,58,180,41,44,111,110,99,104,97,110,103,101,58, +118,162,123,115,101,116,116,105,110,103,115,46,115,101,99,111,110,100,115,67,111,108,111,117,114,101,100,61,118,59,119,114, +105,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,34,68,97,116,101,34,58,115,116,114,105,110,103,73,110, +83,101,116,116,105,110,103,115,40,34,100,97,116,101,79,110,83,101,99,115,34,44,91,34,89,101,97,114,34,44,34,87, +101,101,107,100,97,121,34,44,34,78,111,34,93,41,125,59,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109, +101,110,117,41,59,125,41,59,67,2,0,0,97,110,116,111,110,99,108,107,46,105,109,103,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,48,48,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,175,254,175,255,255,234,250,170,170,255,255,240,15,244,11, +255,255,64,240,0,0,191,255,144,15,208,11,255,253,0,240,0,0,191,252,0,12,0,11,255,208,0,240,0,0,191,252, +0,12,0,11,85,208,0,245,85,0,255,252,16,12,16,10,0,208,0,255,253,0,255,254,240,14,240,11,0,239,0,255, +252,1,255,255,240,15,240,10,0,255,0,255,252,2,255,255,240,15,240,11,255,255,0,255,240,3,255,255,240,15,240,11, +255,255,0,255,240,11,255,255,240,15,240,11,255,255,0,255,208,15,255,255,240,15,240,11,255,255,0,255,192,15,255,255, +240,15,240,11,255,255,0,255,192,47,255,255,240,15,240,11,21,255,0,255,0,63,255,255,240,15,240,10,0,255,0,255, +0,127,255,255,240,15,240,11,0,255,0,255,0,191,255,255,240,15,240,10,0,255,0,254,0,191,255,255,240,15,240,11, +255,255,0,253,0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255, +240,15,240,11,255,255,0,252,2,255,255,255,240,15,240,15,255,255,0,248,2,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,173,173,175,254,186,191,250,249,234,251,255,255,173,189,239,255, +239,191,255,170,190,235,255,255,250,253,191,254,191,191,250,235,171,251,255,255,174,175,255,250,190,191,250,186,234,230,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -254,175,254,175,255,255,234,250,170,170,255,255,240,15,244,11,255,255,64,240,0,0,191,255,144,15,208,11,255,253,0,240, -0,0,191,252,0,12,0,11,255,208,0,240,0,0,191,252,0,12,0,11,85,208,0,245,85,0,255,252,16,12,16,10, -0,208,0,255,253,0,255,254,240,14,240,11,0,239,0,255,252,1,255,255,240,15,240,10,0,255,0,255,252,2,255,255, -240,15,240,11,255,255,0,255,240,3,255,255,240,15,240,11,255,255,0,255,240,11,255,255,240,15,240,11,255,255,0,255, -208,15,255,255,240,15,240,11,255,255,0,255,192,15,255,255,240,15,240,11,255,255,0,255,192,47,255,255,240,15,240,11, -21,255,0,255,0,63,255,255,240,15,240,10,0,255,0,255,0,127,255,255,240,15,240,11,0,255,0,255,0,191,255,255, -240,15,240,10,0,255,0,254,0,191,255,255,240,15,240,11,255,255,0,253,0,255,255,255,240,15,240,11,255,255,0,252, -0,255,255,255,240,15,240,11,255,255,0,252,0,255,255,255,240,15,240,11,255,255,0,252,2,255,255,255,240,15,240,15, -255,255,0,248,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -173,173,175,254,186,191,250,249,234,251,255,255,173,189,239,255,239,191,255,170,190,235,255,255,250,253,191,254,191,191,250,235, -171,251,255,255,174,175,255,250,190,191,250,186,234,230,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,228,0,0,0, -97,110,116,111,110,99,108,107,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100, -34,58,34,97,110,116,111,110,99,108,107,34,44,34,110,97,109,101,34,58,34,65,110,116,111,110,32,67,108,111,99,107, -34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34,44,34,115,114,99,34,58,34,97,110,116,111,110,99,108,107, -46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34, -118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34, -102,105,108,101,115,34,58,34,97,110,116,111,110,99,108,107,46,105,110,102,111,44,97,110,116,111,110,99,108,107,46,97, -112,112,46,106,115,44,97,110,116,111,110,99,108,107,46,115,101,116,116,105,110,103,115,46,106,115,44,97,110,116,111,110, -99,108,107,46,105,109,103,34,44,34,100,97,116,97,34,58,34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,125, -99,56,0,0,97,98,111,117,116,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97, -119,87,105,100,103,101,116,115,40,41,59,10,172,87,61,103,46,103,101,116,87,105,100,116,104,40,41,44,72,61,103,46, -103,101,116,72,101,105,103,104,116,40,41,59,10,172,69,78,86,61,112,114,111,99,101,115,115,46,101,110,118,59,10,172, -77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111,114,121,40,41,59,10,172,115,61,114,101,113,117,105,114,101, -40,34,83,116,111,114,97,103,101,34,41,59,10,172,105,109,103,61,97,116,111,98,40,34,115,73,119,68,107,109,50,83, -54,54,68,89,119,65,50,65,65,65,65,65,72,65,72,71,83,82,120,74,69,107,65,65,103,109,71,71,66,120,68,73, -65,68,73,100,65,70,74,73,98,65,72,70,57,72,80,48,48,107,66,85,67,54,68,116,122,68,103,65,105,87,79,120, -119,107,103,65,71,98,65,56,54,67,87,50,50,50,50,107,107,103,66,52,104,79,50,54,47,88,68,68,119,65,119,107, -69,69,69,103,89,89,65,43,86,87,50,50,119,69,65,65,103,103,119,69,109,50,65,90,90,90,84,70,111,116,77,73, -68,65,65,57,118,66,53,50,48,65,74,85,110,88,65,116,119,65,103,65,105,71,120,79,119,50,119,111,43,98,65,109, -105,83,65,72,52,65,81,85,107,65,72,77,107,79,50,47,54,54,84,89,50,71,119,103,103,103,103,104,66,53,47,43, -83,82,120,74,65,69,65,65,108,109,50,69,104,120,83,84,76,75,89,70,70,70,66,65,68,65,47,57,57,72,80,48, -48,107,72,111,67,54,68,117,122,65,65,65,67,87,79,120,119,107,103,43,117,122,71,56,54,67,81,72,55,98,83,85, -103,65,66,43,105,83,81,65,65,65,68,68,65,65,116,69,107,69,107,65,65,65,65,50,107,104,120,73,65,72,65,65, -103,109,71,76,65,68,75,68,76,76,111,65,65,65,69,68,68,83,81,81,67,65,65,65,65,65,72,65,52,65,65,117, -119,65,65,65,65,81,68,68,68,68,68,65,119,65,73,73,65,65,77,103,65,89,81,85,65,65,65,52,105,111,110,103, -65,73,65,71,65,66,113,69,107,107,107,65,72,72,71,71,104,104,120,73,72,72,88,97,54,54,65,68,89,98,83,83, -67,99,69,72,122,85,66,68,98,81,67,83,83,81,65,65,65,65,72,65,116,116,68,68,68,68,65,65,67,81,68,68, -68,68,65,49,52,71,71,71,65,66,69,69,65,89,81,87,66,65,73,68,105,81,56,52,65,65,111,119,120,73,89,81, -107,107,105,83,52,103,52,50,107,104,120,73,65,52,105,110,78,80,65,65,49,119,65,111,84,107,107,65,66,67,83,65, -65,83,81,81,105,107,109,50,83,81,72,65,70,65,65,65,71,119,65,65,65,65,111,116,111,111,117,74,119,65,73,73, -65,66,69,103,89,89,65,65,74,73,73,111,67,73,56,52,65,70,116,50,120,74,67,52,69,107,98,89,69,69,72,80, -65,66,120,73,65,65,102,83,113,113,83,81,49,119,70,67,99,69,69,65,65,67,83,65,65,65,65,65,103,103,109,65, -67,116,118,47,57,49,103,71,103,69,119,72,47,65,116,111,70,70,71,50,119,71,71,65,65,66,69,69,68,89,65,65, -74,74,65,116,65,73,50,71,119,57,116,119,119,119,102,52,65,109,50,65,72,47,53,53,65,82,48,107,48,82,65,72, -78,80,75,116,50,49,111,84,52,65,65,111,70,67,83,104,89,67,83,65,103,107,109,119,67,116,65,65,70,87,111,87, -103,69,121,67,83,65,111,116,116,111,117,98,50,71,65,65,65,65,77,103,65,65,65,65,74,74,65,70,67,65,119,119, -119,57,70,65,71,49,116,52,57,116,104,53,65,103,47,80,69,82,50,50,84,47,65,67,54,54,75,111,112,117,67,100, -56,107,107,115,65,69,65,84,81,67,65,65,103,103,109,70,67,116,115,110,70,97,119,71,103,69,119,69,107,65,65,65, -68,98,117,116,119,71,65,73,66,73,65,65,65,65,65,74,109,104,73,89,65,65,119,65,51,53,120,65,103,50,50,52, -57,116,53,80,65,65,52,65,69,82,121,83,77,43,52,107,65,69,105,107,70,111,122,111,43,50,50,118,74,80,65,90, -103,67,67,69,65,103,109,50,67,116,103,65,116,116,71,118,71,119,66,74,65,65,65,71,65,68,71,71,71,71,120,66, -66,65,65,65,74,66,66,77,107,107,73,65,83,81,65,65,53,43,50,69,69,48,122,98,57,116,110,47,65,72,52,117, -65,82,49,116,111,47,65,110,52,107,107,107,103,67,101,65,57,116,116,115,65,69,65,65,65,67,83,65,65,65,65,65, -65,116,103,65,111,111,65,71,65,65,66,65,65,120,119,71,65,68,71,71,71,65,65,73,66,73,65,65,73,66,66,77, -107,107,80,47,81,85,107,65,72,53,120,65,110,71,76,68,52,65,65,69,107,65,81,117,81,82,116,83,86,52,65,69, -65,69,107,107,65,84,111,119,52,65,65,65,65,65,83,106,68,70,67,83,65,65,65,65,81,65,103,65,116,111,65,111, -65,65,66,73,65,118,103,71,68,68,71,50,71,65,65,65,65,65,71,119,74,66,65,74,107,104,80,74,83,71,50,67, -83,119,65,65,67,84,122,98,52,69,69,65,103,71,67,117,81,81,116,121,49,52,72,107,65,119,107,103,103,100,65,71, -52,65,81,65,65,65,48,122,68,70,67,65,67,50,119,68,68,65,69,110,116,111,72,49,57,65,116,50,65,121,119,71, -65,89,71,71,65,65,65,65,65,65,119,65,65,65,65,66,77,74,72,47,81,81,65,65,67,71,65,65,83,70,89,65, -52,68,106,65,103,119,67,117,67,65,116,83,49,111,65,65,66,74,69,69,68,98,98,98,98,98,98,89,65,65,105,84, -98,116,113,86,67,98,89,81,81,81,65,65,116,116,65,98,114,70,65,71,65,81,65,71,50,71,71,71,71,119,65,65, -65,81,119,119,65,65,65,107,104,73,71,109,76,84,73,107,67,119,68,65,67,52,80,73,65,65,65,65,103,65,81,117, -81,65,116,74,78,111,65,65,66,65,77,110,47,74,73,65,73,77,65,69,69,65,65,68,68,70,67,50,49,65,111,68, -68,65,65,65,65,65,65,98,114,65,117,50,83,82,74,65,65,73,65,65,65,65,65,65,65,65,119,71,65,65,65,107, -103,65,69,107,78,75,54,105,67,68,68,65,65,65,43,80,65,68,98,65,71,50,65,117,67,65,116,74,86,111,73,111, -112,83,69,122,55,74,65,65,66,69,103,69,103,65,65,68,68,70,67,119,119,65,65,65,81,67,67,65,65,65,65,98, -114,65,70,65,81,81,73,65,74,73,65,75,99,117,52,65,65,67,71,119,65,72,47,107,110,47,71,109,106,97,83,107, -83,65,90,66,89,65,74,52,65,68,114,65,71,70,65,117,65,81,70,75,78,65,65,116,112,74,109,88,118,66,78,66, -73,77,107,69,69,65,65,68,68,70,67,50,119,74,74,73,65,85,85,81,65,65,65,65,70,70,111,65,83,81,77,103, -104,73,65,65,65,65,65,65,65,67,65,65,65,47,72,52,47,72,65,65,90,75,54,69,72,65,52,73,65,65,65,65, -65,68,98,68,89,70,65,117,65,67,70,114,116,111,119,70,66,77,121,100,73,66,65,65,66,69,103,71,50,50,65,65, -65,69,115,51,119,65,76,98,65,85,85,81,65,65,66,74,65,67,81,83,65,70,73,103,103,56,107,56,47,107,110,56, -65,65,67,97,65,65,74,47,52,65,71,111,81,82,89,107,69,47,66,66,47,43,65,71,65,65,65,89,65,65,116,65, -119,65,86,118,100,117,50,65,74,109,84,111,65,66,73,65,73,77,65,119,65,65,119,65,65,103,103,110,47,52,76,65, -65,69,85,65,65,65,66,65,73,81,67,65,86,108,119,72,65,43,50,50,43,43,43,51,65,65,119,72,47,66,120,74, -65,89,69,65,103,72,72,65,72,72,65,65,100,50,119,50,50,69,65,68,65,65,65,65,65,65,113,111,55,111,119,66, -75,83,100,73,65,65,52,52,65,65,65,71,71,50,65,65,65,69,107,65,47,47,76,65,65,65,103,65,65,52,66,65, -73,83,83,65,86,117,50,65,65,54,113,54,54,54,54,88,69,107,119,72,47,66,73,73,68,98,68,103,103,110,52,70, -111,109,119,65,77,87,71,71,71,69,65,65,89,65,65,65,65,69,116,115,72,100,111,65,106,84,112,119,65,65,69,65, -65,65,65,71,65,65,65,98,98,89,103,72,73,52,76,70,100,72,72,67,50,65,66,66,65,81,67,83,108,111,119,107, -65,55,98,55,55,55,55,102,69,65,119,72,47,73,73,65,98,98,97,65,107,65,65,49,115,71,71,65,83,87,69,109, -119,69,103,98,69,72,69,65,65,65,120,79,116,70,112,74,122,100,80,65,65,65,52,52,65,65,65,65,50,119,65,65, -89,65,65,66,74,76,98,68,68,72,52,67,71,65,66,74,65,81,67,107,108,65,72,99,65,47,57,57,57,57,118,57, -69,107,67,97,65,74,73,65,68,98,66,111,103,108,117,50,65,109,119,71,83,87,103,109,71,69,56,52,72,47,47,65, -65,65,67,81,65,65,73,104,82,112,52,111,67,65,56,52,65,67,83,83,119,65,65,89,89,111,65,72,73,52,65,70, -100,65,65,67,83,74,74,74,74,74,74,107,108,65,119,107,65,68,65,65,89,65,71,65,69,65,65,98,89,77,73,65, -65,89,65,65,103,108,50,49,65,71,71,71,83,81,107,103,65,69,109,103,65,52,52,83,83,83,83,73,69,66,71,97, -100,80,65,103,107,103,47,105,83,83,74,75,71,65,65,68,89,72,72,67,81,65,65,72,88,65,65,65,89,65,65,65, -65,66,77,107,111,65,119,107,65,68,65,68,65,81,49,119,69,65,68,70,65,103,103,65,65,65,65,68,76,50,50,116, -65,50,65,119,67,65,103,103,73,69,56,52,67,72,65,87,121,50,83,76,111,73,109,98,112,103,103,89,103,103,107,105, -116,116,74,75,65,89,65,65,65,72,72,86,113,66,103,83,83,83,47,107,73,71,65,119,119,120,74,107,111,65,65,65, -65,68,65,89,65,81,71,65,72,47,68,117,111,107,103,69,69,103,50,65,97,117,50,116,111,65,65,65,105,103,119,66, -66,65,65,65,66,47,52,83,83,83,81,74,66,69,121,100,56,52,89,81,107,103,65,67,83,83,74,75,74,74,74,107, -107,72,72,81,67,65,110,83,54,83,47,107,89,119,119,119,119,120,53,107,111,65,119,89,89,68,68,50,81,81,65,71, -72,88,68,70,68,108,103,69,65,103,119,120,86,108,50,116,65,107,103,69,107,107,74,65,73,119,65,65,66,107,103,83, -83,83,81,76,111,109,84,53,47,103,67,73,68,65,68,65,65,67,83,83,81,81,81,47,47,72,47,67,81,65,103,87, -65,83,47,107,73,50,119,50,119,120,74,107,111,65,119,89,65,68,101,50,67,65,65,103,103,47,68,65,68,70,65,69, -65,103,50,67,76,77,56,108,111,66,103,65,110,103,66,65,65,103,103,81,65,65,65,83,83,83,81,74,69,121,100,80, -56,52,73,65,68,68,68,72,88,65,65,65,65,65,65,83,83,65,65,65,68,98,65,65,65,83,47,107,89,119,119,119, -119,66,53,107,78,65,65,89,89,68,101,50,65,65,69,71,69,72,65,98,89,108,65,65,107,65,119,122,90,102,47,57, -66,66,103,69,47,56,71,71,65,98,89,65,65,65,71,65,69,98,65,73,109,84,115,69,103,66,74,65,68,89,89,72, -54,65,65,68,98,65,65,65,65,65,65,77,73,89,50,119,50,119,50,107,73,119,119,119,119,119,74,74,78,65,65,65, -65,68,68,119,65,65,103,71,65,103,65,65,69,70,89,65,65,65,65,69,76,77,56,108,112,66,103,65,110,103,66,74, -65,103,103,65,67,65,65,65,69,89,90,69,121,100,73,103,73,69,107,72,110,65,65,67,83,81,71,50,122,66,83,74, -108,108,73,74,76,81,71,65,119,65,50,107,65,65,65,65,65,65,75,83,73,65,72,47,65,68,65,89,65,83,72,77, -98,116,98,104,52,107,65,65,65,65,119,70,74,89,65,65,66,66,103,71,87,87,87,87,65,65,119,65,65,65,65,69, -69,98,65,109,84,112,119,104,79,69,69,69,107,71,74,119,65,65,65,50,89,98,65,65,108,65,73,77,76,98,48,119, -50,119,69,107,69,65,103,110,74,74,75,83,73,65,52,65,52,68,65,68,65,67,72,77,107,107,107,104,52,72,65,65, -65,65,83,71,84,74,74,73,103,73,103,65,65,65,65,65,69,56,56,56,56,71,50,65,103,89,99,121,100,69,50,109, -74,65,66,72,110,71,107,119,81,67,65,50,89,89,65,65,65,74,120,73,65,65,65,65,119,65,69,107,69,103,103,47, -79,50,76,74,73,65,111,65,111,65,65,65,70,107,115,65,107,67,83,83,72,65,72,65,65,66,74,80,89,79,101,73, -69,107,65,65,65,71,79,69,107,81,65,65,65,71,50,65,69,107,109,107,104,66,107,50,120,65,65,67,83,66,107,73, -65,65,65,119,65,69,103,103,65,65,73,65,72,47,107,104,74,65,69,107,69,69,103,74,79,49,78,65,65,70,106,68, -108,65,65,71,65,115,103,65,103,71,50,87,65,65,65,65,119,120,74,79,103,76,76,73,65,65,68,98,52,66,120,65, -103,81,69,65,107,71,50,65,69,69,105,99,73,65,69,65,65,65,65,107,105,48,65,65,67,65,65,65,65,69,69,103, -65,65,73,65,72,47,107,104,74,65,52,52,69,65,103,65,50,70,116,65,65,70,107,99,108,65,71,71,71,69,65,65, -107,71,121,50,52,72,74,52,65,65,74,70,111,68,98,65,65,47,65,68,52,71,79,65,105,81,69,69,65,109,50,65, -77,109,106,107,107,74,48,119,47,52,65,67,105,103,119,67,65,65,85,107,107,107,107,103,65,65,65,65,72,47,107,104, -74,65,72,65,65,65,65,71,119,65,68,65,65,65,99,107,101,65,71,71,71,65,65,65,69,71,87,50,65,73,65,65, -67,65,66,74,119,70,89,65,65,65,68,68,65,65,67,81,65,90,89,107,69,109,81,81,69,121,108,73,66,78,48,49, -47,52,65,65,103,119,68,65,83,83,72,47,47,56,107,103,65,65,65,65,65,52,69,65,73,67,88,107,71,52,69,56, -50,65,98,65,103,107,106,106,71,119,65,119,119,65,65,72,107,67,83,83,72,65,72,69,107,107,66,74,73,70,119,89, -65,72,65,89,107,107,103,101,89,76,73,65,65,87,83,81,107,69,104,65,66,74,65,69,103,65,65,71,65,103,89,89, -69,103,66,74,74,73,107,65,65,65,65,111,65,65,65,65,65,65,88,103,72,79,80,47,65,119,65,65,47,47,52,89, -50,65,65,65,52,52,52,52,52,65,116,111,83,88,65,69,69,69,66,74,81,69,71,89,65,72,65,65,65,103,81,89, -89,90,89,65,65,88,82,85,69,100,103,65,65,73,103,103,106,65,65,65,109,65,98,89,69,65,65,65,65,65,65,50, -98,107,57,111,70,52,69,72,78,116,72,65,109,48,48,56,65,73,65,65,74,74,73,65,71,121,83,81,52,52,52,72, -65,65,65,111,81,65,103,65,65,65,65,99,103,69,65,119,65,72,65,65,65,103,67,107,103,65,65,65,65,83,81,109, -85,112,103,65,65,73,69,106,98,98,65,65,65,65,89,90,69,103,69,56,72,47,65,71,65,119,70,113,86,111,65,72, -72,66,65,50,72,79,73,69,87,65,65,65,80,107,107,107,103,81,69,81,69,65,110,72,72,65,70,65,83,65,98,50, -81,81,65,106,89,89,89,98,102,72,65,65,65,103,65,69,71,119,65,65,119,66,69,121,99,73,103,65,65,65,103,106, -67,68,65,69,83,81,65,81,65,103,69,56,69,107,65,71,71,69,77,86,113,65,65,88,57,112,73,119,71,52,67,81, -105,65,65,65,80,110,47,47,52,65,107,81,103,103,103,52,72,87,86,65,81,65,102,50,65,65,65,99,65,69,107,65, -65,54,83,83,81,103,65,69,71,66,74,72,65,65,109,107,104,65,65,65,65,69,103,103,55,52,56,56,54,65,72,88, -69,103,56,107,65,47,52,71,119,66,70,86,111,65,65,88,72,66,65,50,83,83,81,83,69,65,65,65,80,104,74,74, -73,81,105,65,107,103,104,53,68,65,68,65,83,87,53,57,81,81,65,106,83,81,105,65,65,67,81,67,88,47,65,69, -65,120,65,65,66,65,120,107,77,100,71,65,50,65,71,65,68,65,110,47,105,65,119,81,119,65,65,65,72,47,47,71, -71,66,70,86,83,65,65,88,70,65,65,65,111,111,65,73,65,65,65,65,107,107,103,65,107,107,103,65,103,103,110,72, -111,50,119,111,65,119,119,65,65,65,65,99,81,65,105,65,65,97,86,97,82,74,65,107,109,120,73,65,66,104,82,104, -84,114,50,119,119,119,119,119,73,73,56,56,54,72,65,65,72,65,65,65,65,107,103,71,65,48,77,86,113,65,65,81, -65,65,65,65,116,111,111,65,65,65,105,65,47,47,52,65,52,65,65,65,65,65,66,53,103,119,119,103,69,71,69,65, -70,65,103,106,83,65,67,81,65,113,84,67,88,80,65,65,65,66,65,65,66,82,100,73,85,100,50,119,119,119,50,119, -67,65,72,110,83,67,67,67,65,65,65,65,69,69,69,65,65,65,66,113,81,66,74,117,50,65,65,89,111,111,111,81, -65,69,65,81,74,74,73,83,83,81,65,65,52,52,52,65,65,119,119,74,73,107,103,65,98,89,119,99,81,68,98,65, -70,89,100,65,72,80,65,65,65,66,65,65,104,74,112,65,83,119,49,78,50,65,119,119,65,65,122,98,65,65,69,85, -81,119,65,65,57,103,103,52,65,65,69,116,111,65,66,111,66,65,68,68,65,65,72,72,65,65,105,65,65,88,110,47, -65,116,111,65,65,65,65,65,65,71,65,66,65,69,65,65,68,65,81,106,81,103,89,65,65,69,69,69,65,65,65,65, -65,72,65,98,97,102,73,74,73,119,65,73,65,65,116,111,65,71,50,89,66,74,77,107,81,47,52,72,52,69,65,47, -65,69,73,65,65,66,74,111,104,67,68,98,65,72,65,119,65,65,103,81,65,52,53,74,65,50,119,65,65,65,98,89, -65,65,65,74,67,69,67,65,89,89,65,99,65,89,90,66,74,65,50,119,65,119,65,65,65,54,52,98,98,54,52,73, -119,119,65,119,65,65,111,111,67,67,111,83,81,74,77,85,81,107,103,116,118,65,72,65,98,89,65,65,71,120,65,111, -65,67,68,65,65,65,47,52,65,65,67,73,73,110,85,107,98,98,89,65,65,68,68,68,98,98,98,89,65,85,81,65, -65,65,104,65,65,98,102,66,53,69,69,69,71,71,79,79,54,52,65,98,100,65,65,74,71,83,81,111,65,65,116,111, -67,83,111,83,82,73,65,65,65,119,65,116,111,47,52,65,65,52,65,65,71,71,74,98,98,97,65,98,65,65,52,52, -65,73,73,73,73,81,66,73,98,65,65,89,65,68,68,68,116,116,116,118,72,69,65,65,71,65,43,81,107,83,118,66, -53,65,65,65,65,120,120,120,83,81,116,98,100,111,65,73,65,83,81,119,65,65,111,65,105,67,116,81,81,80,47,47, -52,119,65,116,118,103,110,65,119,52,83,65,71,71,65,65,65,47,72,65,65,73,65,65,65,66,65,73,73,52,107,107, -65,65,65,68,52,65,98,89,47,47,47,55,55,69,88,78,107,103,79,56,103,83,73,65,65,116,111,65,67,65,79,48, -54,52,114,98,98,117,65,73,65,83,81,65,65,65,111,119,103,65,69,48,66,80,74,74,52,68,89,102,56,69,69,47, -98,89,83,81,71,71,65,65,72,65,53,65,65,73,103,103,103,81,81,74,73,66,74,74,73,65,65,65,89,65,80,73, -116,116,116,118,47,69,122,106,69,65,65,85,107,82,76,65,68,114,111,107,105,81,77,65,65,98,98,98,98,98,89,73, -119,65,65,72,103,68,65,109,103,65,71,79,65,68,65,65,89,68,98,89,52,103,103,52,65,65,81,65,71,119,67,56, -65,47,72,65,47,74,69,69,65,67,65,69,69,83,65,65,116,116,65,65,68,65,47,52,98,98,98,89,52,65,73,65, -103,103,73,66,107,74,76,116,114,116,111,50,119,81,79,109,65,99,106,106,106,107,89,65,65,65,65,72,107,74,89,48, -119,68,69,48,65,66,47,47,73,65,98,65,65,69,109,82,65,67,83,65,65,65,67,56,65,103,103,65,47,67,113,113, -65,103,103,71,109,83,65,70,65,65,111,70,111,89,80,73,65,65,65,72,47,72,75,88,73,65,52,65,107,65,76,109, -68,103,65,65,107,73,73,107,109,99,107,116,115,107,101,119,119,65,65,72,56,74,68,65,65,98,65,65,65,65,65,65, -65,65,65,65,65,107,121,78,103,65,83,70,111,47,54,56,69,115,115,65,84,65,86,87,71,69,119,66,120,83,65,111, -50,119,70,68,100,111,65,65,65,65,65,72,72,52,82,52,70,116,107,77,47,50,73,103,119,108,108,108,104,106,98,69, -121,98,98,98,98,98,101,65,119,65,103,103,106,89,65,98,68,65,89,65,65,65,65,65,65,65,65,67,67,87,82,116, -119,111,81,81,116,52,67,69,69,115,115,65,47,65,75,71,50,71,65,65,73,83,119,111,119,71,70,73,76,100,67,67, -81,65,65,72,72,65,65,103,65,111,85,107,65,47,77,109,50,107,69,65,107,73,52,65,68,112,65,65,65,65,50,67, -83,119,103,103,106,68,69,65,89,65,65,65,65,65,65,81,65,81,98,97,83,81,65,73,73,111,67,65,111,47,67,69, -65,106,103,65,47,65,65,66,120,65,119,65,65,83,65,111,119,71,72,72,72,65,67,67,65,65,83,56,65,68,65,103, -65,111,77,77,47,116,65,119,119,119,70,65,65,65,56,65,70,73,68,118,114,65,65,67,67,65,69,77,68,89,120,119, -65,119,68,68,65,65,65,83,67,81,116,113,67,70,116,74,73,65,89,89,89,52,67,69,65,106,103,66,74,66,72,65, -119,72,71,65,65,83,65,111,50,119,66,65,66,65,83,67,81,65,88,52,65,89,69,56,111,111,82,74,107,65,71,119, -119,50,69,65,65,65,65,65,66,65,68,118,114,65,65,67,83,65,66,104,68,69,73,77,65,65,76,74,66,65,65,81, -81,81,50,119,65,67,83,73,76,68,68,68,68,47,52,65,65,98,89,66,74,65,65,111,65,111,119,65,65,83,65,111, -119,65,118,72,72,65,65,65,65,65,47,103,109,119,65,47,111,111,74,65,81,65,87,71,50,71,70,65,65,65,65,65, -73,73,68,118,114,65,108,75,67,65,100,57,98,65,120,119,65,65,76,73,89,68,65,65,65,47,65,65,65,70,116,73, -73,89,65,65,65,65,65,65,65,65,65,71,50,86,82,80,118,52,65,65,65,83,89,70,119,70,65,81,65,65,65,65, -65,65,103,69,65,119,65,110,116,111,82,73,83,67,87,119,65,50,72,52,52,65,65,65,68,65,68,118,114,103,108,76, -65,112,115,99,112,65,69,65,104,103,76,74,66,65,65,65,72,72,66,74,74,77,107,65,72,80,65,65,65,72,110,83, -81,65,89,101,50,86,82,112,118,118,65,65,65,83,79,71,116,111,65,65,65,52,72,65,72,66,73,65,65,81,65,110, -47,52,74,65,81,81,81,50,50,119,72,72,71,71,71,71,65,89,68,72,114,110,108,73,111,111,115,107,111,65,65,65, -73,65,65,65,65,65,65,89,72,47,65,65,65,72,47,107,104,53,67,66,69,66,74,83,67,65,98,69,107,83,82,78, -118,57,72,119,65,65,73,65,69,65,56,52,72,72,65,65,65,119,66,65,65,67,67,83,72,103,82,47,81,65,81,65, -65,65,72,47,43,119,65,119,67,65,65,65,69,107,108,76,70,111,70,108,65,119,65,65,103,65,68,67,65,65,68,55, -72,72,72,47,47,56,107,50,51,80,65,65,65,72,110,81,83,65,98,69,107,86,82,112,118,118,65,43,103,103,87,50, -107,103,107,103,72,47,65,69,65,50,73,65,65,65,65,69,69,65,74,65,47,47,110,65,65,72,70,116,117,71,65,119, -73,81,111,65,69,52,108,76,65,115,69,111,106,119,69,65,73,65,68,85,81,65,68,65,65,65,65,103,103,103,65,65, -65,65,65,65,65,65,65,67,83,65,89,89,65,86,82,78,118,52,72,119,103,103,81,69,69,69,56,52,72,72,72,65, -72,119,66,65,65,65,65,65,103,65,111,74,53,102,72,119,69,52,57,65,65,65,65,65,101,65,111,65,69,49,116,65, -65,103,103,103,103,119,103,103,104,103,98,83,81,83,81,89,65,49,66,52,52,52,65,47,52,68,47,47,47,55,65,65, -65,81,65,82,65,73,65,83,65,65,65,65,69,65,65,80,77,65,65,65,65,65,65,47,56,104,73,65,72,47,65,107, -107,103,71,65,55,80,65,119,67,52,52,116,65,65,65,65,73,119,111,65,69,57,116,69,103,69,48,65,47,119,69,65, -65,65,98,81,81,65,81,68,71,49,111,107,48,50,119,56,107,65,69,107,107,65,65,67,81,71,107,120,76,73,67,81, -65,80,103,65,65,69,107,53,56,65,83,121,98,98,89,65,109,48,65,65,54,83,52,103,103,103,50,50,47,55,65,50, -50,52,57,65,65,103,107,65,89,89,117,65,69,70,116,109,48,65,103,119,119,69,105,107,72,47,107,110,47,65,84,55, -65,83,71,71,119,119,50,56,56,65,65,69,65,65,107,81,67,65,109,104,90,73,67,81,107,107,107,107,107,71,50,80, -73,65,67,83,89,89,89,69,71,119,103,72,121,83,88,65,65,65,71,65,53,53,65,50,75,72,68,114,89,119,119,119, -73,119,111,65,72,107,103,109,48,65,71,71,71,65,67,65,71,74,48,51,110,81,81,89,65,81,65,50,50,50,50,47, -56,65,65,69,89,89,107,103,65,84,69,48,107,107,65,77,107,107,107,107,107,72,71,119,69,105,83,67,98,98,56,56, -50,50,107,43,83,67,83,52,65,103,65,65,55,80,72,119,67,65,65,89,71,119,65,65,68,65,111,66,68,87,81,69, -103,65,71,71,71,65,67,65,69,107,48,51,47,67,68,65,65,65,65,65,65,65,65,56,107,68,69,69,98,89,116,103, -107,75,73,65,103,103,66,66,107,107,107,107,107,72,43,119,69,116,86,65,99,48,102,47,122,101,47,43,81,67,83,52, -69,65,69,107,65,65,69,81,71,103,68,98,89,65,50,51,65,72,111,65,72,81,81,67,65,107,107,109,65,67,67,67, -119,65,65,65,70,116,101,89,71,119,111,65,65,65,65,81,65,98,99,107,89,89,74,103,69,82,65,65,103,69,80,72, -73,65,65,69,107,72,71,65,69,116,86,65,47,72,56,56,68,68,107,43,81,83,83,52,69,103,69,107,47,52,65,65, -65,65,65,66,49,73,107,119,65,65,111,66,89,69,65,83,65,67,67,65,65,65,83,81,65,65,73,65,78,86,98,89, -119,65,116,98,65,65,67,54,68,89,98,65,65,65,74,69,103,65,65,65,65,65,73,65,73,65,65,69,107,65,65,65, -69,105,81,65,47,47,52,65,69,119,65,43,83,83,83,52,69,65,69,107,52,52,73,66,66,73,74,71,116,103,65,51, -72,72,111,65,52,65,98,97,81,67,67,65,67,65,65,65,72,83,82,66,70,116,89,89,119,65,116,98,65,72,88,88, -88,98,89,111,65,111,65,65,65,65,65,65,65,65,66,74,119,65,65,69,107,65,65,65,65,65,65,65,47,47,52,65, -69,71,68,102,83,83,88,69,107,103,65,65,47,52,65,65,65,73,76,66,115,73,119,119,65,119,65,116,111,72,98,97, -65,65,65,81,83,81,81,68,65,52,84,76,65,81,65,65,119,65,98,100,111,65,67,54,65,68,65,111,65,111,65,65, -65,65,66,83,73,65,65,65,119,65,65,69,107,65,66,73,65,67,67,83,80,47,73,65,69,71,98,98,47,47,52,65, -117,111,68,89,65,52,73,66,66,73,73,90,103,73,50,119,65,73,65,111,52,65,66,65,65,69,56,81,67,65,81,114, -65,67,84,68,67,83,107,65,71,119,98,105,73,65,65,81,47,52,71,70,70,66,74,65,65,65,66,47,73,52,65,52, -119,65,65,107,107,65,66,66,50,121,67,65,74,74,73,65,69,71,98,98,52,47,52,65,121,119,99,106,107,103,73,66, -65,65,65,68,74,65,107,103,65,81,65,116,65,65,66,111,65,103,103,105,83,83,65,84,65,52,81,65,67,67,65,65, -65,65,98,49,103,65,65,52,56,52,119,49,70,66,66,65,65,65,66,83,73,65,65,65,50,50,50,69,107,65,66,73, -74,75,67,81,53,74,52,65,65,65,89,98,47,65,52,65,76,73,99,106,48,119,73,66,65,65,65,65,89,52,65,65, -81,119,103,118,65,65,66,65,69,65,65,69,83,81,65,84,72,83,88,47,67,83,103,48,65,65,98,75,89,66,65,65, -47,52,47,119,111,66,66,65,65,65,65,65,65,65,119,65,68,77,81,83,107,81,66,66,107,105,83,65,52,65,52,65, -65,65,65,98,72,47,65,65,65,65,99,106,107,103,66,73,65,65,69,65,68,65,65,65,72,80,65,116,111,65,81,65, -103,65,65,65,103,65,65,116,65,65,71,65,67,67,65,48,68,52,98,98,65,66,114,119,65,71,47,51,72,73,73,65, -65,65,67,65,65,103,65,103,90,105,67,67,67,65,66,73,65,65,65,65,47,47,52,65,73,73,109,84,65,52,65,65, -65,65,68,89,65,65,67,52,65,65,107,103,65,89,103,69,65,65,65,65,67,67,88,118,65,65,65,47,110,56,47,107, -56,81,50,119,67,67,107,48,72,89,98,98,65,66,114,89,65,119,50,67,83,65,65,65,119,81,68,65,81,69,107,68, -77,67,67,67,81,65,65,83,68,65,89,65,68,101,119,65,74,77,121,89,65,65,65,65,69,65,68,89,47,47,72,67, -65,69,107,107,65,68,69,103,65,73,73,66,67,67,114,114,111,65,65,72,110,56,110,110,56,87,50,119,65,65,65,65, -65,65,65,65,66,66,116,89,103,103,65,107,107,103,52,52,65,68,70,68,65,65,103,65,65,72,68,65,65,65,67,65, -68,68,98,65,89,101,71,71,79,73,65,65,65,65,65,65,107,103,70,116,65,52,54,72,65,107,107,103,103,68,99,103, -65,73,73,73,75,67,65,65,65,65,65,72,107,56,56,110,47,87,120,50,65,98,107,107,107,107,107,107,104,74,66,65, -103,103,65,110,47,103,47,56,103,65,117,111,65,47,52,65,65,72,89,89,119,70,67,65,68,65,89,65,89,101,71,71, -79,73,65,74,97,81,119,69,69,69,70,65,65,47,72,81,69,107,107,72,69,65,65,65,65,119,119,50,119,81,65,65, -65,65,65,72,110,56,56,107,56,87,50,50,65,101,101,50,50,50,50,50,119,65,65,52,71,70,100,110,118,103,47,56, -105,100,51,49,97,107,103,67,65,72,89,89,119,70,65,83,98,65,65,65,68,101,71,109,71,69,65,65,89,81,119,65, -107,103,70,116,119,52,119,119,65,107,107,103,65,65,50,50,50,50,119,119,119,65,65,65,65,65,65,47,69,65,65,65, -65,87,50,50,65,98,69,65,80,73,72,47,65,110,103,65,103,106,114,110,47,103,47,47,52,65,117,111,65,83,81,65, -65,47,68,71,65,70,116,65,65,65,65,69,65,71,48,53,48,107,65,73,97,81,65,69,69,69,70,65,50,50,119,111, -119,69,107,107,72,65,50,65,65,65,65,65,65,71,65,65,65,65,65,50,69,47,56,114,111,50,119,50,65,89,100,89, -47,52,52,65,52,47,52,65,103,108,100,107,107,103,47,53,73,68,70,68,65,111,69,107,107,65,111,70,69,69,107,107, -69,84,65,50,68,65,110,79,103,103,103,74,89,81,119,65,65,65,70,65,119,119,119,119,65,65,107,103,65,65,65,72, -47,52,119,119,119,71,101,98,98,65,65,50,69,56,56,100,89,50,65,71,65,68,71,67,80,73,52,72,52,110,109,119, -65,66,74,65,65,65,47,53,73,81,68,65,81,111,65,65,65,70,65,107,69,107,107,107,107,106,69,107,89,65,53,65, -69,107,65,65,65,72,47,65,65,71,109,65,65,65,65,117,111,65,69,65,65,72,47,52,52,72,119,119,65,71,50,50, -50,65,65,47,69,47,56,114,111,119,109,108,70,116,118,108,73,65,52,52,52,65,71,66,66,66,72,65,65,65,73,65, -81,65,67,65,65,111,98,89,65,113,86,70,69,48,107,107,48,84,71,122,65,65,65,65,65,70,116,67,83,65,72,65, -65,69,48,52,67,67,65,65,65,65,47,65,65,72,65,72,52,72,50,119,119,87,101,98,98,65,65,43,107,108,86,71, -103,109,50,49,116,70,69,107,65,65,72,47,65,65,71,120,73,66,66,65,65,107,77,103,67,65,66,47,47,111,101,89, -70,65,103,70,69,71,107,109,99,106,69,97,66,74,103,65,65,70,116,67,83,65,52,65,65,71,109,70,81,81,81,119, -105,103,52,107,50,72,67,65,52,72,119,119,119,81,65,103,65,65,70,43,107,105,75,71,69,71,109,108,70,70,65,81, -81,83,68,98,65,65,71,66,66,66,74,65,65,103,73,105,83,74,74,74,74,111,98,89,113,86,65,69,69,65,48,122, -99,84,68,121,66,69,69,65,65,68,98,67,83,72,50,83,81,69,69,67,67,67,65,65,82,81,47,103,89,89,86,81, -47,52,119,65,65,87,65,103,103,65,65,50,107,108,86,71,69,71,107,107,54,52,65,83,65,81,84,65,65,65,65,65, -65,72,65,114,114,65,65,65,65,65,65,107,107,111,89,70,65,104,116,116,69,68,101,98,99,106,102,121,66,73,119,103, -65,116,116,111,65,52,65,81,65,119,119,119,65,81,65,65,105,103,65,69,98,67,65,67,71,50,120,65,83,83,81,107, -65,72,47,51,107,103,107,71,47,43,65,103,105,103,65,81,65,83,68,98,70,116,65,65,65,65,52,116,114,65,65,119, -65,119,65,65,65,111,89,113,86,90,117,115,69,68,101,98,99,84,68,121,66,71,69,65,65,66,74,56,53,74,71,83, -65,81,65,88,83,50,107,70,65,72,89,107,65,65,72,47,47,47,47,65,65,86,116,103,103,72,102,107,107,107,107,107, -56,103,103,103,54,52,69,103,89,81,84,81,65,114,65,54,52,47,52,114,116,65,65,66,66,65,119,69,103,111,70,65, -111,90,116,116,56,68,101,65,99,106,65,97,66,65,103,65,69,66,74,56,53,74,65,81,65,68,68,66,83,50,107,70, -111,118,68,52,72,111,115,107,107,107,107,69,65,86,65,103,69,72,47,65,65,65,65,65,47,52,107,103,68,89,89,65, -65,65,68,65,65,114,89,85,82,120,73,65,65,65,65,66,104,71,71,69,65,111,113,85,65,90,117,115,56,89,65,68, -69,84,81,84,66,69,69,50,103,104,53,56,53,53,65,81,65,65,111,71,83,50,107,70,70,72,89,52,72,111,118,47, -47,47,47,69,65,86,70,65,65,107,65,98,65,81,65,81,66,73,107,65,89,68,65,65,47,47,65,74,73,114,89,54, -43,50,119,69,107,103,65,66,66,65,119,72,52,116,65,111,65,90,116,116,56,89,65,68,69,106,67,67,97,65,109,109, -48,66,47,56,47,53,65,65,65,65,65,68,65,65,65,70,65,72,68,70,73,116,111,65,65,65,69,107,65,86,116,65, -65,103,103,89,89,81,81,81,73,65,103,103,68,89,89,65,56,110,65,73,70,116,65,65,66,120,75,83,107,106,89,65, -65,81,66,66,65,111,69,65,65,98,89,69,56,68,89,65,99,84,67,67,68,116,115,117,65,65,65,65,65,83,83,65, -65,65,65,65,47,51,47,70,65,72,89,66,111,111,111,65,65,65,69,82,74,73,65,65,65,107,65,98,71,121,67,71, -120,73,107,120,74,103,65,65,56,110,103,74,73,65,65,98,89,65,65,81,107,103,68,65,107,103,65,66,73,65,65,72, -73,65,65,66,74,65,65,65,65,65,67,67,81,111,67,111,89,89,89,50,119,47,47,65,65,65,65,65,43,51,72,65, -65,65,71,117,65,65,121,119,65,70,69,104,65,65,65,65,65,103,65,65,71,50,50,50,119,65,65,120,73,67,65,52, -47,56,103,65,73,52,52,65,97,56,81,81,103,65,65,107,111,110,65,111,72,72,72,47,80,47,47,47,51,47,72,47, -72,47,72,47,72,70,83,111,98,89,89,119,65,74,74,74,74,73,65,65,47,51,47,65,71,119,70,116,65,73,87,81, -65,65,65,104,65,72,47,57,65,103,103,65,65,71,50,119,65,65,74,105,67,67,65,65,65,65,116,74,73,65,65,89, -89,65,83,85,103,65,65,89,67,65,68,65,65,65,65,74,74,74,73,65,119,65,65,65,65,65,65,65,65,111,67,111, -89,89,89,50,50,65,65,65,65,65,65,65,55,51,102,65,122,71,71,117,72,71,121,119,65,65,65,104,74,65,52,65, -70,107,65,65,65,65,50,116,111,65,74,66,74,74,65,65,65,57,65,111,69,65,69,98,101,107,68,89,98,65,98,89, -65,71,71,50,119,68,68,47,80,47,52,65,65,68,68,65,89,89,67,83,65,116,111,116,115,107,107,103,119,47,47,47, -47,52,65,65,55,122,102,65,119,71,65,65,81,103,81,65,65,65,65,104,65,65,47,70,111,103,65,65,65,65,50,111, -70,68,98,70,65,70,50,50,119,111,116,116,69,69,69,65,71,48,71,71,71,65,65,89,107,103,71,65,71,68,89,98, -107,103,67,65,73,89,65,76,52,55,65,65,65,117,119,117,69,69,65,103,119,65,98,98,98,89,65,65,98,122,98,89, -71,119,65,65,71,72,65,65,70,65,65,104,65,65,52,83,87,71,73,74,65,65,50,111,70,89,65,70,111,116,65,119, -70,65,111,65,65,103,103,65,65,65,116,116,116,111,65,89,52,107,71,65,65,68,68,68,109,103,81,81,65,65,111,65, -98,89,119,81,65,117,49,119,69,107,103,103,116,116,116,116,116,116,112,74,47,65,65,65,79,73,65,114,68,73,65,65, -70,116,65,104,65,89,52,67,71,50,66,66,83,81,50,111,111,89,65,70,70,70,65,49,111,72,70,116,116,65,65,65, -65,70,69,107,107,70,65,89,69,103,72,51,43,52,65,65,107,103,71,65,65,89,65,73,65,65,119,81,65,117,117,71, -89,65,70,111,50,50,51,47,47,47,53,74,57,52,65,65,50,119,70,111,89,80,73,72,70,70,70,109,115,65,52,83, -87,71,65,66,82,73,50,65,65,68,98,70,70,70,65,119,71,103,65,52,52,65,65,65,70,65,109,50,50,103,111,69, -69,103,47,47,47,47,66,74,66,73,119,122,68,66,66,65,65,65,48,81,65,111,65,65,89,68,65,65,98,98,100,116, -116,116,112,74,47,116,111,50,79,74,50,114,68,80,73,72,65,70,116,105,70,65,89,68,65,65,65,65,83,81,69,107, -107,65,65,100,70,70,65,119,71,103,72,72,72,72,88,65,116,69,121,97,97,48,70,65,107,65,47,47,47,47,65,52, -77,104,119,119,103,65,65,66,98,90,119,81,65,111,65,65,89,68,111,70,65,65,98,98,98,98,97,83,57,52,65,120, -119,66,50,81,65,74,73,65,50,49,70,104,87,68,65,89,71,50,50,119,74,73,69,69,69,68,98,70,65,70,68,119, -71,103,65,52,52,52,54,65,65,109,55,114,114,43,103,111,65,65,47,72,52,47,72,72,66,73,71,111,65,114,98,68, -65,68,70,43,65,116,111,68,89,98,70,111,65,65,65,65,47,107,105,67,72,69,47,50,47,53,75,83,107,47,73,65, -50,71,65,103,65,65,89,89,65,65,65,120,97,119,69,103,107,65,47,52,65,65,89,89,65,89,72,72,72,72,88,89, -52,110,100,108,108,102,103,111,65,119,47,52,72,47,65,65,71,50,65,70,116,65,89,68,71,68,70,43,83,81,81,65, -65,65,65,65,72,73,80,72,72,50,105,81,65,69,110,51,47,47,47,52,65,74,73,65,117,119,65,103,74,65,65,67, -65,71,50,120,87,52,65,50,119,65,88,81,65,65,89,65,69,69,65,52,52,54,54,89,65,109,100,107,108,101,103,111, -65,71,72,47,47,52,65,65,119,65,119,65,52,65,89,68,65,68,65,71,83,81,69,69,65,65,103,65,65,65,65,65, -72,48,105,67,69,69,107,51,47,47,47,52,71,53,52,65,117,71,65,98,90,65,65,65,81,71,71,120,97,119,65,67, -65,65,47,81,65,65,68,65,73,89,80,72,72,72,88,89,111,109,84,115,114,87,103,117,119,71,65,47,47,68,84,71, -83,114,101,65,65,107,103,66,98,90,69,107,83,81,69,107,65,65,103,65,69,65,69,65,72,50,105,83,110,107,110,47, -47,47,116,50,119,74,73,65,109,119,65,89,90,81,83,83,81,65,89,119,74,73,65,67,65,69,65,65,65,71,65,90, -65,103,66,52,52,54,52,89,111,103,121,100,97,119,103,111,71,50,119,65,65,67,113,71,65,111,71,72,72,107,103,65, -65,65,47,110,52,65,69,69,65,65,103,65,65,50,119,69,72,107,103,65,69,69,47,47,110,47,57,116,65,65,65,65, -103,65,65,98,89,81,81,65,103,68,98,65,65,65,52,67,66,87,50,71,65,71,89,89,65,122,51,72,72,72,88,89, -70,69,71,84,87,69,70,71,122,98,89,65,65,68,84,65,83,114,89,65,103,72,68,68,65,51,47,47,47,119,69,69, -65,65,103,65,65,65,65,65,65,68,98,89,89,84,47,56,107,47,47,52,65,65,65,65,100,111,65,74,75,81,83,65, -65,65,65,66,74,73,65,73,79,79,87,71,65,71,68,65,65,98,89,52,52,54,52,89,111,111,103,122,119,107,115,65, -68,98,89,65,65,65,71,50,81,65,89,72,72,72,108,116,65,47,107,56,110,52,66,56,65,103,103,65,65,67,81,67, -65,68,65,65,89,88,102,47,110,47,50,48,107,107,107,103,82,65,81,73,73,71,119,71,66,74,65,66,65,73,65,73, -82,117,48,119,50,119,68,65,65,122,51,72,72,72,98,89,65,70,69,71,69,66,66,65,68,98,102,74,73,73,79,117, -83,114,89,65,65,72,103,111,71,47,107,107,110,43,66,56,65,107,103,65,74,81,67,67,65,122,98,89,97,72,102,47, -110,47,107,109,50,50,50,120,65,75,81,73,77,119,65,71,66,104,65,66,73,73,66,77,72,51,71,101,119,107,81,103, -65,65,65,52,52,52,52,70,65,70,111,103,109,111,73,119,68,98,102,80,74,73,79,50,65,65,65,65,119,65,103,111, -65,51,56,107,47,119,65,70,108,108,108,108,74,73,67,67,71,71,65,65,65,72,47,47,110,47,50,119,65,65,65,66, -66,67,81,65,69,71,69,109,66,74,70,111,65,65,66,73,111,111,111,120,119,103,80,111,65,100,100,111,67,69,107,70, -70,70,65,69,119,119,65,71,119,65,72,74,73,73,74,66,65,65,65,71,50,65,106,68,65,71,47,110,43,65,65,66, -66,66,66,65,103,103,88,105,51,47,120,73,49,51,47,47,47,47,47,52,65,65,65,66,73,67,81,68,69,107,48,109, -66,65,70,113,65,66,73,72,67,83,72,50,119,107,103,119,52,70,68,67,67,72,110,65,111,111,65,111,71,65,65,65, -65,65,119,70,116,116,71,65,65,65,65,71,71,65,107,107,107,107,110,47,116,116,114,65,68,65,65,65,65,65,88,54, -110,80,104,83,116,118,47,47,47,47,43,109,109,98,89,66,66,67,81,90,89,50,65,71,65,65,65,67,65,66,73,111, -113,83,111,111,107,69,65,65,65,68,70,67,83,69,110,98,98,98,65,70,105,103,65,65,65,77,69,65,70,65,50,119, -65,65,65,47,113,54,103,69,107,65,65,52,65,65,70,66,66,69,65,107,103,69,72,103,104,74,105,82,49,51,47,47, -47,47,56,56,48,99,89,66,65,73,68,76,76,65,65,65,65,65,107,67,65,66,65,72,67,83,72,67,65,107,66,66, -72,65,74,75,67,68,98,70,65,114,65,65,69,69,103,107,73,77,107,65,70,65,71,65,65,65,65,118,113,54,68,69, -56,65,89,71,80,79,70,65,65,69,65,103,103,69,85,105,79,79,73,74,98,102,47,47,47,47,43,109,109,98,89,65, -65,65,66,90,90,65,50,119,69,103,103,105,81,81,81,65,111,119,111,65,81,67,66,73,72,66,73,67,73,68,65,70, -70,89,65,50,71,69,69,69,78,77,69,65,70,65,71,65,81,81,89,116,113,83,119,48,107,68,68,65,72,65,70,67, -67,69,89,103,103,99,72,103,74,120,73,65,102,98,47,47,47,47,56,52,48,66,74,65,57,70,65,76,73,65,65,65, -103,103,107,65,67,67,107,69,110,65,72,65,67,111,112,66,47,74,74,74,74,68,98,70,114,68,83,119,119,48,65,69, -65,73,119,65,70,65,107,103,83,84,90,74,109,66,119,119,103,106,98,71,73,79,70,66,74,69,89,107,103,99,65,65, -72,47,66,112,98,98,65,65,65,68,65,65,109,73,81,72,70,111,65,66,72,77,107,107,69,65,103,103,65,65,103,107, -103,103,103,69,103,69,68,98,71,50,50,50,80,118,118,70,100,67,65,119,119,119,66,74,74,73,65,65,65,65,65,65, -81,81,90,66,103,66,50,119,103,106,98,65,65,65,65,68,65,65,98,65,68,89,65,85,103,52,70,70,107,106,65,65, -72,68,103,69,48,73,81,65,57,70,65,65,66,77,107,103,65,65,103,69,65,65,107,69,69,65,66,74,74,74,68,114, -50,71,71,50,80,118,118,70,65,111,83,68,65,68,66,74,74,65,65,71,87,65,65,65,111,65,66,74,103,66,119,119, -65,65,65,65,65,65,82,80,56,103,89,89,89,89,65,87,103,52,70,73,105,106,98,68,68,98,107,69,109,81,83,81, -65,65,65,65,69,107,107,103,65,65,65,65,103,65,65,65,65,103,103,65,65,103,106,98,50,50,50,50,80,118,118,98, -68,98,65,68,89,98,66,74,74,65,65,67,105,65,65,65,111,111,66,104,107,53,89,68,72,47,67,65,67,67,66,80, -56,103,98,65,68,89,65,85,103,52,66,70,107,106,68,65,68,68,103,107,48,103,81,81,107,103,65,65,71,65,65,65, -71,65,66,74,103,50,65,65,72,69,72,65,65,69,65,70,50,65,65,49,80,118,118,68,98,65,89,68,68,68,89,66, -65,89,65,71,87,65,65,65,111,69,107,65,47,65,68,89,47,47,54,67,67,65,82,80,56,103,83,81,65,65,65,98, -98,89,65,65,116,114,65,68,68,68,119,65,109,103,83,81,65,107,107,107,65,89,68,65,70,71,83,73,107,71,65,65, -65,83,107,107,65,103,103,65,43,50,50,56,78,47,47,65,89,68,68,68,65,65,98,66,65,89,65,98,89,65,65,65, -111,118,47,103,65,47,68,89,52,52,54,72,67,67,65,74,74,70,81,70,65,69,107,65,89,65,77,103,83,114,68,68, -68,68,83,81,77,69,107,66,52,65,65,119,71,65,68,65,111,117,87,73,73,71,65,65,65,87,48,107,65,52,52,65, -70,111,116,66,74,65,83,98,97,81,89,68,65,65,71,120,89,89,89,89,89,65,65,111,115,47,47,56,72,65,89,68, -52,52,54,65,54,65,81,65,66,70,81,70,65,69,65,103,98,89,73,69,83,114,68,68,65,98,81,66,73,111,81,89, -69,103,71,65,65,89,65,89,70,67,87,74,66,119,65,65,65,83,107,107,65,73,73,107,81,68,65,65,68,98,97,98, -97,65,65,50,65,65,65,66,98,98,89,98,89,103,65,116,116,55,55,56,65,65,65,65,47,47,54,47,54,67,65,65, -66,70,81,70,65,69,65,103,89,89,73,69,116,111,98,65,65,103,83,73,73,71,65,66,65,65,65,65,71,65,68,68, -68,72,47,74,66,65,65,65,65,52,65,52,65,66,65,105,103,70,65,65,83,84,105,97,97,104,65,66,103,100,111,66, -65,65,65,65,70,116,65,65,65,110,47,103,65,65,116,111,72,47,67,81,83,65,81,73,66,70,83,86,65,69,107,65, -98,74,77,103,74,73,66,74,69,103,82,65,73,113,83,65,52,103,65,65,65,89,68,89,89,102,110,65,65,65,72,72, -65,65,72,47,65,73,73,107,81,66,81,65,65,84,106,84,84,104,65,66,103,89,113,66,65,65,65,50,116,116,111,65, -65,100,56,89,74,65,65,111,65,43,50,83,87,121,119,66,73,70,116,70,116,69,65,103,89,89,65,65,53,52,66,65, -103,103,65,65,69,67,65,66,107,103,65,65,71,65,68,65,68,72,47,65,65,65,72,72,65,65,65,65,65,65,65,105, -103,111,68,65,65,84,99,99,99,90,104,104,103,100,113,67,72,47,65,119,115,115,111,65,65,98,122,89,73,65,70,65, -65,71,65,67,71,65,81,52,119,52,119,52,119,52,119,52,98,89,65,65,74,73,66,66,107,107,65,65,65,67,83,80, -47,52,65,65,65,89,65,100,118,81,81,65,65,65,65,65,71,65,65,65,65,47,65,72,43,65,69,65,65,84,98,106, -106,89,103,103,103,97,67,83,74,74,65,50,116,116,111,65,65,89,89,89,73,65,65,65,65,43,71,65,71,65,119,98, -98,103,69,74,77,77,65,65,65,65,65,65,50,119,66,74,65,103,65,103,53,47,47,74,47,52,65,65,71,65,65,70, -47,67,65,65,65,65,71,87,87,87,87,76,73,47,71,72,52,65,111,65,81,81,98,98,98,65,69,65,107,105,83,65, -47,47,65,119,108,108,103,65,65,89,82,89,74,65,65,51,65,72,50,65,65,71,119,98,98,65,65,71,50,119,65,71, -50,119,65,65,79,73,65,65,65,65,69,69,80,74,74,74,80,56,107,107,65,69,85,108,118,67,74,73,65,65,65,119, -119,119,119,76,73,65,71,74,74,71,65,65,67,74,65,83,81,89,65,65,65,65,67,65,73,65,65,50,69,107,65,65, -65,97,73,89,66,65,65,47,65,72,70,65,65,65,65,68,65,65,65,119,65,71,50,119,110,79,65,65,69,65,65,65, -65,88,52,69,53,47,74,74,74,56,110,107,70,69,105,103,65,67,47,52,65,65,65,119,120,119,119,76,73,65,71,74, -66,52,65,65,65,73,73,65,81,98,55,65,119,65,83,81,89,65,65,65,103,65,107,103,65,82,73,69,66,65,65,65, -47,52,65,65,65,65,72,72,72,69,110,56,103,65,50,65,73,103,65,65,103,103,65,81,65,72,52,103,65,65,65,74, -74,77,47,56,116,69,107,83,65,65,116,113,83,74,65,71,65,71,65,65,65,103,65,73,104,73,69,65,65,73,79,67, -71,52,71,65,65,71,70,122,98,89,117,65,103,65,103,65,67,73,66,116,74,65,65,65,52,52,69,65,65,53,73,103, -103,69,110,56,103,71,65,119,103,73,77,51,69,65,67,81,65,65,69,107,65,65,98,101,50,48,110,107,70,69,65,81, -81,49,119,65,81,73,73,119,120,119,119,107,103,107,107,107,65,67,89,65,65,73,73,81,65,89,65,119,119,119,65,81, -89,71,65,73,103,65,107,103,82,65,66,111,65,65,65,65,65,111,109,103,111,120,103,107,103,69,110,56,103,65,68,89, -53,104,103,43,69,65,65,65,70,116,65,65,72,52,89,71,83,107,107,107,65,73,67,67,67,71,117,67,81,73,73,65, -65,65,65,111,65,50,50,50,65,65,65,65,65,74,65,83,81,52,65,71,50,65,65,111,122,65,71,65,103,65,65,103, -73,74,73,116,65,65,65,65,65,65,69,67,65,56,103,69,65,65,65,65,65,65,111,70,81,68,80,99,103,103,65,81, -70,70,65,81,65,65,68,69,107,107,110,103,66,120,65,81,81,65,49,119,65,74,65,50,51,103,74,70,65,107,107,107, -65,70,119,81,65,81,65,71,65,68,55,65,119,65,81,85,69,65,111,65,107,103,107,103,70,69,107,111,71,68,116,111, -111,111,65,87,83,65,67,65,81,65,65,65,65,65,72,65,81,89,65,120,103,103,71,119,70,116,68,98,98,65,65,89, -65,69,47,47,65,73,65,67,65,65,65,65,65,74,73,79,107,47,74,65,111,65,65,103,65,72,73,85,107,81,65,65, -65,66,74,65,65,65,71,69,103,71,77,73,65,65,65,65,114,115,74,116,119,122,116,70,70,70,70,83,83,81,83,81, -81,65,107,81,47,57,65,111,69,65,71,71,86,81,107,49,65,65,70,114,111,65,98,89,65,69,110,103,66,120,70,116, -65,65,47,72,65,66,66,71,52,107,73,83,81,52,69,65,65,65,65,81,81,81,67,67,70,70,111,116,65,70,70,115, -69,116,65,65,65,65,65,70,100,69,77,65,119,68,100,111,111,111,65,81,83,67,67,67,81,65,109,103,74,73,98,65, -107,107,71,50,113,111,71,50,119,65,68,114,116,111,113,83,74,69,65,67,65,73,70,107,111,65,65,72,65,66,71,79, -69,52,73,65,65,65,107,107,65,65,65,105,83,103,67,67,65,73,65,73,65,65,65,65,65,65,65,65,72,47,47,70, -111,70,70,65,71,98,98,89,65,65,65,65,67,65,67,65,81,65,85,103,83,81,83,88,52,65,71,71,113,115,69,50, -65,83,68,98,118,111,111,65,66,69,65,84,81,98,100,107,111,73,47,72,81,65,65,65,67,81,65,107,107,103,65,65, -65,65,65,107,69,103,65,65,70,74,65,78,71,71,50,71,65,89,65,65,89,72,65,81,81,70,70,65,65,119,90,74, -65,65,69,103,107,66,73,65,65,52,52,52,81,81,81,88,54,83,83,83,86,85,107,120,119,88,85,103,116,116,113,83, -66,69,65,81,81,89,100,116,66,73,47,65,65,65,65,65,81,67,119,47,88,52,119,56,52,65,65,103,103,103,65,81, -70,73,73,78,71,71,65,71,65,68,65,68,107,110,65,69,65,89,65,89,119,119,90,65,72,47,69,69,69,73,65,65, -65,66,74,65,83,81,83,65,66,65,105,66,113,115,69,50,73,83,85,56,111,111,111,66,66,69,67,65,67,98,100,65, -79,120,73,67,83,65,65,65,87,121,65,54,83,52,65,105,103,65,65,103,65,103,65,81,70,73,66,78,71,65,71,71, -65,68,68,68,50,110,71,69,71,68,55,65,71,65,90,66,72,80,69,69,69,73,65,65,65,65,103,65,81,65,81,81, -66,107,69,66,86,85,69,120,119,81,85,103,111,111,113,83,74,77,103,70,65,89,70,70,104,74,74,83,83,81,65,65, -81,67,65,107,107,103,65,56,52,65,65,103,65,103,67,67,70,73,65,78,50,71,50,71,119,65,89,89,48,51,65,50, -119,88,65,72,47,54,90,74,72,47,69,65,69,66,73,65,65,72,72,65,81,65,83,65,66,103,107,66,34,41,59,10, -172,105,109,103,72,101,105,103,104,116,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,46,104, -101,105,103,104,116,59,10,172,105,109,103,83,99,114,111,108,108,61,77,97,116,104,46,102,108,111,111,114,40,77,97,116, -104,46,114,97,110,100,111,109,40,41,42,105,109,103,72,101,105,103,104,116,41,59,10,103,46,114,101,115,101,116,40,41, -46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, -48,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103,40,69,78,86,46,86,69,82,83,73,79,78,43,34,32,32, -34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47, -50,44,49,55,49,41,59,10,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,50,52,41,59,10,170, -103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44,102,105,108,101,41,123,172,106,61,115,46,114,101,97,100,74, -83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40,34,111,98,106,101,99,116,34,138,191,106,41,63,106,46,118, -101,114,115,105,111,110,58,181,59,171,118,63,40,110,97,109,101,43,34,32,34,43,40,118,63,34,118,34,43,118,58,34, -85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34,43,110,97,109,101,59,125,10,172,118,101,114,115,105,111,110, -115,61,91,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111,111,116, -46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44,34,108, -97,117,110,99,104,46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103, -115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,93,59,10,172,108,111,103,111,61,69,46,116,111,65, -114,114,97,121,66,117,102,102,101,114,40,97,116,111,98,40,34,80,66,119,66,65,65,65,65,65,65,65,66,47,103,65, -65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65, -65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,68,47,119,43,65,65,65,65, -81,65,72,65,52,104,65,65,65,65,81,65,77,65,77,104,65,65,65,65,81,65,89,66,109,104,65,65,65,65,81,65, -89,66,71,105,65,65,65,65,81,65,81,67,68,47,72,55,52,43,82,52,119,71,68,104,111,75,74,67,83,69,119,69, -68,103,111,75,74,67,84,56,119,70,68,103,111,75,74,67,83,65,119,72,68,104,111,75,74,67,83,69,81,72,106,47, -72,54,73,43,82,52,89,72,109,65,65,65,65,67,65,65,89,69,71,65,65,65,66,67,65,65,77,69,77,65,65,65, -65,56,65,65,72,65,52,65,65,65,65,65,65,65,68,47,119,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65, -65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65, -66,47,103,65,65,65,65,65,65,65,66,47,103,34,41,41,59,10,172,105,109,97,103,101,84,111,112,61,50,52,59,10, -170,100,114,97,119,73,110,102,111,40,41,123,103,46,114,101,115,101,116,40,41,46,99,108,101,97,114,82,101,99,116,40, -66,97,110,103,108,101,46,97,112,112,82,101,99,116,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,111,103,111, -44,87,45,54,48,44,50,52,41,59,103,46,115,101,116,70,111,110,116,40,34,52,120,54,34,41,46,115,101,116,70,111, -110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97,119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74, -83,46,67,79,77,34,44,87,45,51,48,44,53,54,41,59,172,104,61,56,44,121,61,50,52,45,104,59,103,46,115,101, -116,70,111,110,116,40,34,54,120,56,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41, -59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105, -110,111,34,44,48,44,121,150,52,43,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105, -111,110,32,34,43,69,78,86,46,86,69,82,83,73,79,78,44,48,44,121,150,104,41,59,103,46,100,114,97,119,83,116, -114,105,110,103,40,34,67,111,109,109,105,116,32,34,43,69,78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44, -121,150,104,41,59,103,101,116,86,101,114,115,105,111,110,40,34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111, -111,116,46,105,110,102,111,34,41,59,103,101,116,86,101,114,115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44, -34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,103,101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105, -110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111,34,41,59,103,46,100,114,97,119,83,116,114,105,110, -103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83,32,86,97,114,115,34,44,48,44,121,150,104,41,59,103,46, -100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114,97,103,101,58,32,34,43,40,114,101,113,117,105,114,101,40, -34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114,101,101,40,41,146,49,48,41,43,34,107,32,102,114,101,101, -34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83,84,79,82,65,71,69,41,103,46,100,114,97,119,83,116,114, -105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43,40,69,78,86,46,83,84,79,82,65,71,69,146,49,48,41, -43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83,80,73,70,76,65,83,72, -41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,80,73,32,70,108,97,115,104,58,32,34,43,40,69,78,86, -46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107,34,44,48,44,121,150,104,41,59,105,109,97,103,101,84,111, -112,61,121,43,104,59,105,109,103,83,99,114,111,108,108,61,105,109,103,72,101,105,103,104,116,45,105,109,97,103,101,84, -111,112,59,103,46,114,101,115,101,116,40,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116, -70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,69,78,86,46, -86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46, -103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49,41,59,100,114,97,119,73,109,97,103,101,40,41,59,115,101, -116,73,110,116,101,114,118,97,108,40,170,40,41,123,100,114,97,119,73,109,97,103,101,40,41,59,103,46,102,108,105,112, -40,41,59,105,109,103,83,99,114,111,108,108,61,40,105,109,103,83,99,114,111,108,108,43,49,41,37,105,109,103,72,101, -105,103,104,116,59,125,44,50,48,41,59,125,10,170,100,114,97,119,73,109,97,103,101,40,41,123,103,46,115,101,116,67, -108,105,112,82,101,99,116,40,48,44,105,109,97,103,101,84,111,112,44,87,45,49,44,72,45,49,52,41,59,103,46,100, -114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105,109,97,103,101,84,111,112,45,105,109,103,83,99,114,111,108, -108,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105,109,97,103,101,84,111,112,43,105,109, -103,72,101,105,103,104,116,45,105,109,103,83,99,114,111,108,108,41,59,103,46,115,101,116,67,108,105,112,82,101,99,116, -40,48,44,48,44,87,45,49,44,72,45,49,41,59,125,10,115,101,116,84,105,109,101,111,117,116,40,100,114,97,119,73, -110,102,111,44,49,48,48,48,41,59,10,115,101,116,87,97,116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78, -49,41,59,255,4,9,0,0,97,98,111,117,116,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +255,255,255,255,255,255,255,255,255,255,255,255,228,0,0,0,97,110,116,111,110,99,108,107,46,105,110,102,111,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,110,116,111,110,99,108,107,34,44,34,110,97, +109,101,34,58,34,65,110,116,111,110,32,67,108,111,99,107,34,44,34,116,121,112,101,34,58,34,99,108,111,99,107,34, +44,34,115,114,99,34,58,34,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58, +34,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,57,34,44, +34,116,97,103,115,34,58,34,99,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,97,110,116,111,110,99,108,107, +46,105,110,102,111,44,97,110,116,111,110,99,108,107,46,97,112,112,46,106,115,44,97,110,116,111,110,99,108,107,46,115, +101,116,116,105,110,103,115,46,106,115,44,97,110,116,111,110,99,108,107,46,105,109,103,34,44,34,100,97,116,97,34,58, +34,97,110,116,111,110,99,108,107,46,106,115,111,110,34,125,99,56,0,0,97,98,111,117,116,46,97,112,112,46,106,115, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101, +116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,172,87,61,103, +46,103,101,116,87,105,100,116,104,40,41,44,72,61,103,46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,69,78, +86,61,112,114,111,99,101,115,115,46,101,110,118,59,10,172,77,69,77,61,112,114,111,99,101,115,115,46,109,101,109,111, +114,121,40,41,59,10,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,59,10,172,105,109, +103,61,97,116,111,98,40,34,115,73,119,68,107,109,50,83,54,54,68,89,119,65,50,65,65,65,65,65,72,65,72,71, +83,82,120,74,69,107,65,65,103,109,71,71,66,120,68,73,65,68,73,100,65,70,74,73,98,65,72,70,57,72,80,48, +48,107,66,85,67,54,68,116,122,68,103,65,105,87,79,120,119,107,103,65,71,98,65,56,54,67,87,50,50,50,50,107, +107,103,66,52,104,79,50,54,47,88,68,68,119,65,119,107,69,69,69,103,89,89,65,43,86,87,50,50,119,69,65,65, +103,103,119,69,109,50,65,90,90,90,84,70,111,116,77,73,68,65,65,57,118,66,53,50,48,65,74,85,110,88,65,116, +119,65,103,65,105,71,120,79,119,50,119,111,43,98,65,109,105,83,65,72,52,65,81,85,107,65,72,77,107,79,50,47, +54,54,84,89,50,71,119,103,103,103,103,104,66,53,47,43,83,82,120,74,65,69,65,65,108,109,50,69,104,120,83,84, +76,75,89,70,70,70,66,65,68,65,47,57,57,72,80,48,48,107,72,111,67,54,68,117,122,65,65,65,67,87,79,120, +119,107,103,43,117,122,71,56,54,67,81,72,55,98,83,85,103,65,66,43,105,83,81,65,65,65,68,68,65,65,116,69, +107,69,107,65,65,65,65,50,107,104,120,73,65,72,65,65,103,109,71,76,65,68,75,68,76,76,111,65,65,65,69,68, +68,83,81,81,67,65,65,65,65,65,72,65,52,65,65,117,119,65,65,65,65,81,68,68,68,68,68,65,119,65,73,73, +65,65,77,103,65,89,81,85,65,65,65,52,105,111,110,103,65,73,65,71,65,66,113,69,107,107,107,65,72,72,71,71, +104,104,120,73,72,72,88,97,54,54,65,68,89,98,83,83,67,99,69,72,122,85,66,68,98,81,67,83,83,81,65,65, +65,65,72,65,116,116,68,68,68,68,65,65,67,81,68,68,68,68,65,49,52,71,71,71,65,66,69,69,65,89,81,87, +66,65,73,68,105,81,56,52,65,65,111,119,120,73,89,81,107,107,105,83,52,103,52,50,107,104,120,73,65,52,105,110, +78,80,65,65,49,119,65,111,84,107,107,65,66,67,83,65,65,83,81,81,105,107,109,50,83,81,72,65,70,65,65,65, +71,119,65,65,65,65,111,116,111,111,117,74,119,65,73,73,65,66,69,103,89,89,65,65,74,73,73,111,67,73,56,52, +65,70,116,50,120,74,67,52,69,107,98,89,69,69,72,80,65,66,120,73,65,65,102,83,113,113,83,81,49,119,70,67, +99,69,69,65,65,67,83,65,65,65,65,65,103,103,109,65,67,116,118,47,57,49,103,71,103,69,119,72,47,65,116,111, +70,70,71,50,119,71,71,65,65,66,69,69,68,89,65,65,74,74,65,116,65,73,50,71,119,57,116,119,119,119,102,52, +65,109,50,65,72,47,53,53,65,82,48,107,48,82,65,72,78,80,75,116,50,49,111,84,52,65,65,111,70,67,83,104, +89,67,83,65,103,107,109,119,67,116,65,65,70,87,111,87,103,69,121,67,83,65,111,116,116,111,117,98,50,71,65,65, +65,65,77,103,65,65,65,65,74,74,65,70,67,65,119,119,119,57,70,65,71,49,116,52,57,116,104,53,65,103,47,80, +69,82,50,50,84,47,65,67,54,54,75,111,112,117,67,100,56,107,107,115,65,69,65,84,81,67,65,65,103,103,109,70, +67,116,115,110,70,97,119,71,103,69,119,69,107,65,65,65,68,98,117,116,119,71,65,73,66,73,65,65,65,65,65,74, +109,104,73,89,65,65,119,65,51,53,120,65,103,50,50,52,57,116,53,80,65,65,52,65,69,82,121,83,77,43,52,107, +65,69,105,107,70,111,122,111,43,50,50,118,74,80,65,90,103,67,67,69,65,103,109,50,67,116,103,65,116,116,71,118, +71,119,66,74,65,65,65,71,65,68,71,71,71,71,120,66,66,65,65,65,74,66,66,77,107,107,73,65,83,81,65,65, +53,43,50,69,69,48,122,98,57,116,110,47,65,72,52,117,65,82,49,116,111,47,65,110,52,107,107,107,103,67,101,65, +57,116,116,115,65,69,65,65,65,67,83,65,65,65,65,65,65,116,103,65,111,111,65,71,65,65,66,65,65,120,119,71, +65,68,71,71,71,65,65,73,66,73,65,65,73,66,66,77,107,107,80,47,81,85,107,65,72,53,120,65,110,71,76,68, +52,65,65,69,107,65,81,117,81,82,116,83,86,52,65,69,65,69,107,107,65,84,111,119,52,65,65,65,65,65,83,106, +68,70,67,83,65,65,65,65,81,65,103,65,116,111,65,111,65,65,66,73,65,118,103,71,68,68,71,50,71,65,65,65, +65,65,71,119,74,66,65,74,107,104,80,74,83,71,50,67,83,119,65,65,67,84,122,98,52,69,69,65,103,71,67,117, +81,81,116,121,49,52,72,107,65,119,107,103,103,100,65,71,52,65,81,65,65,65,48,122,68,70,67,65,67,50,119,68, +68,65,69,110,116,111,72,49,57,65,116,50,65,121,119,71,65,89,71,71,65,65,65,65,65,65,119,65,65,65,65,66, +77,74,72,47,81,81,65,65,67,71,65,65,83,70,89,65,52,68,106,65,103,119,67,117,67,65,116,83,49,111,65,65, +66,74,69,69,68,98,98,98,98,98,98,89,65,65,105,84,98,116,113,86,67,98,89,81,81,81,65,65,116,116,65,98, +114,70,65,71,65,81,65,71,50,71,71,71,71,119,65,65,65,81,119,119,65,65,65,107,104,73,71,109,76,84,73,107, +67,119,68,65,67,52,80,73,65,65,65,65,103,65,81,117,81,65,116,74,78,111,65,65,66,65,77,110,47,74,73,65, +73,77,65,69,69,65,65,68,68,70,67,50,49,65,111,68,68,65,65,65,65,65,65,98,114,65,117,50,83,82,74,65, +65,73,65,65,65,65,65,65,65,65,119,71,65,65,65,107,103,65,69,107,78,75,54,105,67,68,68,65,65,65,43,80, +65,68,98,65,71,50,65,117,67,65,116,74,86,111,73,111,112,83,69,122,55,74,65,65,66,69,103,69,103,65,65,68, +68,70,67,119,119,65,65,65,81,67,67,65,65,65,65,98,114,65,70,65,81,81,73,65,74,73,65,75,99,117,52,65, +65,67,71,119,65,72,47,107,110,47,71,109,106,97,83,107,83,65,90,66,89,65,74,52,65,68,114,65,71,70,65,117, +65,81,70,75,78,65,65,116,112,74,109,88,118,66,78,66,73,77,107,69,69,65,65,68,68,70,67,50,119,74,74,73, +65,85,85,81,65,65,65,65,70,70,111,65,83,81,77,103,104,73,65,65,65,65,65,65,65,67,65,65,65,47,72,52, +47,72,65,65,90,75,54,69,72,65,52,73,65,65,65,65,65,68,98,68,89,70,65,117,65,67,70,114,116,111,119,70, +66,77,121,100,73,66,65,65,66,69,103,71,50,50,65,65,65,69,115,51,119,65,76,98,65,85,85,81,65,65,66,74, +65,67,81,83,65,70,73,103,103,56,107,56,47,107,110,56,65,65,67,97,65,65,74,47,52,65,71,111,81,82,89,107, +69,47,66,66,47,43,65,71,65,65,65,89,65,65,116,65,119,65,86,118,100,117,50,65,74,109,84,111,65,66,73,65, +73,77,65,119,65,65,119,65,65,103,103,110,47,52,76,65,65,69,85,65,65,65,66,65,73,81,67,65,86,108,119,72, +65,43,50,50,43,43,43,51,65,65,119,72,47,66,120,74,65,89,69,65,103,72,72,65,72,72,65,65,100,50,119,50, +50,69,65,68,65,65,65,65,65,65,113,111,55,111,119,66,75,83,100,73,65,65,52,52,65,65,65,71,71,50,65,65, +65,69,107,65,47,47,76,65,65,65,103,65,65,52,66,65,73,83,83,65,86,117,50,65,65,54,113,54,54,54,54,88, +69,107,119,72,47,66,73,73,68,98,68,103,103,110,52,70,111,109,119,65,77,87,71,71,71,69,65,65,89,65,65,65, +65,69,116,115,72,100,111,65,106,84,112,119,65,65,69,65,65,65,65,71,65,65,65,98,98,89,103,72,73,52,76,70, +100,72,72,67,50,65,66,66,65,81,67,83,108,111,119,107,65,55,98,55,55,55,55,102,69,65,119,72,47,73,73,65, +98,98,97,65,107,65,65,49,115,71,71,65,83,87,69,109,119,69,103,98,69,72,69,65,65,65,120,79,116,70,112,74, +122,100,80,65,65,65,52,52,65,65,65,65,50,119,65,65,89,65,65,66,74,76,98,68,68,72,52,67,71,65,66,74, +65,81,67,107,108,65,72,99,65,47,57,57,57,57,118,57,69,107,67,97,65,74,73,65,68,98,66,111,103,108,117,50, +65,109,119,71,83,87,103,109,71,69,56,52,72,47,47,65,65,65,67,81,65,65,73,104,82,112,52,111,67,65,56,52, +65,67,83,83,119,65,65,89,89,111,65,72,73,52,65,70,100,65,65,67,83,74,74,74,74,74,74,107,108,65,119,107, +65,68,65,65,89,65,71,65,69,65,65,98,89,77,73,65,65,89,65,65,103,108,50,49,65,71,71,71,83,81,107,103, +65,69,109,103,65,52,52,83,83,83,83,73,69,66,71,97,100,80,65,103,107,103,47,105,83,83,74,75,71,65,65,68, +89,72,72,67,81,65,65,72,88,65,65,65,89,65,65,65,65,66,77,107,111,65,119,107,65,68,65,68,65,81,49,119, +69,65,68,70,65,103,103,65,65,65,65,68,76,50,50,116,65,50,65,119,67,65,103,103,73,69,56,52,67,72,65,87, +121,50,83,76,111,73,109,98,112,103,103,89,103,103,107,105,116,116,74,75,65,89,65,65,65,72,72,86,113,66,103,83, +83,83,47,107,73,71,65,119,119,120,74,107,111,65,65,65,65,68,65,89,65,81,71,65,72,47,68,117,111,107,103,69, +69,103,50,65,97,117,50,116,111,65,65,65,105,103,119,66,66,65,65,65,66,47,52,83,83,83,81,74,66,69,121,100, +56,52,89,81,107,103,65,67,83,83,74,75,74,74,74,107,107,72,72,81,67,65,110,83,54,83,47,107,89,119,119,119, +119,120,53,107,111,65,119,89,89,68,68,50,81,81,65,71,72,88,68,70,68,108,103,69,65,103,119,120,86,108,50,116, +65,107,103,69,107,107,74,65,73,119,65,65,66,107,103,83,83,83,81,76,111,109,84,53,47,103,67,73,68,65,68,65, +65,67,83,83,81,81,81,47,47,72,47,67,81,65,103,87,65,83,47,107,73,50,119,50,119,120,74,107,111,65,119,89, +65,68,101,50,67,65,65,103,103,47,68,65,68,70,65,69,65,103,50,67,76,77,56,108,111,66,103,65,110,103,66,65, +65,103,103,81,65,65,65,83,83,83,81,74,69,121,100,80,56,52,73,65,68,68,68,72,88,65,65,65,65,65,65,83, +83,65,65,65,68,98,65,65,65,83,47,107,89,119,119,119,119,66,53,107,78,65,65,89,89,68,101,50,65,65,69,71, +69,72,65,98,89,108,65,65,107,65,119,122,90,102,47,57,66,66,103,69,47,56,71,71,65,98,89,65,65,65,71,65, +69,98,65,73,109,84,115,69,103,66,74,65,68,89,89,72,54,65,65,68,98,65,65,65,65,65,65,77,73,89,50,119, +50,119,50,107,73,119,119,119,119,119,74,74,78,65,65,65,65,68,68,119,65,65,103,71,65,103,65,65,69,70,89,65, +65,65,65,69,76,77,56,108,112,66,103,65,110,103,66,74,65,103,103,65,67,65,65,65,69,89,90,69,121,100,73,103, +73,69,107,72,110,65,65,67,83,81,71,50,122,66,83,74,108,108,73,74,76,81,71,65,119,65,50,107,65,65,65,65, +65,65,75,83,73,65,72,47,65,68,65,89,65,83,72,77,98,116,98,104,52,107,65,65,65,65,119,70,74,89,65,65, +66,66,103,71,87,87,87,87,65,65,119,65,65,65,65,69,69,98,65,109,84,112,119,104,79,69,69,69,107,71,74,119, +65,65,65,50,89,98,65,65,108,65,73,77,76,98,48,119,50,119,69,107,69,65,103,110,74,74,75,83,73,65,52,65, +52,68,65,68,65,67,72,77,107,107,107,104,52,72,65,65,65,65,83,71,84,74,74,73,103,73,103,65,65,65,65,65, +69,56,56,56,56,71,50,65,103,89,99,121,100,69,50,109,74,65,66,72,110,71,107,119,81,67,65,50,89,89,65,65, +65,74,120,73,65,65,65,65,119,65,69,107,69,103,103,47,79,50,76,74,73,65,111,65,111,65,65,65,70,107,115,65, +107,67,83,83,72,65,72,65,65,66,74,80,89,79,101,73,69,107,65,65,65,71,79,69,107,81,65,65,65,71,50,65, +69,107,109,107,104,66,107,50,120,65,65,67,83,66,107,73,65,65,65,119,65,69,103,103,65,65,73,65,72,47,107,104, +74,65,69,107,69,69,103,74,79,49,78,65,65,70,106,68,108,65,65,71,65,115,103,65,103,71,50,87,65,65,65,65, +119,120,74,79,103,76,76,73,65,65,68,98,52,66,120,65,103,81,69,65,107,71,50,65,69,69,105,99,73,65,69,65, +65,65,65,107,105,48,65,65,67,65,65,65,65,69,69,103,65,65,73,65,72,47,107,104,74,65,52,52,69,65,103,65, +50,70,116,65,65,70,107,99,108,65,71,71,71,69,65,65,107,71,121,50,52,72,74,52,65,65,74,70,111,68,98,65, +65,47,65,68,52,71,79,65,105,81,69,69,65,109,50,65,77,109,106,107,107,74,48,119,47,52,65,67,105,103,119,67, +65,65,85,107,107,107,107,103,65,65,65,65,72,47,107,104,74,65,72,65,65,65,65,71,119,65,68,65,65,65,99,107, +101,65,71,71,71,65,65,65,69,71,87,50,65,73,65,65,67,65,66,74,119,70,89,65,65,65,68,68,65,65,67,81, +65,90,89,107,69,109,81,81,69,121,108,73,66,78,48,49,47,52,65,65,103,119,68,65,83,83,72,47,47,56,107,103, +65,65,65,65,65,52,69,65,73,67,88,107,71,52,69,56,50,65,98,65,103,107,106,106,71,119,65,119,119,65,65,72, +107,67,83,83,72,65,72,69,107,107,66,74,73,70,119,89,65,72,65,89,107,107,103,101,89,76,73,65,65,87,83,81, +107,69,104,65,66,74,65,69,103,65,65,71,65,103,89,89,69,103,66,74,74,73,107,65,65,65,65,111,65,65,65,65, +65,65,88,103,72,79,80,47,65,119,65,65,47,47,52,89,50,65,65,65,52,52,52,52,52,65,116,111,83,88,65,69, +69,69,66,74,81,69,71,89,65,72,65,65,65,103,81,89,89,90,89,65,65,88,82,85,69,100,103,65,65,73,103,103, +106,65,65,65,109,65,98,89,69,65,65,65,65,65,65,50,98,107,57,111,70,52,69,72,78,116,72,65,109,48,48,56, +65,73,65,65,74,74,73,65,71,121,83,81,52,52,52,72,65,65,65,111,81,65,103,65,65,65,65,99,103,69,65,119, +65,72,65,65,65,103,67,107,103,65,65,65,65,83,81,109,85,112,103,65,65,73,69,106,98,98,65,65,65,65,89,90, +69,103,69,56,72,47,65,71,65,119,70,113,86,111,65,72,72,66,65,50,72,79,73,69,87,65,65,65,80,107,107,107, +103,81,69,81,69,65,110,72,72,65,70,65,83,65,98,50,81,81,65,106,89,89,89,98,102,72,65,65,65,103,65,69, +71,119,65,65,119,66,69,121,99,73,103,65,65,65,103,106,67,68,65,69,83,81,65,81,65,103,69,56,69,107,65,71, +71,69,77,86,113,65,65,88,57,112,73,119,71,52,67,81,105,65,65,65,80,110,47,47,52,65,107,81,103,103,103,52, +72,87,86,65,81,65,102,50,65,65,65,99,65,69,107,65,65,54,83,83,81,103,65,69,71,66,74,72,65,65,109,107, +104,65,65,65,65,69,103,103,55,52,56,56,54,65,72,88,69,103,56,107,65,47,52,71,119,66,70,86,111,65,65,88, +72,66,65,50,83,83,81,83,69,65,65,65,80,104,74,74,73,81,105,65,107,103,104,53,68,65,68,65,83,87,53,57, +81,81,65,106,83,81,105,65,65,67,81,67,88,47,65,69,65,120,65,65,66,65,120,107,77,100,71,65,50,65,71,65, +68,65,110,47,105,65,119,81,119,65,65,65,72,47,47,71,71,66,70,86,83,65,65,88,70,65,65,65,111,111,65,73, +65,65,65,65,107,107,103,65,107,107,103,65,103,103,110,72,111,50,119,111,65,119,119,65,65,65,65,99,81,65,105,65, +65,97,86,97,82,74,65,107,109,120,73,65,66,104,82,104,84,114,50,119,119,119,119,119,73,73,56,56,54,72,65,65, +72,65,65,65,65,107,103,71,65,48,77,86,113,65,65,81,65,65,65,65,116,111,111,65,65,65,105,65,47,47,52,65, +52,65,65,65,65,65,66,53,103,119,119,103,69,71,69,65,70,65,103,106,83,65,67,81,65,113,84,67,88,80,65,65, +65,66,65,65,66,82,100,73,85,100,50,119,119,119,50,119,67,65,72,110,83,67,67,67,65,65,65,65,69,69,69,65, +65,65,66,113,81,66,74,117,50,65,65,89,111,111,111,81,65,69,65,81,74,74,73,83,83,81,65,65,52,52,52,65, +65,119,119,74,73,107,103,65,98,89,119,99,81,68,98,65,70,89,100,65,72,80,65,65,65,66,65,65,104,74,112,65, +83,119,49,78,50,65,119,119,65,65,122,98,65,65,69,85,81,119,65,65,57,103,103,52,65,65,69,116,111,65,66,111, +66,65,68,68,65,65,72,72,65,65,105,65,65,88,110,47,65,116,111,65,65,65,65,65,65,71,65,66,65,69,65,65, +68,65,81,106,81,103,89,65,65,69,69,69,65,65,65,65,65,72,65,98,97,102,73,74,73,119,65,73,65,65,116,111, +65,71,50,89,66,74,77,107,81,47,52,72,52,69,65,47,65,69,73,65,65,66,74,111,104,67,68,98,65,72,65,119, +65,65,103,81,65,52,53,74,65,50,119,65,65,65,98,89,65,65,65,74,67,69,67,65,89,89,65,99,65,89,90,66, +74,65,50,119,65,119,65,65,65,54,52,98,98,54,52,73,119,119,65,119,65,65,111,111,67,67,111,83,81,74,77,85, +81,107,103,116,118,65,72,65,98,89,65,65,71,120,65,111,65,67,68,65,65,65,47,52,65,65,67,73,73,110,85,107, +98,98,89,65,65,68,68,68,98,98,98,89,65,85,81,65,65,65,104,65,65,98,102,66,53,69,69,69,71,71,79,79, +54,52,65,98,100,65,65,74,71,83,81,111,65,65,116,111,67,83,111,83,82,73,65,65,65,119,65,116,111,47,52,65, +65,52,65,65,71,71,74,98,98,97,65,98,65,65,52,52,65,73,73,73,73,81,66,73,98,65,65,89,65,68,68,68, +116,116,116,118,72,69,65,65,71,65,43,81,107,83,118,66,53,65,65,65,65,120,120,120,83,81,116,98,100,111,65,73, +65,83,81,119,65,65,111,65,105,67,116,81,81,80,47,47,52,119,65,116,118,103,110,65,119,52,83,65,71,71,65,65, +65,47,72,65,65,73,65,65,65,66,65,73,73,52,107,107,65,65,65,68,52,65,98,89,47,47,47,55,55,69,88,78, +107,103,79,56,103,83,73,65,65,116,111,65,67,65,79,48,54,52,114,98,98,117,65,73,65,83,81,65,65,65,111,119, +103,65,69,48,66,80,74,74,52,68,89,102,56,69,69,47,98,89,83,81,71,71,65,65,72,65,53,65,65,73,103,103, +103,81,81,74,73,66,74,74,73,65,65,65,89,65,80,73,116,116,116,118,47,69,122,106,69,65,65,85,107,82,76,65, +68,114,111,107,105,81,77,65,65,98,98,98,98,98,89,73,119,65,65,72,103,68,65,109,103,65,71,79,65,68,65,65, +89,68,98,89,52,103,103,52,65,65,81,65,71,119,67,56,65,47,72,65,47,74,69,69,65,67,65,69,69,83,65,65, +116,116,65,65,68,65,47,52,98,98,98,89,52,65,73,65,103,103,73,66,107,74,76,116,114,116,111,50,119,81,79,109, +65,99,106,106,106,107,89,65,65,65,65,72,107,74,89,48,119,68,69,48,65,66,47,47,73,65,98,65,65,69,109,82, +65,67,83,65,65,65,67,56,65,103,103,65,47,67,113,113,65,103,103,71,109,83,65,70,65,65,111,70,111,89,80,73, +65,65,65,72,47,72,75,88,73,65,52,65,107,65,76,109,68,103,65,65,107,73,73,107,109,99,107,116,115,107,101,119, +119,65,65,72,56,74,68,65,65,98,65,65,65,65,65,65,65,65,65,65,65,107,121,78,103,65,83,70,111,47,54,56, +69,115,115,65,84,65,86,87,71,69,119,66,120,83,65,111,50,119,70,68,100,111,65,65,65,65,65,72,72,52,82,52, +70,116,107,77,47,50,73,103,119,108,108,108,104,106,98,69,121,98,98,98,98,98,101,65,119,65,103,103,106,89,65,98, +68,65,89,65,65,65,65,65,65,65,65,67,67,87,82,116,119,111,81,81,116,52,67,69,69,115,115,65,47,65,75,71, +50,71,65,65,73,83,119,111,119,71,70,73,76,100,67,67,81,65,65,72,72,65,65,103,65,111,85,107,65,47,77,109, +50,107,69,65,107,73,52,65,68,112,65,65,65,65,50,67,83,119,103,103,106,68,69,65,89,65,65,65,65,65,65,81, +65,81,98,97,83,81,65,73,73,111,67,65,111,47,67,69,65,106,103,65,47,65,65,66,120,65,119,65,65,83,65,111, +119,71,72,72,72,65,67,67,65,65,83,56,65,68,65,103,65,111,77,77,47,116,65,119,119,119,70,65,65,65,56,65, +70,73,68,118,114,65,65,67,67,65,69,77,68,89,120,119,65,119,68,68,65,65,65,83,67,81,116,113,67,70,116,74, +73,65,89,89,89,52,67,69,65,106,103,66,74,66,72,65,119,72,71,65,65,83,65,111,50,119,66,65,66,65,83,67, +81,65,88,52,65,89,69,56,111,111,82,74,107,65,71,119,119,50,69,65,65,65,65,65,66,65,68,118,114,65,65,67, +83,65,66,104,68,69,73,77,65,65,76,74,66,65,65,81,81,81,50,119,65,67,83,73,76,68,68,68,68,47,52,65, +65,98,89,66,74,65,65,111,65,111,119,65,65,83,65,111,119,65,118,72,72,65,65,65,65,65,47,103,109,119,65,47, +111,111,74,65,81,65,87,71,50,71,70,65,65,65,65,65,73,73,68,118,114,65,108,75,67,65,100,57,98,65,120,119, +65,65,76,73,89,68,65,65,65,47,65,65,65,70,116,73,73,89,65,65,65,65,65,65,65,65,65,71,50,86,82,80, +118,52,65,65,65,83,89,70,119,70,65,81,65,65,65,65,65,65,103,69,65,119,65,110,116,111,82,73,83,67,87,119, +65,50,72,52,52,65,65,65,68,65,68,118,114,103,108,76,65,112,115,99,112,65,69,65,104,103,76,74,66,65,65,65, +72,72,66,74,74,77,107,65,72,80,65,65,65,72,110,83,81,65,89,101,50,86,82,112,118,118,65,65,65,83,79,71, +116,111,65,65,65,52,72,65,72,66,73,65,65,81,65,110,47,52,74,65,81,81,81,50,50,119,72,72,71,71,71,71, +65,89,68,72,114,110,108,73,111,111,115,107,111,65,65,65,73,65,65,65,65,65,65,89,72,47,65,65,65,72,47,107, +104,53,67,66,69,66,74,83,67,65,98,69,107,83,82,78,118,57,72,119,65,65,73,65,69,65,56,52,72,72,65,65, +65,119,66,65,65,67,67,83,72,103,82,47,81,65,81,65,65,65,72,47,43,119,65,119,67,65,65,65,69,107,108,76, +70,111,70,108,65,119,65,65,103,65,68,67,65,65,68,55,72,72,72,47,47,56,107,50,51,80,65,65,65,72,110,81, +83,65,98,69,107,86,82,112,118,118,65,43,103,103,87,50,107,103,107,103,72,47,65,69,65,50,73,65,65,65,65,69, +69,65,74,65,47,47,110,65,65,72,70,116,117,71,65,119,73,81,111,65,69,52,108,76,65,115,69,111,106,119,69,65, +73,65,68,85,81,65,68,65,65,65,65,103,103,103,65,65,65,65,65,65,65,65,65,67,83,65,89,89,65,86,82,78, +118,52,72,119,103,103,81,69,69,69,56,52,72,72,72,65,72,119,66,65,65,65,65,65,103,65,111,74,53,102,72,119, +69,52,57,65,65,65,65,65,101,65,111,65,69,49,116,65,65,103,103,103,103,119,103,103,104,103,98,83,81,83,81,89, +65,49,66,52,52,52,65,47,52,68,47,47,47,55,65,65,65,81,65,82,65,73,65,83,65,65,65,65,69,65,65,80, +77,65,65,65,65,65,65,47,56,104,73,65,72,47,65,107,107,103,71,65,55,80,65,119,67,52,52,116,65,65,65,65, +73,119,111,65,69,57,116,69,103,69,48,65,47,119,69,65,65,65,98,81,81,65,81,68,71,49,111,107,48,50,119,56, +107,65,69,107,107,65,65,67,81,71,107,120,76,73,67,81,65,80,103,65,65,69,107,53,56,65,83,121,98,98,89,65, +109,48,65,65,54,83,52,103,103,103,50,50,47,55,65,50,50,52,57,65,65,103,107,65,89,89,117,65,69,70,116,109, +48,65,103,119,119,69,105,107,72,47,107,110,47,65,84,55,65,83,71,71,119,119,50,56,56,65,65,69,65,65,107,81, +67,65,109,104,90,73,67,81,107,107,107,107,107,71,50,80,73,65,67,83,89,89,89,69,71,119,103,72,121,83,88,65, +65,65,71,65,53,53,65,50,75,72,68,114,89,119,119,119,73,119,111,65,72,107,103,109,48,65,71,71,71,65,67,65, +71,74,48,51,110,81,81,89,65,81,65,50,50,50,50,47,56,65,65,69,89,89,107,103,65,84,69,48,107,107,65,77, +107,107,107,107,107,72,71,119,69,105,83,67,98,98,56,56,50,50,107,43,83,67,83,52,65,103,65,65,55,80,72,119, +67,65,65,89,71,119,65,65,68,65,111,66,68,87,81,69,103,65,71,71,71,65,67,65,69,107,48,51,47,67,68,65, +65,65,65,65,65,65,65,56,107,68,69,69,98,89,116,103,107,75,73,65,103,103,66,66,107,107,107,107,107,72,43,119, +69,116,86,65,99,48,102,47,122,101,47,43,81,67,83,52,69,65,69,107,65,65,69,81,71,103,68,98,89,65,50,51, +65,72,111,65,72,81,81,67,65,107,107,109,65,67,67,67,119,65,65,65,70,116,101,89,71,119,111,65,65,65,65,81, +65,98,99,107,89,89,74,103,69,82,65,65,103,69,80,72,73,65,65,69,107,72,71,65,69,116,86,65,47,72,56,56, +68,68,107,43,81,83,83,52,69,103,69,107,47,52,65,65,65,65,65,66,49,73,107,119,65,65,111,66,89,69,65,83, +65,67,67,65,65,65,83,81,65,65,73,65,78,86,98,89,119,65,116,98,65,65,67,54,68,89,98,65,65,65,74,69, +103,65,65,65,65,65,73,65,73,65,65,69,107,65,65,65,69,105,81,65,47,47,52,65,69,119,65,43,83,83,83,52, +69,65,69,107,52,52,73,66,66,73,74,71,116,103,65,51,72,72,111,65,52,65,98,97,81,67,67,65,67,65,65,65, +72,83,82,66,70,116,89,89,119,65,116,98,65,72,88,88,88,98,89,111,65,111,65,65,65,65,65,65,65,65,66,74, +119,65,65,69,107,65,65,65,65,65,65,65,47,47,52,65,69,71,68,102,83,83,88,69,107,103,65,65,47,52,65,65, +65,73,76,66,115,73,119,119,65,119,65,116,111,72,98,97,65,65,65,81,83,81,81,68,65,52,84,76,65,81,65,65, +119,65,98,100,111,65,67,54,65,68,65,111,65,111,65,65,65,65,66,83,73,65,65,65,119,65,65,69,107,65,66,73, +65,67,67,83,80,47,73,65,69,71,98,98,47,47,52,65,117,111,68,89,65,52,73,66,66,73,73,90,103,73,50,119, +65,73,65,111,52,65,66,65,65,69,56,81,67,65,81,114,65,67,84,68,67,83,107,65,71,119,98,105,73,65,65,81, +47,52,71,70,70,66,74,65,65,65,66,47,73,52,65,52,119,65,65,107,107,65,66,66,50,121,67,65,74,74,73,65, +69,71,98,98,52,47,52,65,121,119,99,106,107,103,73,66,65,65,65,68,74,65,107,103,65,81,65,116,65,65,66,111, +65,103,103,105,83,83,65,84,65,52,81,65,67,67,65,65,65,65,98,49,103,65,65,52,56,52,119,49,70,66,66,65, +65,65,66,83,73,65,65,65,50,50,50,69,107,65,66,73,74,75,67,81,53,74,52,65,65,65,89,98,47,65,52,65, +76,73,99,106,48,119,73,66,65,65,65,65,89,52,65,65,81,119,103,118,65,65,66,65,69,65,65,69,83,81,65,84, +72,83,88,47,67,83,103,48,65,65,98,75,89,66,65,65,47,52,47,119,111,66,66,65,65,65,65,65,65,65,119,65, +68,77,81,83,107,81,66,66,107,105,83,65,52,65,52,65,65,65,65,98,72,47,65,65,65,65,99,106,107,103,66,73, +65,65,69,65,68,65,65,65,72,80,65,116,111,65,81,65,103,65,65,65,103,65,65,116,65,65,71,65,67,67,65,48, +68,52,98,98,65,66,114,119,65,71,47,51,72,73,73,65,65,65,67,65,65,103,65,103,90,105,67,67,67,65,66,73, +65,65,65,65,47,47,52,65,73,73,109,84,65,52,65,65,65,65,68,89,65,65,67,52,65,65,107,103,65,89,103,69, +65,65,65,65,67,67,88,118,65,65,65,47,110,56,47,107,56,81,50,119,67,67,107,48,72,89,98,98,65,66,114,89, +65,119,50,67,83,65,65,65,119,81,68,65,81,69,107,68,77,67,67,67,81,65,65,83,68,65,89,65,68,101,119,65, +74,77,121,89,65,65,65,65,69,65,68,89,47,47,72,67,65,69,107,107,65,68,69,103,65,73,73,66,67,67,114,114, +111,65,65,72,110,56,110,110,56,87,50,119,65,65,65,65,65,65,65,65,66,66,116,89,103,103,65,107,107,103,52,52, +65,68,70,68,65,65,103,65,65,72,68,65,65,65,67,65,68,68,98,65,89,101,71,71,79,73,65,65,65,65,65,65, +107,103,70,116,65,52,54,72,65,107,107,103,103,68,99,103,65,73,73,73,75,67,65,65,65,65,65,72,107,56,56,110, +47,87,120,50,65,98,107,107,107,107,107,107,104,74,66,65,103,103,65,110,47,103,47,56,103,65,117,111,65,47,52,65, +65,72,89,89,119,70,67,65,68,65,89,65,89,101,71,71,79,73,65,74,97,81,119,69,69,69,70,65,65,47,72,81, +69,107,107,72,69,65,65,65,65,119,119,50,119,81,65,65,65,65,65,72,110,56,56,107,56,87,50,50,65,101,101,50, +50,50,50,50,119,65,65,52,71,70,100,110,118,103,47,56,105,100,51,49,97,107,103,67,65,72,89,89,119,70,65,83, +98,65,65,65,68,101,71,109,71,69,65,65,89,81,119,65,107,103,70,116,119,52,119,119,65,107,107,103,65,65,50,50, +50,50,119,119,119,65,65,65,65,65,65,47,69,65,65,65,65,87,50,50,65,98,69,65,80,73,72,47,65,110,103,65, +103,106,114,110,47,103,47,47,52,65,117,111,65,83,81,65,65,47,68,71,65,70,116,65,65,65,65,69,65,71,48,53, +48,107,65,73,97,81,65,69,69,69,70,65,50,50,119,111,119,69,107,107,72,65,50,65,65,65,65,65,65,71,65,65, +65,65,65,50,69,47,56,114,111,50,119,50,65,89,100,89,47,52,52,65,52,47,52,65,103,108,100,107,107,103,47,53, +73,68,70,68,65,111,69,107,107,65,111,70,69,69,107,107,69,84,65,50,68,65,110,79,103,103,103,74,89,81,119,65, +65,65,70,65,119,119,119,119,65,65,107,103,65,65,65,72,47,52,119,119,119,71,101,98,98,65,65,50,69,56,56,100, +89,50,65,71,65,68,71,67,80,73,52,72,52,110,109,119,65,66,74,65,65,65,47,53,73,81,68,65,81,111,65,65, +65,70,65,107,69,107,107,107,107,106,69,107,89,65,53,65,69,107,65,65,65,72,47,65,65,71,109,65,65,65,65,117, +111,65,69,65,65,72,47,52,52,72,119,119,65,71,50,50,50,65,65,47,69,47,56,114,111,119,109,108,70,116,118,108, +73,65,52,52,52,65,71,66,66,66,72,65,65,65,73,65,81,65,67,65,65,111,98,89,65,113,86,70,69,48,107,107, +48,84,71,122,65,65,65,65,65,70,116,67,83,65,72,65,65,69,48,52,67,67,65,65,65,65,47,65,65,72,65,72, +52,72,50,119,119,87,101,98,98,65,65,43,107,108,86,71,103,109,50,49,116,70,69,107,65,65,72,47,65,65,71,120, +73,66,66,65,65,107,77,103,67,65,66,47,47,111,101,89,70,65,103,70,69,71,107,109,99,106,69,97,66,74,103,65, +65,70,116,67,83,65,52,65,65,71,109,70,81,81,81,119,105,103,52,107,50,72,67,65,52,72,119,119,119,81,65,103, +65,65,70,43,107,105,75,71,69,71,109,108,70,70,65,81,81,83,68,98,65,65,71,66,66,66,74,65,65,103,73,105, +83,74,74,74,74,111,98,89,113,86,65,69,69,65,48,122,99,84,68,121,66,69,69,65,65,68,98,67,83,72,50,83, +81,69,69,67,67,67,65,65,82,81,47,103,89,89,86,81,47,52,119,65,65,87,65,103,103,65,65,50,107,108,86,71, +69,71,107,107,54,52,65,83,65,81,84,65,65,65,65,65,65,72,65,114,114,65,65,65,65,65,65,107,107,111,89,70, +65,104,116,116,69,68,101,98,99,106,102,121,66,73,119,103,65,116,116,111,65,52,65,81,65,119,119,119,65,81,65,65, +105,103,65,69,98,67,65,67,71,50,120,65,83,83,81,107,65,72,47,51,107,103,107,71,47,43,65,103,105,103,65,81, +65,83,68,98,70,116,65,65,65,65,52,116,114,65,65,119,65,119,65,65,65,111,89,113,86,90,117,115,69,68,101,98, +99,84,68,121,66,71,69,65,65,66,74,56,53,74,71,83,65,81,65,88,83,50,107,70,65,72,89,107,65,65,72,47, +47,47,47,65,65,86,116,103,103,72,102,107,107,107,107,107,56,103,103,103,54,52,69,103,89,81,84,81,65,114,65,54, +52,47,52,114,116,65,65,66,66,65,119,69,103,111,70,65,111,90,116,116,56,68,101,65,99,106,65,97,66,65,103,65, +69,66,74,56,53,74,65,81,65,68,68,66,83,50,107,70,111,118,68,52,72,111,115,107,107,107,107,69,65,86,65,103, +69,72,47,65,65,65,65,65,47,52,107,103,68,89,89,65,65,65,68,65,65,114,89,85,82,120,73,65,65,65,65,66, +104,71,71,69,65,111,113,85,65,90,117,115,56,89,65,68,69,84,81,84,66,69,69,50,103,104,53,56,53,53,65,81, +65,65,111,71,83,50,107,70,70,72,89,52,72,111,118,47,47,47,47,69,65,86,70,65,65,107,65,98,65,81,65,81, +66,73,107,65,89,68,65,65,47,47,65,74,73,114,89,54,43,50,119,69,107,103,65,66,66,65,119,72,52,116,65,111, +65,90,116,116,56,89,65,68,69,106,67,67,97,65,109,109,48,66,47,56,47,53,65,65,65,65,65,68,65,65,65,70, +65,72,68,70,73,116,111,65,65,65,69,107,65,86,116,65,65,103,103,89,89,81,81,81,73,65,103,103,68,89,89,65, +56,110,65,73,70,116,65,65,66,120,75,83,107,106,89,65,65,81,66,66,65,111,69,65,65,98,89,69,56,68,89,65, +99,84,67,67,68,116,115,117,65,65,65,65,65,83,83,65,65,65,65,65,47,51,47,70,65,72,89,66,111,111,111,65, +65,65,69,82,74,73,65,65,65,107,65,98,71,121,67,71,120,73,107,120,74,103,65,65,56,110,103,74,73,65,65,98, +89,65,65,81,107,103,68,65,107,103,65,66,73,65,65,72,73,65,65,66,74,65,65,65,65,65,67,67,81,111,67,111, +89,89,89,50,119,47,47,65,65,65,65,65,43,51,72,65,65,65,71,117,65,65,121,119,65,70,69,104,65,65,65,65, +65,103,65,65,71,50,50,50,119,65,65,120,73,67,65,52,47,56,103,65,73,52,52,65,97,56,81,81,103,65,65,107, +111,110,65,111,72,72,72,47,80,47,47,47,51,47,72,47,72,47,72,47,72,70,83,111,98,89,89,119,65,74,74,74, +74,73,65,65,47,51,47,65,71,119,70,116,65,73,87,81,65,65,65,104,65,72,47,57,65,103,103,65,65,71,50,119, +65,65,74,105,67,67,65,65,65,65,116,74,73,65,65,89,89,65,83,85,103,65,65,89,67,65,68,65,65,65,65,74, +74,74,73,65,119,65,65,65,65,65,65,65,65,111,67,111,89,89,89,50,50,65,65,65,65,65,65,65,55,51,102,65, +122,71,71,117,72,71,121,119,65,65,65,104,74,65,52,65,70,107,65,65,65,65,50,116,111,65,74,66,74,74,65,65, +65,57,65,111,69,65,69,98,101,107,68,89,98,65,98,89,65,71,71,50,119,68,68,47,80,47,52,65,65,68,68,65, +89,89,67,83,65,116,111,116,115,107,107,103,119,47,47,47,47,52,65,65,55,122,102,65,119,71,65,65,81,103,81,65, +65,65,65,104,65,65,47,70,111,103,65,65,65,65,50,111,70,68,98,70,65,70,50,50,119,111,116,116,69,69,69,65, +71,48,71,71,71,65,65,89,107,103,71,65,71,68,89,98,107,103,67,65,73,89,65,76,52,55,65,65,65,117,119,117, +69,69,65,103,119,65,98,98,98,89,65,65,98,122,98,89,71,119,65,65,71,72,65,65,70,65,65,104,65,65,52,83, +87,71,73,74,65,65,50,111,70,89,65,70,111,116,65,119,70,65,111,65,65,103,103,65,65,65,116,116,116,111,65,89, +52,107,71,65,65,68,68,68,109,103,81,81,65,65,111,65,98,89,119,81,65,117,49,119,69,107,103,103,116,116,116,116, +116,116,112,74,47,65,65,65,79,73,65,114,68,73,65,65,70,116,65,104,65,89,52,67,71,50,66,66,83,81,50,111, +111,89,65,70,70,70,65,49,111,72,70,116,116,65,65,65,65,70,69,107,107,70,65,89,69,103,72,51,43,52,65,65, +107,103,71,65,65,89,65,73,65,65,119,81,65,117,117,71,89,65,70,111,50,50,51,47,47,47,53,74,57,52,65,65, +50,119,70,111,89,80,73,72,70,70,70,109,115,65,52,83,87,71,65,66,82,73,50,65,65,68,98,70,70,70,65,119, +71,103,65,52,52,65,65,65,70,65,109,50,50,103,111,69,69,103,47,47,47,47,66,74,66,73,119,122,68,66,66,65, +65,65,48,81,65,111,65,65,89,68,65,65,98,98,100,116,116,116,112,74,47,116,111,50,79,74,50,114,68,80,73,72, +65,70,116,105,70,65,89,68,65,65,65,65,83,81,69,107,107,65,65,100,70,70,65,119,71,103,72,72,72,72,88,65, +116,69,121,97,97,48,70,65,107,65,47,47,47,47,65,52,77,104,119,119,103,65,65,66,98,90,119,81,65,111,65,65, +89,68,111,70,65,65,98,98,98,98,97,83,57,52,65,120,119,66,50,81,65,74,73,65,50,49,70,104,87,68,65,89, +71,50,50,119,74,73,69,69,69,68,98,70,65,70,68,119,71,103,65,52,52,52,54,65,65,109,55,114,114,43,103,111, +65,65,47,72,52,47,72,72,66,73,71,111,65,114,98,68,65,68,70,43,65,116,111,68,89,98,70,111,65,65,65,65, +47,107,105,67,72,69,47,50,47,53,75,83,107,47,73,65,50,71,65,103,65,65,89,89,65,65,65,120,97,119,69,103, +107,65,47,52,65,65,89,89,65,89,72,72,72,72,88,89,52,110,100,108,108,102,103,111,65,119,47,52,72,47,65,65, +71,50,65,70,116,65,89,68,71,68,70,43,83,81,81,65,65,65,65,65,72,73,80,72,72,50,105,81,65,69,110,51, +47,47,47,52,65,74,73,65,117,119,65,103,74,65,65,67,65,71,50,120,87,52,65,50,119,65,88,81,65,65,89,65, +69,69,65,52,52,54,54,89,65,109,100,107,108,101,103,111,65,71,72,47,47,52,65,65,119,65,119,65,52,65,89,68, +65,68,65,71,83,81,69,69,65,65,103,65,65,65,65,65,72,48,105,67,69,69,107,51,47,47,47,52,71,53,52,65, +117,71,65,98,90,65,65,65,81,71,71,120,97,119,65,67,65,65,47,81,65,65,68,65,73,89,80,72,72,72,88,89, +111,109,84,115,114,87,103,117,119,71,65,47,47,68,84,71,83,114,101,65,65,107,103,66,98,90,69,107,83,81,69,107, +65,65,103,65,69,65,69,65,72,50,105,83,110,107,110,47,47,47,116,50,119,74,73,65,109,119,65,89,90,81,83,83, +81,65,89,119,74,73,65,67,65,69,65,65,65,71,65,90,65,103,66,52,52,54,52,89,111,103,121,100,97,119,103,111, +71,50,119,65,65,67,113,71,65,111,71,72,72,107,103,65,65,65,47,110,52,65,69,69,65,65,103,65,65,50,119,69, +72,107,103,65,69,69,47,47,110,47,57,116,65,65,65,65,103,65,65,98,89,81,81,65,103,68,98,65,65,65,52,67, +66,87,50,71,65,71,89,89,65,122,51,72,72,72,88,89,70,69,71,84,87,69,70,71,122,98,89,65,65,68,84,65, +83,114,89,65,103,72,68,68,65,51,47,47,47,119,69,69,65,65,103,65,65,65,65,65,65,68,98,89,89,84,47,56, +107,47,47,52,65,65,65,65,100,111,65,74,75,81,83,65,65,65,65,66,74,73,65,73,79,79,87,71,65,71,68,65, +65,98,89,52,52,54,52,89,111,111,103,122,119,107,115,65,68,98,89,65,65,65,71,50,81,65,89,72,72,72,108,116, +65,47,107,56,110,52,66,56,65,103,103,65,65,67,81,67,65,68,65,65,89,88,102,47,110,47,50,48,107,107,107,103, +82,65,81,73,73,71,119,71,66,74,65,66,65,73,65,73,82,117,48,119,50,119,68,65,65,122,51,72,72,72,98,89, +65,70,69,71,69,66,66,65,68,98,102,74,73,73,79,117,83,114,89,65,65,72,103,111,71,47,107,107,110,43,66,56, +65,107,103,65,74,81,67,67,65,122,98,89,97,72,102,47,110,47,107,109,50,50,50,120,65,75,81,73,77,119,65,71, +66,104,65,66,73,73,66,77,72,51,71,101,119,107,81,103,65,65,65,52,52,52,52,70,65,70,111,103,109,111,73,119, +68,98,102,80,74,73,79,50,65,65,65,65,119,65,103,111,65,51,56,107,47,119,65,70,108,108,108,108,74,73,67,67, +71,71,65,65,65,72,47,47,110,47,50,119,65,65,65,66,66,67,81,65,69,71,69,109,66,74,70,111,65,65,66,73, +111,111,111,120,119,103,80,111,65,100,100,111,67,69,107,70,70,70,65,69,119,119,65,71,119,65,72,74,73,73,74,66, +65,65,65,71,50,65,106,68,65,71,47,110,43,65,65,66,66,66,66,65,103,103,88,105,51,47,120,73,49,51,47,47, +47,47,47,52,65,65,65,66,73,67,81,68,69,107,48,109,66,65,70,113,65,66,73,72,67,83,72,50,119,107,103,119, +52,70,68,67,67,72,110,65,111,111,65,111,71,65,65,65,65,65,119,70,116,116,71,65,65,65,65,71,71,65,107,107, +107,107,110,47,116,116,114,65,68,65,65,65,65,65,88,54,110,80,104,83,116,118,47,47,47,47,43,109,109,98,89,66, +66,67,81,90,89,50,65,71,65,65,65,67,65,66,73,111,113,83,111,111,107,69,65,65,65,68,70,67,83,69,110,98, +98,98,65,70,105,103,65,65,65,77,69,65,70,65,50,119,65,65,65,47,113,54,103,69,107,65,65,52,65,65,70,66, +66,69,65,107,103,69,72,103,104,74,105,82,49,51,47,47,47,47,56,56,48,99,89,66,65,73,68,76,76,65,65,65, +65,65,107,67,65,66,65,72,67,83,72,67,65,107,66,66,72,65,74,75,67,68,98,70,65,114,65,65,69,69,103,107, +73,77,107,65,70,65,71,65,65,65,65,118,113,54,68,69,56,65,89,71,80,79,70,65,65,69,65,103,103,69,85,105, +79,79,73,74,98,102,47,47,47,47,43,109,109,98,89,65,65,65,66,90,90,65,50,119,69,103,103,105,81,81,81,65, +111,119,111,65,81,67,66,73,72,66,73,67,73,68,65,70,70,89,65,50,71,69,69,69,78,77,69,65,70,65,71,65, +81,81,89,116,113,83,119,48,107,68,68,65,72,65,70,67,67,69,89,103,103,99,72,103,74,120,73,65,102,98,47,47, +47,47,56,52,48,66,74,65,57,70,65,76,73,65,65,65,103,103,107,65,67,67,107,69,110,65,72,65,67,111,112,66, +47,74,74,74,74,68,98,70,114,68,83,119,119,48,65,69,65,73,119,65,70,65,107,103,83,84,90,74,109,66,119,119, +103,106,98,71,73,79,70,66,74,69,89,107,103,99,65,65,72,47,66,112,98,98,65,65,65,68,65,65,109,73,81,72, +70,111,65,66,72,77,107,107,69,65,103,103,65,65,103,107,103,103,103,69,103,69,68,98,71,50,50,50,80,118,118,70, +100,67,65,119,119,119,66,74,74,73,65,65,65,65,65,65,81,81,90,66,103,66,50,119,103,106,98,65,65,65,65,68, +65,65,98,65,68,89,65,85,103,52,70,70,107,106,65,65,72,68,103,69,48,73,81,65,57,70,65,65,66,77,107,103, +65,65,103,69,65,65,107,69,69,65,66,74,74,74,68,114,50,71,71,50,80,118,118,70,65,111,83,68,65,68,66,74, +74,65,65,71,87,65,65,65,111,65,66,74,103,66,119,119,65,65,65,65,65,65,82,80,56,103,89,89,89,89,65,87, +103,52,70,73,105,106,98,68,68,98,107,69,109,81,83,81,65,65,65,65,69,107,107,103,65,65,65,65,103,65,65,65, +65,103,103,65,65,103,106,98,50,50,50,50,80,118,118,98,68,98,65,68,89,98,66,74,74,65,65,67,105,65,65,65, +111,111,66,104,107,53,89,68,72,47,67,65,67,67,66,80,56,103,98,65,68,89,65,85,103,52,66,70,107,106,68,65, +68,68,103,107,48,103,81,81,107,103,65,65,71,65,65,65,71,65,66,74,103,50,65,65,72,69,72,65,65,69,65,70, +50,65,65,49,80,118,118,68,98,65,89,68,68,68,89,66,65,89,65,71,87,65,65,65,111,69,107,65,47,65,68,89, +47,47,54,67,67,65,82,80,56,103,83,81,65,65,65,98,98,89,65,65,116,114,65,68,68,68,119,65,109,103,83,81, +65,107,107,107,65,89,68,65,70,71,83,73,107,71,65,65,65,83,107,107,65,103,103,65,43,50,50,56,78,47,47,65, +89,68,68,68,65,65,98,66,65,89,65,98,89,65,65,65,111,118,47,103,65,47,68,89,52,52,54,72,67,67,65,74, +74,70,81,70,65,69,107,65,89,65,77,103,83,114,68,68,68,68,83,81,77,69,107,66,52,65,65,119,71,65,68,65, +111,117,87,73,73,71,65,65,65,87,48,107,65,52,52,65,70,111,116,66,74,65,83,98,97,81,89,68,65,65,71,120, +89,89,89,89,89,65,65,111,115,47,47,56,72,65,89,68,52,52,54,65,54,65,81,65,66,70,81,70,65,69,65,103, +98,89,73,69,83,114,68,68,65,98,81,66,73,111,81,89,69,103,71,65,65,89,65,89,70,67,87,74,66,119,65,65, +65,83,107,107,65,73,73,107,81,68,65,65,68,98,97,98,97,65,65,50,65,65,65,66,98,98,89,98,89,103,65,116, +116,55,55,56,65,65,65,65,47,47,54,47,54,67,65,65,66,70,81,70,65,69,65,103,89,89,73,69,116,111,98,65, +65,103,83,73,73,71,65,66,65,65,65,65,71,65,68,68,68,72,47,74,66,65,65,65,65,52,65,52,65,66,65,105, +103,70,65,65,83,84,105,97,97,104,65,66,103,100,111,66,65,65,65,65,70,116,65,65,65,110,47,103,65,65,116,111, +72,47,67,81,83,65,81,73,66,70,83,86,65,69,107,65,98,74,77,103,74,73,66,74,69,103,82,65,73,113,83,65, +52,103,65,65,65,89,68,89,89,102,110,65,65,65,72,72,65,65,72,47,65,73,73,107,81,66,81,65,65,84,106,84, +84,104,65,66,103,89,113,66,65,65,65,50,116,116,111,65,65,100,56,89,74,65,65,111,65,43,50,83,87,121,119,66, +73,70,116,70,116,69,65,103,89,89,65,65,53,52,66,65,103,103,65,65,69,67,65,66,107,103,65,65,71,65,68,65, +68,72,47,65,65,65,72,72,65,65,65,65,65,65,65,105,103,111,68,65,65,84,99,99,99,90,104,104,103,100,113,67, +72,47,65,119,115,115,111,65,65,98,122,89,73,65,70,65,65,71,65,67,71,65,81,52,119,52,119,52,119,52,119,52, +98,89,65,65,74,73,66,66,107,107,65,65,65,67,83,80,47,52,65,65,65,89,65,100,118,81,81,65,65,65,65,65, +71,65,65,65,65,47,65,72,43,65,69,65,65,84,98,106,106,89,103,103,103,97,67,83,74,74,65,50,116,116,111,65, +65,89,89,89,73,65,65,65,65,43,71,65,71,65,119,98,98,103,69,74,77,77,65,65,65,65,65,65,50,119,66,74, +65,103,65,103,53,47,47,74,47,52,65,65,71,65,65,70,47,67,65,65,65,65,71,87,87,87,87,76,73,47,71,72, +52,65,111,65,81,81,98,98,98,65,69,65,107,105,83,65,47,47,65,119,108,108,103,65,65,89,82,89,74,65,65,51, +65,72,50,65,65,71,119,98,98,65,65,71,50,119,65,71,50,119,65,65,79,73,65,65,65,65,69,69,80,74,74,74, +80,56,107,107,65,69,85,108,118,67,74,73,65,65,65,119,119,119,119,76,73,65,71,74,74,71,65,65,67,74,65,83, +81,89,65,65,65,65,67,65,73,65,65,50,69,107,65,65,65,97,73,89,66,65,65,47,65,72,70,65,65,65,65,68, +65,65,65,119,65,71,50,119,110,79,65,65,69,65,65,65,65,88,52,69,53,47,74,74,74,56,110,107,70,69,105,103, +65,67,47,52,65,65,65,119,120,119,119,76,73,65,71,74,66,52,65,65,65,73,73,65,81,98,55,65,119,65,83,81, +89,65,65,65,103,65,107,103,65,82,73,69,66,65,65,65,47,52,65,65,65,65,72,72,72,69,110,56,103,65,50,65, +73,103,65,65,103,103,65,81,65,72,52,103,65,65,65,74,74,77,47,56,116,69,107,83,65,65,116,113,83,74,65,71, +65,71,65,65,65,103,65,73,104,73,69,65,65,73,79,67,71,52,71,65,65,71,70,122,98,89,117,65,103,65,103,65, +67,73,66,116,74,65,65,65,52,52,69,65,65,53,73,103,103,69,110,56,103,71,65,119,103,73,77,51,69,65,67,81, +65,65,69,107,65,65,98,101,50,48,110,107,70,69,65,81,81,49,119,65,81,73,73,119,120,119,119,107,103,107,107,107, +65,67,89,65,65,73,73,81,65,89,65,119,119,119,65,81,89,71,65,73,103,65,107,103,82,65,66,111,65,65,65,65, +65,111,109,103,111,120,103,107,103,69,110,56,103,65,68,89,53,104,103,43,69,65,65,65,70,116,65,65,72,52,89,71, +83,107,107,107,65,73,67,67,67,71,117,67,81,73,73,65,65,65,65,111,65,50,50,50,65,65,65,65,65,74,65,83, +81,52,65,71,50,65,65,111,122,65,71,65,103,65,65,103,73,74,73,116,65,65,65,65,65,65,69,67,65,56,103,69, +65,65,65,65,65,65,111,70,81,68,80,99,103,103,65,81,70,70,65,81,65,65,68,69,107,107,110,103,66,120,65,81, +81,65,49,119,65,74,65,50,51,103,74,70,65,107,107,107,65,70,119,81,65,81,65,71,65,68,55,65,119,65,81,85, +69,65,111,65,107,103,107,103,70,69,107,111,71,68,116,111,111,111,65,87,83,65,67,65,81,65,65,65,65,65,72,65, +81,89,65,120,103,103,71,119,70,116,68,98,98,65,65,89,65,69,47,47,65,73,65,67,65,65,65,65,65,74,73,79, +107,47,74,65,111,65,65,103,65,72,73,85,107,81,65,65,65,66,74,65,65,65,71,69,103,71,77,73,65,65,65,65, +114,115,74,116,119,122,116,70,70,70,70,83,83,81,83,81,81,65,107,81,47,57,65,111,69,65,71,71,86,81,107,49, +65,65,70,114,111,65,98,89,65,69,110,103,66,120,70,116,65,65,47,72,65,66,66,71,52,107,73,83,81,52,69,65, +65,65,65,81,81,81,67,67,70,70,111,116,65,70,70,115,69,116,65,65,65,65,65,70,100,69,77,65,119,68,100,111, +111,111,65,81,83,67,67,67,81,65,109,103,74,73,98,65,107,107,71,50,113,111,71,50,119,65,68,114,116,111,113,83, +74,69,65,67,65,73,70,107,111,65,65,72,65,66,71,79,69,52,73,65,65,65,107,107,65,65,65,105,83,103,67,67, +65,73,65,73,65,65,65,65,65,65,65,65,72,47,47,70,111,70,70,65,71,98,98,89,65,65,65,65,67,65,67,65, +81,65,85,103,83,81,83,88,52,65,71,71,113,115,69,50,65,83,68,98,118,111,111,65,66,69,65,84,81,98,100,107, +111,73,47,72,81,65,65,65,67,81,65,107,107,103,65,65,65,65,65,107,69,103,65,65,70,74,65,78,71,71,50,71, +65,89,65,65,89,72,65,81,81,70,70,65,65,119,90,74,65,65,69,103,107,66,73,65,65,52,52,52,81,81,81,88, +54,83,83,83,86,85,107,120,119,88,85,103,116,116,113,83,66,69,65,81,81,89,100,116,66,73,47,65,65,65,65,65, +81,67,119,47,88,52,119,56,52,65,65,103,103,103,65,81,70,73,73,78,71,71,65,71,65,68,65,68,107,110,65,69, +65,89,65,89,119,119,90,65,72,47,69,69,69,73,65,65,65,66,74,65,83,81,83,65,66,65,105,66,113,115,69,50, +73,83,85,56,111,111,111,66,66,69,67,65,67,98,100,65,79,120,73,67,83,65,65,65,87,121,65,54,83,52,65,105, +103,65,65,103,65,103,65,81,70,73,66,78,71,65,71,71,65,68,68,68,50,110,71,69,71,68,55,65,71,65,90,66, +72,80,69,69,69,73,65,65,65,65,103,65,81,65,81,81,66,107,69,66,86,85,69,120,119,81,85,103,111,111,113,83, +74,77,103,70,65,89,70,70,104,74,74,83,83,81,65,65,81,67,65,107,107,103,65,56,52,65,65,103,65,103,67,67, +70,73,65,78,50,71,50,71,119,65,89,89,48,51,65,50,119,88,65,72,47,54,90,74,72,47,69,65,69,66,73,65, +65,72,72,65,81,65,83,65,66,103,107,66,34,41,59,10,172,105,109,103,72,101,105,103,104,116,61,103,46,105,109,97, +103,101,77,101,116,114,105,99,115,40,105,109,103,41,46,104,101,105,103,104,116,59,10,172,105,109,103,83,99,114,111,108, +108,61,77,97,116,104,46,102,108,111,111,114,40,77,97,116,104,46,114,97,110,100,111,109,40,41,42,105,109,103,72,101, +105,103,104,116,41,59,10,103,46,114,101,115,101,116,40,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41, +46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,10,103,46,100,114,97,119,83,116,114,105,110,103, +40,69,78,86,46,86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115, +40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49,41,59,10,103,46,100,114,97,119,73,109, +97,103,101,40,105,109,103,44,48,44,50,52,41,59,10,170,103,101,116,86,101,114,115,105,111,110,40,110,97,109,101,44, +102,105,108,101,41,123,172,106,61,115,46,114,101,97,100,74,83,79,78,40,102,105,108,101,44,49,41,59,172,118,61,40, +34,111,98,106,101,99,116,34,138,191,106,41,63,106,46,118,101,114,115,105,111,110,58,181,59,171,118,63,40,110,97,109, +101,43,34,32,34,43,40,118,63,34,118,34,43,118,58,34,85,110,107,110,111,119,110,34,41,41,58,34,78,79,32,34, +43,110,97,109,101,59,125,10,172,118,101,114,115,105,111,110,115,61,91,103,101,116,86,101,114,115,105,111,110,40,34,66, +111,111,116,108,111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,44,103,101,116,86,101,114,115,105, +111,110,40,34,76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,44,103,101,116, +86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110,102,111, +34,41,93,59,10,172,108,111,103,111,61,69,46,116,111,65,114,114,97,121,66,117,102,102,101,114,40,97,116,111,98,40, +34,80,66,119,66,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65, +66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47, +103,65,65,65,65,65,65,65,68,47,119,43,65,65,65,65,81,65,72,65,52,104,65,65,65,65,81,65,77,65,77,104, +65,65,65,65,81,65,89,66,109,104,65,65,65,65,81,65,89,66,71,105,65,65,65,65,81,65,81,67,68,47,72,55, +52,43,82,52,119,71,68,104,111,75,74,67,83,69,119,69,68,103,111,75,74,67,84,56,119,70,68,103,111,75,74,67, +83,65,119,72,68,104,111,75,74,67,83,69,81,72,106,47,72,54,73,43,82,52,89,72,109,65,65,65,65,67,65,65, +89,69,71,65,65,65,66,67,65,65,77,69,77,65,65,65,65,56,65,65,72,65,52,65,65,65,65,65,65,65,68,47, +119,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65, +65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,65,65,65,65,65,65,65,66,47,103,34,41,41, +59,10,172,105,109,97,103,101,84,111,112,61,50,52,59,10,170,100,114,97,119,73,110,102,111,40,41,123,103,46,114,101, +115,101,116,40,41,46,99,108,101,97,114,82,101,99,116,40,66,97,110,103,108,101,46,97,112,112,82,101,99,116,41,59, +103,46,100,114,97,119,73,109,97,103,101,40,108,111,103,111,44,87,45,54,48,44,50,52,41,59,103,46,115,101,116,70, +111,110,116,40,34,52,120,54,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,100,114,97, +119,83,116,114,105,110,103,40,34,66,65,78,71,76,69,74,83,46,67,79,77,34,44,87,45,51,48,44,53,54,41,59, +172,104,61,56,44,121,61,50,52,45,104,59,103,46,115,101,116,70,111,110,116,40,34,54,120,56,34,41,46,115,101,116, +70,111,110,116,65,108,105,103,110,40,45,49,44,45,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80, +111,119,101,114,101,100,32,98,121,32,69,115,112,114,117,105,110,111,34,44,48,44,121,150,52,43,104,41,59,103,46,100, +114,97,119,83,116,114,105,110,103,40,34,86,101,114,115,105,111,110,32,34,43,69,78,86,46,86,69,82,83,73,79,78, +44,48,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,111,109,109,105,116,32,34,43,69, +78,86,46,71,73,84,95,67,79,77,77,73,84,44,48,44,121,150,104,41,59,103,101,116,86,101,114,115,105,111,110,40, +34,66,111,111,116,108,111,97,100,101,114,34,44,34,98,111,111,116,46,105,110,102,111,34,41,59,103,101,116,86,101,114, +115,105,111,110,40,34,76,97,117,110,99,104,101,114,34,44,34,108,97,117,110,99,104,46,105,110,102,111,34,41,59,103, +101,116,86,101,114,115,105,111,110,40,34,83,101,116,116,105,110,103,115,34,44,34,115,101,116,116,105,110,103,46,105,110, +102,111,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,77,69,77,46,116,111,116,97,108,43,34,32,74,83, +32,86,97,114,115,34,44,48,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,116,111,114, +97,103,101,58,32,34,43,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,103,101,116,70,114, +101,101,40,41,146,49,48,41,43,34,107,32,102,114,101,101,34,44,48,44,121,150,104,41,59,163,40,69,78,86,46,83, +84,79,82,65,71,69,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,32,32,32,32,32,32,32,32,32,34,43, +40,69,78,86,46,83,84,79,82,65,71,69,146,49,48,41,43,34,107,32,116,111,116,97,108,34,44,48,44,121,150,104, +41,59,163,40,69,78,86,46,83,80,73,70,76,65,83,72,41,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83, +80,73,32,70,108,97,115,104,58,32,34,43,40,69,78,86,46,83,80,73,70,76,65,83,72,146,49,48,41,43,34,107, +34,44,48,44,121,150,104,41,59,105,109,97,103,101,84,111,112,61,121,43,104,59,105,109,103,83,99,114,111,108,108,61, +105,109,103,72,101,105,103,104,116,45,105,109,97,103,101,84,111,112,59,103,46,114,101,115,101,116,40,41,46,115,101,116, +70,111,110,116,40,34,54,120,49,53,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,69,78,86,46,86,69,82,83,73,79,78,43,34,32,32,34,43,78,82,70, +46,103,101,116,65,100,100,114,101,115,115,40,41,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,49,55,49, +41,59,100,114,97,119,73,109,97,103,101,40,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,100,114, +97,119,73,109,97,103,101,40,41,59,103,46,102,108,105,112,40,41,59,105,109,103,83,99,114,111,108,108,61,40,105,109, +103,83,99,114,111,108,108,43,49,41,37,105,109,103,72,101,105,103,104,116,59,125,44,50,48,41,59,125,10,170,100,114, +97,119,73,109,97,103,101,40,41,123,103,46,115,101,116,67,108,105,112,82,101,99,116,40,48,44,105,109,97,103,101,84, +111,112,44,87,45,49,44,72,45,49,52,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,48,44,105, +109,97,103,101,84,111,112,45,105,109,103,83,99,114,111,108,108,41,59,103,46,100,114,97,119,73,109,97,103,101,40,105, +109,103,44,48,44,105,109,97,103,101,84,111,112,43,105,109,103,72,101,105,103,104,116,45,105,109,103,83,99,114,111,108, +108,41,59,103,46,115,101,116,67,108,105,112,82,101,99,116,40,48,44,48,44,87,45,49,44,72,45,49,41,59,125,10, +115,101,116,84,105,109,101,111,117,116,40,100,114,97,119,73,110,102,111,44,49,48,48,48,41,59,10,115,101,116,87,97, +116,99,104,40,95,162,108,111,97,100,40,41,44,66,84,78,49,41,59,255,4,9,0,0,97,98,111,117,116,46,105,109, +103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85, 85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,16, -16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254, -16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254, +16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, -121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,121,85,85,85,85,85,85,85,254,254,254,16,16, -16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,200,206, -206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, -85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206,163,85,85,85,85,85,85,85,254,254,254,254, -16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206, -206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, -85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,254,254,254,254, -16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,199,206,206,206,206,206,206,206,206, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,85, +85,85,85,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163,121,85,85,85,85,85,85,85,85,254,254,254,16,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,85,85,121,163, +206,206,206,121,85,85,85,85,85,85,85,254,254,254,16,16,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,85,85,85,85,85,121,200,206,206,206,206,199,121,85,85,85,85,85,85,85,254,254,16,16, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,85,85,85,121,163,206,206,206, +206,206,206,206,163,85,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,85,85,85,121,163,206,206,206,206,206,206,206,206,206,206,163,85,85,85,85,85,85,254,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,85,163,200,206,206,206,206,206,206, +206,206,206,206,206,206,85,85,85,85,85,85,254,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +85,85,85,85,85,85,121,199,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, 206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, +85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254, 16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206, 206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,85,85,85,85,206,206,206,121,121,206,206,206,206,206,206,121,121,206,206,206,85,85,85,85,85,85,85,254,254,254, +85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, 16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, -206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,16,16,16,254,254,254,254,254,254,254,254,254,254,254,254,85, +206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, 85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,206,206,206,206,206,206,206,206,206,206, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206, 206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,85,85,85,85,205,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,85,85,85,85,85,85,85,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,121,206,206,206,206,206,206,206,206,206, -206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85, -85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206,206,206,206,206,121,79,85,85,85,85,85,85,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,79,79,121,199,206,206,206,206,206,206, -206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199,199,198,198,79,79,79,85,85,85,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,79,79,79,198,198,198,198,198,198,198, -198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198,198,198,199,15,51,86,85,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,15,15,128,198,198,198,198,198,198, -198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198,198,205,57,15,58,101,101,101,101,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,58,15,15,206,205,199,198,198,199, -205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206,206,93,15,15,101,101,101,101,101,101,101,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,58,15,15,164,206,206,206,206, -164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93,15,15,16,101,101,101,101,101,101,101,101,101,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,65,15,15,15,15,15,15, -15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101, -101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15,58,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, -101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, +85,85,85,85,85,85,121,206,206,206,206,206,206,206,206,206,206,206,206,206,206,121,85,85,85,85,85,85,85,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,85,85,85,79,157,206,206,206,206,206,206,206,206, +206,206,206,206,121,79,85,85,85,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +85,85,85,85,85,85,79,79,121,199,206,206,206,206,206,206,206,206,199,121,79,79,85,85,85,85,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,85,85,85,79,79,79,198,198,199,199,205,205,199, +199,198,198,79,79,79,85,85,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,85,85,85,79,79,79,198,198,198,198,198,198,198,198,198,198,79,79,79,85,85,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,85,86,51,15,199,198,198,198,198,198,198, +198,198,199,15,51,86,85,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,101,101,15,15,128,198,198,198,198,198,198,198,198,128,15,15,101,101,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,58,15,57,205,198,198,198,198,198, +198,205,57,15,58,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,101,101,101,101,101,58,15,15,206,205,199,198,198,199,205,206,15,15,58,101,101,101,101,101,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,15,15,129,206,206,206,206,206, +206,93,15,15,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +101,101,101,101,101,101,101,101,58,15,15,164,206,206,206,206,164,15,15,58,101,101,101,101,101,101,101,101,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,16,15,15,93,206,206,93, +15,15,16,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101, +101,101,101,101,101,101,101,101,101,65,15,15,15,15,15,15,15,16,65,101,101,101,101,101,101,101,101,101,101,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,58,15,15,15,15, +58,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, 101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101, 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, +101,101,101,101,101,101,101,101,101,101,101,101,101,101,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117, +116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97, +98,111,117,116,34,44,34,110,97,109,101,34,58,34,65,98,111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117, +116,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111, +114,116,111,114,100,101,114,34,58,45,52,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97, +103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116, +46,105,110,102,111,44,97,98,111,117,116,46,97,112,112,46,106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255, +54,1,0,0,119,105,100,108,111,99,107,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +40,170,40,41,123,163,40,33,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,41,171,59,66,97,110,103,108,101, +46,111,110,40,34,108,111,99,107,34,44,170,40,111,110,41,123,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93, +46,119,105,100,116,104,61,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,63,49,54,58,48,59,66,97, +110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,125,41,59,87,73,68,71,69,84,83,91,34,108, +111,99,107,34,93,61,123,97,114,101,97,58,34,116,108,34,44,115,111,114,116,111,114,100,101,114,58,49,48,44,119,105, +100,116,104,58,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,63,49,54,58,48,44,100,114,97,119,58, +170,40,119,41,123,163,40,66,97,110,103,108,101,46,105,115,76,111,99,107,101,100,40,41,41,103,46,114,101,115,101,116, +40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,68,104,65,66,72,43,68,47,119,119,77,77,68, +68,65,119,119,77,102,47,118,47,47,52,102,43,72,47,104,47,56,47,47,80,47,122,47,47,47,102,47,103,61,61,34, +41,44,119,46,120,43,49,44,119,46,121,43,52,41,59,125,125,59,125,41,40,41,255,255,129,0,0,0,119,105,100,108, +111,99,107,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119, +105,100,108,111,99,107,34,44,34,110,97,109,101,34,58,34,76,111,99,107,32,87,105,100,103,101,116,34,44,34,116,121, +112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,54,34,44,34,116, +97,103,115,34,58,34,119,105,100,103,101,116,44,108,111,99,107,34,44,34,102,105,108,101,115,34,58,34,119,105,100,108, +111,99,107,46,105,110,102,111,44,119,105,100,108,111,99,107,46,119,105,100,46,106,115,34,125,255,255,255,98,3,0,0, +119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41, +123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116, +104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59, +125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114,103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103, +41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110,103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105, +100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105, +112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105, +115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91, +34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110, +40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110,41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91, +34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40,33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, +41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162, +87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123, +163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108, +40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97, +108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83,91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116, +114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119,58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46, +120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40,41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97, +114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119, +73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66,72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47, +47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47,52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72, +103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59,120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114, +40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108,108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45, +52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99,116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44, +121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120,43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43, +49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40, +120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101,116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50, +41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115,101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255, +138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34,110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76, +101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101, +114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116, +116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97, +116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0,119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93, +61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46, +114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101,116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40, +41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101,116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80, +40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102, +34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100, +97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57,34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97, +116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74,103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78, +89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61,61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41, +59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116, +104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44, +87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78, +82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101, +116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41,59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110, +102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116, +34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112, +101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97, +103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101,116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34, +119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116,46,119,105,100,46,106,115,34,125,255,255,255,252,0,0,0, +119,105,100,105,100,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,40,41,162, +123,170,100,114,97,119,40,41,123,172,105,100,61,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117, +98,115,116,114,40,41,46,115,117,98,115,116,114,40,49,50,41,46,115,112,108,105,116,40,34,58,34,41,59,103,46,114, +101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48, +102,102,34,58,34,35,48,48,102,34,41,46,115,101,116,70,111,110,116,40,34,54,120,56,34,44,49,41,59,103,46,100, +114,97,119,83,116,114,105,110,103,40,105,100,91,48,93,44,175,46,120,43,50,44,175,46,121,43,52,44,180,41,59,103, +46,100,114,97,119,83,116,114,105,110,103,40,105,100,91,49,93,44,175,46,120,43,50,44,175,46,121,43,49,52,44,180, +41,59,125,87,73,68,71,69,84,83,91,34,119,105,100,105,100,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119, +105,100,116,104,58,49,54,44,100,114,97,119,58,100,114,97,119,125,59,125,41,40,41,59,138,0,0,0,119,105,100,105, +100,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119, +105,100,105,100,34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111,111,116,104,32,73,68,32,87,105,100,103,101, +116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46, +48,51,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,97,100,100,114,101,115,115,44,109,97,99,34,44, +34,102,105,108,101,115,34,58,34,119,105,100,105,100,46,105,110,102,111,44,119,105,100,105,100,46,119,105,100,46,106,115, +34,125,255,255,169,0,0,0,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0, +0,0,0,0,40,170,40,41,123,173,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114, +101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33, +115,46,119,101,108,99,111,109,101,100,41,123,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105, +114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111, +110,39,44,123,119,101,108,99,111,109,101,100,58,180,125,41,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112, +112,46,106,115,39,41,125,41,125,125,41,40,41,255,255,255,94,23,0,0,119,101,108,99,111,109,101,46,97,112,112,46, +106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101, +114,105,111,100,41,123,172,99,61,103,46,103,101,116,67,111,108,111,114,40,41,59,172,105,61,115,101,116,73,110,116,101, +114,118,97,108,40,170,40,41,123,163,40,115,101,113,46,108,101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104, +105,102,116,40,41,59,103,46,115,101,116,67,111,108,111,114,40,99,41,59,163,40,102,41,102,40,41,59,125,164,99,108, +101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101, +40,99,111,108,44,99,97,108,108,98,97,99,107,41,123,172,110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46, +115,101,116,67,111,108,111,114,40,99,111,108,41,59,167,40,172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41, +103,46,100,114,97,119,76,105,110,101,40,105,44,48,44,48,44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50, +52,48,44,50,52,48,44,105,41,59,103,46,102,108,105,112,40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116, +84,105,109,101,111,117,116,40,102,44,48,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10, +172,83,67,69,78,69,95,67,79,85,78,84,61,49,48,59,10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40, +110,138,48,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,46,115,101,116,66,103,67,111,108,111,114,40,48,41, +46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,49,55,54,44,49,55,54,41,59,103,46,115,101,116,70,111,110, +116,40,34,54,120,49,53,34,41,59,172,110,61,48,59,172,108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111, +40,41,59,172,105,109,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,108,41,59,172,105,61,115,101,116,73, +110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46,49,59,103,46,115,101,116,67,111,108,111,114,40,110,44,110, +44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40,108,44,40,49,55,54,45,105,109,46,119,105,100,116,104,41, +47,50,44,40,49,55,54,45,105,109,46,104,101,105,103,104,116,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101, +97,114,73,110,116,101,114,118,97,108,40,105,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114, +97,119,83,116,114,105,110,103,40,34,79,112,101,110,34,44,52,52,44,49,48,52,41,44,53,48,48,41,59,115,101,116, +84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108, +101,34,44,52,52,44,49,49,54,41,44,49,48,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103, +46,100,114,97,119,83,116,114,105,110,103,40,34,83,109,97,114,116,32,87,97,116,99,104,34,44,52,52,44,49,50,56, +41,44,49,53,48,48,41,59,125,125,44,53,48,41,59,125,59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103, +61,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104,114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115, +115,40,97,116,111,98,40,34,112,116,82,52,110,47,106,47,52,103,72,43,56,72,53,119,108,43,106,79,117,107,86,86, +111,72,90,56,100,116,47,110,47,47,110,51,55,79,116,103,72,57,115,72,104,119,72,112,52,72,53,120,109,107,71,105, +72,55,50,77,82,106,101,47,76,76,47,55,105,73,65,69,69,55,115,80,69,103,111,65,67,43,65,108,97,103,73,108, +73,105,77,81,69,114,80,120,68,119,85,89,120,65,65,66,119,73,72,67,106,56,78,55,110,79,108,51,117,69,113,97, +54,66,69,103,103,110,70,106,102,77,53,110,67,107,85,105,108,51,103,69,113,53,75,68,65,65,81,109,67,54,81,109, +66,69,52,74,120,83,69,104,73,65,66,105,81,109,66,56,81,109,83,88,111,81,108,67,89,82,77,100,69,119,73,108, +67,65,65,73,108,78,104,89,108,79,105,79,56,53,110,78,69,121,77,80,69,111,90,119,73,65,65,99,115,89,73,89, +109,80,88,111,89,108,77,105,75,97,70,69,120,88,47,117,57,86,69,113,76,66,66,79,89,114,67,72,43,99,122,109, +116,86,113,74,121,68,69,112,105,97,67,79,89,115,103,83,89,115,122,109,99,51,113,116,84,69,113,77,82,55,104,122, +71,56,65,108,71,109,100,49,79,81,103,108,79,79,89,54,97,69,103,89,108,67,109,109,90,111,74,77,67,84,66,114, +110,68,54,83,97,73,69,111,85,47,122,79,85,117,111,108,83,106,98,110,66,74,103,113,97,67,69,111,85,53,122,79, +88,88,52,82,121,81,89,66,66,122,67,83,52,88,53,122,78,68,113,113,90,67,74,105,69,82,74,103,53,122,66,69, +111,86,74,69,111,77,49,74,103,89,108,81,106,104,77,72,99,52,74,76,69,109,90,77,69,69,112,54,90,73,74,103, +80,122,83,52,87,84,109,90,77,86,84,73,76,109,70,89,65,75,43,66,109,103,108,67,109,100,49,74,103,85,89,74, +105,80,78,69,111,114,65,66,69,73,79,90,121,103,68,66,109,53,77,67,105,74,77,81,108,104,77,72,56,66,121,66, +88,119,73,108,66,74,103,85,120,74,105,77,100,53,110,79,84,73,122,108,66,84,65,75,43,66,65,65,78,86,113,52, +106,80,65,65,83,47,72,74,103,74,121,67,84,65,84,65,69,65,67,67,47,66,52,83,47,73,74,103,73,108,67,89, +65,103,65,80,105,83,47,75,110,53,121,69,89,65,78,84,69,121,80,99,53,110,105,79,81,120,77,66,47,76,108,67, +79,97,112,121,74,74,103,98,112,66,89,65,90,122,82,79,81,75,47,71,108,48,65,84,73,87,102,69,111,90,122,66, +99,54,73,108,66,54,83,89,71,103,66,74,66,74,103,112,122,83,108,104,121,72,56,69,65,104,53,77,66,84,73,106, +110,67,117,73,108,79,106,106,108,72,84,65,74,122,67,47,76,109,68,84,83,83,89,73,69,111,84,65,66,79,89,73, +108,69,84,83,75,89,72,88,119,73,65,66,79,89,77,48,121,89,109,69,84,83,67,89,72,69,111,98,110,68,79,89, +113,97,66,69,120,117,56,84,65,119,108,69,99,52,85,53,69,111,105,97,67,109,75,43,78,84,65,111,108,70,69,119, +88,48,84,81,122,66,77,88,119,88,105,69,112,84,66,67,65,65,111,109,78,69,111,83,43,69,69,111,52,109,73,89, +73,73,109,75,69,111,83,43,69,69,112,68,111,66,69,121,85,98,69,111,51,103,69,111,52,109,74,100,65,73,109,73, +74,89,52,108,74,69,121,99,100,69,111,80,79,79,66,89,109,80,117,73,108,69,43,72,99,74,89,104,75,75,84,90, +49,102,104,89,107,66,50,69,65,104,110,78,99,89,77,117,69,104,111,109,77,114,56,65,51,89,65,66,69,111,74,121, +66,53,103,106,79,65,65,89,109,72,109,57,86,103,69,76,69,111,74,77,66,69,111,88,65,69,121,88,122,69,52,53, +89,66,74,103,88,119,69,113,120,49,73,43,66,121,68,79,89,74,121,86,74,119,53,121,67,103,69,66,51,99,81,71, +103,74,77,87,74,119,81,110,67,117,54,47,67,103,70,66,105,103,68,66,49,51,83,47,103,108,86,65,65,102,49,113, +111,109,67,103,108,69,111,65,68,66,49,81,68,66,65,68,69,80,69,111,78,86,113,69,65,111,108,69,103,69,75,111, +108,75,69,114,74,77,68,89,65,74,77,68,48,108,69,48,65,109,97,69,111,78,97,65,103,74,77,67,70,73,89,65, +97,104,86,47,73,103,73,105,68,79,84,103,65,66,78,89,74,77,69,79,84,111,105,67,73,111,74,77,67,79,84,122, +102,67,78,52,82,77,66,79,84,120,115,68,74,73,82,121,102,73,119,90,77,66,75,81,90,122,102,74,103,82,121,102, +79,89,90,77,66,79,85,66,122,67,74,103,78,75,79,84,53,122,68,74,103,76,111,67,65,68,120,75,66,79,65,73, +65,66,79,84,54,97,67,65,65,82,121,102,79,89,82,121,106,79,89,82,121,106,79,89,108,75,69,115,66,122,69,69, +115,66,122,69,79,85,74,122,68,79,85,73,65,66,79,85,105,97,68,79,85,82,122,67,79,85,90,122,67,69,115,99, +75,67,105,89,34,41,41,59,172,105,109,61,103,46,105,109,97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,59, +103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48,48,102,102,34, +41,59,172,121,61,49,55,54,44,115,112,101,101,100,61,53,59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97, +99,107,41,123,121,151,115,112,101,101,100,59,172,120,61,40,49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,59, +103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44,120,44,121,41,59,103,46,99,108,101,97,114,82,101,99,116, +40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56,49,43,115,112,101,101,100,41,59,163,40,121,62,51,48,41, +115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111,111,110,44,48,44,99,97,108,108,98,97,99,107,41,59,164, +99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101,40,34,35,102,102,48,48,102,102,34,44,170,40,41,123,98, +97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,115,101,116,70,111,110, +116,40,34,54,120,49,53,58,50,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46, +100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99,111,109,101,46,34,44,56,56,44,49,51,48,41,59,125,41, +59,125,41,59,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110, +116,101,114,118,97,108,40,170,40,41,123,110,150,52,59,103,46,115,99,114,111,108,108,40,48,44,45,52,41,59,163,40, +110,62,49,53,48,41,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51, +53,48,48,41,59,125,59,163,40,110,138,50,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101, +116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46, +99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111, +110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,55,48,44,121,61,50,53,44,104,61,50,53,59,97,110,105, +109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121, +150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44, +120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,104,97,115,32,111,110,101,34, +44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,98,117,116,116,111,110,34, +44,120,44,121,150,104,41,44,40,41,162,123,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,58,50,34,41, +46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,44,49,41,46,100,114,97,119,83,116,114,105,110,103,40, +34,72,69,82,69,33,34,44,49,53,48,44,56,56,41,59,125,93,44,50,48,48,41,59,125,59,163,40,110,138,51,41, +171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48, +102,102,102,102,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116, +70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41, +59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116, +70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48, +34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,119,97,107,101,32,116,104,101,92,110,115,99, +114,101,101,110,32,117,112,44,32,111,114,32,116,111,92,110,115,101,108,101,99,116,34,44,56,56,44,54,48,41,59,125, +59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108, +111,114,40,34,35,48,48,102,102,102,102,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40, +41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54, +120,49,53,58,50,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,76,111,110,103,32,80,114,101,115,115, +34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101, +116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32, +103,111,32,98,97,99,107,32,116,111,92,110,116,104,101,32,99,108,111,99,107,34,44,56,56,44,54,48,41,59,125,59, +163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111, +114,40,34,35,102,102,48,48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41, +59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,49,50, +120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115, +32,101,118,101,114,92,110,115,116,111,112,115,44,32,104,111,108,100,32,116,104,101,92,110,98,117,116,116,111,110,32,102, +111,114,92,110,116,101,110,32,115,101,99,111,110,100,115,46,92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105, +108,108,92,110,116,104,101,110,32,114,101,98,111,111,116,46,34,44,56,56,44,55,56,41,59,125,59,163,40,110,138,54, +41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48, +48,48,48,102,102,34,41,46,115,101,116,67,111,108,111,114,40,45,49,41,46,99,108,101,97,114,40,41,59,103,46,115, +101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, +41,59,172,120,61,56,56,44,121,61,45,50,48,44,104,61,54,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123, +103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32,104,97,115,32,97,92,110,102, +117,108,108,32,116,111,117,99,104,115,99,114,101,101,110,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41, +162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,68,114,97,103,32,117,112,32,97,110,100,32,100,111,119,110, +92,110,116,111,32,115,99,114,111,108,108,32,97,110,100,92,110,116,97,112,32,116,111,32,115,101,108,101,99,116,34,44, +120,44,121,150,104,41,59,125,44,93,44,51,48,48,41,59,125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114, +101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,48,48,34,41,46,115, +101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50, +120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61, +45,51,53,44,104,61,56,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,66,97,110,103,108,101,46,106,115,32,99,111,109,101,115,92,110,119,105,116,104,32,97,32,102,101,119,92, +110,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34,44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41, +162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,97,100,100,32,109,111,114,101,44,32,118,105,115, +105,116,92,110,98,97,110,103,108,101,106,115,46,99,111,109,47,97,112,112,115,34,44,120,44,121,150,104,41,59,125,44, +93,44,52,48,48,41,59,125,59,163,40,110,138,56,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46, +115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48,48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48, +41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116, +70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,59,103,46,100,114,97,119,83,116,114,105,110, +103,40,34,89,111,117,32,99,97,110,32,97,108,115,111,32,109,97,107,101,92,110,121,111,117,114,32,111,119,110,32,97, +112,112,115,33,34,44,120,44,51,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,67,104,101,99,107,32, +111,117,116,92,110,98,97,110,103,108,101,106,115,46,99,111,109,34,44,120,44,49,51,48,41,59,172,114,120,61,48,44, +114,121,61,48,59,170,100,114,97,119,40,41,123,114,120,150,48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120, +61,77,97,116,104,46,99,111,115,40,114,120,41,44,114,115,120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114, +99,121,61,77,97,116,104,46,99,111,115,40,114,121,41,44,114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41, +59,170,112,40,120,44,121,44,122,41,123,172,116,59,116,61,120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42, +114,99,121,45,120,42,114,115,121,59,120,61,116,59,116,61,121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42, +114,99,120,45,121,42,114,115,120,59,121,61,116,59,122,150,52,59,171,91,56,56,43,54,48,42,120,47,122,44,55,56, +43,54,48,42,121,47,122,93,59,125,172,97,59,172,115,61,51,48,59,103,46,99,108,101,97,114,82,101,99,116,40,56, +56,45,115,44,55,56,45,115,44,56,56,43,115,44,55,56,43,115,41,59,97,61,112,40,45,49,44,45,49,44,45,49, +41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45, +49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45, +49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44, +45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45, +49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49, +44,45,49,44,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49, +44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49, +44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49, +44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49, +44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45, +49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112, +40,45,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, +112,40,49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, +61,112,40,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, +61,112,40,49,44,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, +61,112,40,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61, +112,40,45,49,44,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97, +61,112,40,45,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,125, +115,101,116,73,110,116,101,114,118,97,108,40,100,114,97,119,44,53,48,41,59,125,59,163,40,110,138,57,41,171,170,40, +41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,102, +102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48, +41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,172,120,61,56,56,44,121,61,49,48,44, +104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84, +104,97,116,39,115,32,105,116,33,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105, +110,103,40,34,80,114,101,115,115,34,44,120,44,121,150,104,42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103, +40,34,116,104,101,32,98,117,116,116,111,110,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110, +103,40,34,116,111,32,115,116,97,114,116,34,44,120,44,121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103, +40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172, +115,99,101,110,101,78,117,109,98,101,114,61,48,59,10,170,109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62, +48,158,115,99,101,110,101,78,117,109,98,101,114,43,49,138,83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99, +101,110,101,78,117,109,98,101,114,61,40,115,99,101,110,101,78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78, +69,95,67,79,85,78,84,59,163,40,115,99,101,110,101,78,117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109, +98,101,114,61,48,59,99,108,101,97,114,73,110,116,101,114,118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115, +99,101,110,101,78,117,109,98,101,114,41,40,41,59,163,40,115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172, +108,61,83,67,69,78,69,95,67,79,85,78,84,59,167,40,172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172, +120,61,56,56,43,40,105,45,40,108,45,50,41,47,50,41,42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109, +98,101,114,45,49,41,123,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,102,105,108,108,67,105,114,99,108,101, +40,120,44,49,54,54,44,52,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,48,41,46,102,105,108,108,67, +105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,103,46,115,101,116,67,111,108,111,114,40,45,49,41,46,100,114, +97,119,67,105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98, +101,114,60,83,67,69,78,69,95,67,79,85,78,84,45,49,41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123, +109,111,118,101,40,49,41,59,125,44,53,48,48,48,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105, +112,101,39,44,100,105,114,162,109,111,118,101,40,100,105,114,41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162, +123,163,40,115,99,101,110,101,78,117,109,98,101,114,138,83,67,69,78,69,95,67,79,85,78,84,45,49,41,108,111,97, +100,40,41,59,164,109,111,118,101,40,49,41,59,125,44,66,84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59, +10,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101, +46,115,101,116,76,111,99,107,101,100,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101, +114,40,49,41,59,10,109,111,118,101,40,48,41,59,255,255,234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116, +105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110, +103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39, +119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41,160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103, +101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123, +125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109, +101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120,116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33, +115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101,100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101, +115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101,58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99, +111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110,32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119, +101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44,39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32, +110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105, +116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59, +66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102, +116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46, +111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39,58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0, +119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,166,0,0,0,97,98,111,117,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,98,111,117,116,34,44,34,110,97,109,101,34,58,34,65,98, -111,117,116,34,44,34,115,114,99,34,58,34,97,98,111,117,116,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34, -58,34,97,98,111,117,116,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,52,44,34,118,101,114, -115,105,111,110,34,58,34,48,46,49,50,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109, -34,44,34,102,105,108,101,115,34,58,34,97,98,111,117,116,46,105,110,102,111,44,97,98,111,117,116,46,97,112,112,46, -106,115,44,97,98,111,117,116,46,105,109,103,34,125,255,255,54,1,0,0,119,105,100,108,111,99,107,46,119,105,100,46, -106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,163,40,33,66,97,110,103,108,101,46,105, -115,76,111,99,107,101,100,41,171,59,66,97,110,103,108,101,46,111,110,40,34,108,111,99,107,34,44,170,40,111,110,41, -123,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93,46,119,105,100,116,104,61,66,97,110,103,108,101,46,105,115, -76,111,99,107,101,100,40,41,63,49,54,58,48,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115, -40,41,59,125,41,59,87,73,68,71,69,84,83,91,34,108,111,99,107,34,93,61,123,97,114,101,97,58,34,116,108,34, -44,115,111,114,116,111,114,100,101,114,58,49,48,44,119,105,100,116,104,58,66,97,110,103,108,101,46,105,115,76,111,99, -107,101,100,40,41,63,49,54,58,48,44,100,114,97,119,58,170,40,119,41,123,163,40,66,97,110,103,108,101,46,105,115, -76,111,99,107,101,100,40,41,41,103,46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111, -98,40,34,68,104,65,66,72,43,68,47,119,119,77,77,68,68,65,119,119,77,102,47,118,47,47,52,102,43,72,47,104, -47,56,47,47,80,47,122,47,47,47,102,47,103,61,61,34,41,44,119,46,120,43,49,44,119,46,121,43,52,41,59,125, -125,59,125,41,40,41,255,255,129,0,0,0,119,105,100,108,111,99,107,46,105,110,102,111,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,108,111,99,107,34,44,34,110,97,109,101,34,58,34, -76,111,99,107,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101, -114,115,105,111,110,34,58,34,48,46,48,54,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,108,111,99, -107,34,44,34,102,105,108,101,115,34,58,34,119,105,100,108,111,99,107,46,105,110,102,111,44,119,105,100,108,111,99,107, -46,119,105,100,46,106,115,34,125,255,255,255,98,3,0,0,119,105,100,98,97,116,46,119,105,100,46,106,115,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,170,115,101,116,87,105,100,116,104,40,41,123,87,73,68, -71,69,84,83,91,34,98,97,116,34,93,46,119,105,100,116,104,61,52,48,43,40,66,97,110,103,108,101,46,105,115,67, -104,97,114,103,105,110,103,40,41,63,49,54,58,48,41,59,125,66,97,110,103,108,101,46,111,110,40,39,99,104,97,114, -103,105,110,103,39,44,170,40,99,104,97,114,103,105,110,103,41,123,163,40,99,104,97,114,103,105,110,103,41,66,97,110, -103,108,101,46,98,117,122,122,40,41,59,115,101,116,87,105,100,116,104,40,41,59,66,97,110,103,108,101,46,100,114,97, -119,87,105,100,103,101,116,115,40,41,59,103,46,102,108,105,112,40,41,59,125,41,59,172,98,97,116,116,101,114,121,73, -110,116,101,114,118,97,108,61,66,97,110,103,108,101,46,105,115,76,67,68,79,110,40,41,63,115,101,116,73,110,116,101, -114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,44,54,48, -48,48,48,41,58,183,59,66,97,110,103,108,101,46,111,110,40,39,108,99,100,80,111,119,101,114,39,44,170,40,111,110, -41,123,163,40,111,110,41,123,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100,114,97,119,40,41,59,163,40, -33,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,41,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, -61,115,101,116,73,110,116,101,114,118,97,108,40,40,41,162,87,73,68,71,69,84,83,91,34,98,97,116,34,93,46,100, -114,97,119,40,41,44,54,48,48,48,48,41,59,125,164,123,163,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97, -108,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108, -41,59,98,97,116,116,101,114,121,73,110,116,101,114,118,97,108,61,183,59,125,125,125,41,59,87,73,68,71,69,84,83, -91,34,98,97,116,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,52,48,44,100,114,97,119, -58,170,40,41,123,172,115,61,51,57,59,172,120,61,175,46,120,44,121,61,175,46,121,59,103,46,114,101,115,101,116,40, -41,59,163,40,66,97,110,103,108,101,46,105,115,67,104,97,114,103,105,110,103,40,41,41,123,103,46,115,101,116,67,111, -108,111,114,40,34,35,48,102,48,34,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,68,104,103,66, -72,79,66,122,103,99,52,72,79,80,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,51,47, -52,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,66,52,65,101,65,72,103,34,41,44,120,44,121,41,59, -120,150,49,54,59,125,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,46,102,105,108, -108,82,101,99,116,40,120,44,121,43,50,44,120,43,115,45,52,44,121,43,50,49,41,46,99,108,101,97,114,82,101,99, -116,40,120,43,50,44,121,43,52,44,120,43,115,45,54,44,121,43,49,57,41,46,102,105,108,108,82,101,99,116,40,120, -43,115,45,51,44,121,43,49,48,44,120,43,115,44,121,43,49,52,41,59,103,46,115,101,116,67,111,108,111,114,40,34, -35,48,102,48,34,41,46,102,105,108,108,82,101,99,116,40,120,43,52,44,121,43,54,44,120,43,52,43,69,46,103,101, -116,66,97,116,116,101,114,121,40,41,42,40,115,45,49,50,41,47,49,48,48,44,121,43,49,55,41,59,125,125,59,115, -101,116,87,105,100,116,104,40,41,59,125,41,40,41,255,255,138,0,0,0,119,105,100,98,97,116,46,105,110,102,111,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,97,116,34,44,34, -110,97,109,101,34,58,34,66,97,116,116,101,114,121,32,76,101,118,101,108,32,87,105,100,103,101,116,34,44,34,116,121, -112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,57,34,44,34,116, -97,103,115,34,58,34,119,105,100,103,101,116,44,98,97,116,116,101,114,121,34,44,34,102,105,108,101,115,34,58,34,119, -105,100,98,97,116,46,105,110,102,111,44,119,105,100,98,97,116,46,119,105,100,46,106,115,34,125,255,255,165,1,0,0, -119,105,100,98,116,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,73,68,71, -69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116, -104,58,49,53,44,100,114,97,119,58,170,40,41,123,103,46,114,101,115,101,116,40,41,59,163,40,78,82,70,46,103,101, -116,83,101,99,117,114,105,116,121,83,116,97,116,117,115,40,41,46,99,111,110,110,101,99,116,101,100,41,103,46,115,101, -116,67,111,108,111,114,40,40,103,46,103,101,116,66,80,80,40,41,62,56,41,63,34,35,48,55,102,34,58,40,103,46, -116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,41,59,164,103,46,115,101, -116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,54,54,54,34,58,34,35,57,57,57, -34,41,59,103,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,67,120,81,66,66,103,68,103,70,103,74, -103,82,52,106,90,77,97,119,102,65,99,65,52,68,52,78,89,121,98,69,89,73,119,84,65,115,66,119,68,65,65,61, -61,34,41,44,50,43,175,46,120,44,50,43,175,46,121,41,59,125,44,99,104,97,110,103,101,100,58,170,40,41,123,87, -73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,100,114,97,119,40,41,59,125,125,59,10,78, -82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111, -116,104,34,93,46,99,104,97,110,103,101,100,41,59,10,78,82,70,46,111,110,40,39,100,105,115,99,111,110,110,101,99, -116,39,44,87,73,68,71,69,84,83,91,34,98,108,117,101,116,111,111,116,104,34,93,46,99,104,97,110,103,101,100,41, -59,255,255,255,133,0,0,0,119,105,100,98,116,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,123,34,105,100,34,58,34,119,105,100,98,116,34,44,34,110,97,109,101,34,58,34,66,108,117,101,116,111, -111,116,104,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101,116,34,44,34,118,101,114, -115,105,111,110,34,58,34,48,46,48,56,34,44,34,116,97,103,115,34,58,34,119,105,100,103,101,116,44,98,108,117,101, -116,111,111,116,104,34,44,34,102,105,108,101,115,34,58,34,119,105,100,98,116,46,105,110,102,111,44,119,105,100,98,116, -46,119,105,100,46,106,115,34,125,255,255,255,252,0,0,0,119,105,100,105,100,46,119,105,100,46,106,115,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,40,40,41,162,123,170,100,114,97,119,40,41,123,172,105,100,61,78,82,70, -46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,41,46,115,117,98,115,116,114,40,49,50, -41,46,115,112,108,105,116,40,34,58,34,41,59,103,46,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40, -103,46,116,104,101,109,101,46,100,97,114,107,63,34,35,48,102,102,34,58,34,35,48,48,102,34,41,46,115,101,116,70, -111,110,116,40,34,54,120,56,34,44,49,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,105,100,91,48,93,44, -175,46,120,43,50,44,175,46,121,43,52,44,180,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,105,100,91,49, -93,44,175,46,120,43,50,44,175,46,121,43,49,52,44,180,41,59,125,87,73,68,71,69,84,83,91,34,119,105,100,105, -100,34,93,61,123,97,114,101,97,58,34,116,114,34,44,119,105,100,116,104,58,49,54,44,100,114,97,119,58,100,114,97, -119,125,59,125,41,40,41,59,138,0,0,0,119,105,100,105,100,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,105,100,105,100,34,44,34,110,97,109,101,34,58,34,66,108, -117,101,116,111,111,116,104,32,73,68,32,87,105,100,103,101,116,34,44,34,116,121,112,101,34,58,34,119,105,100,103,101, -116,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,48,51,34,44,34,116,97,103,115,34,58,34,119,105,100,103, -101,116,44,97,100,100,114,101,115,115,44,109,97,99,34,44,34,102,105,108,101,115,34,58,34,119,105,100,105,100,46,105, -110,102,111,44,119,105,100,105,100,46,119,105,100,46,106,115,34,125,255,255,169,0,0,0,119,101,108,99,111,109,101,46, -98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,173,115,61,114,101,113,117, -105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101, -46,106,115,111,110,39,44,49,41,160,123,125,59,163,40,33,115,46,119,101,108,99,111,109,101,100,41,123,115,101,116,84, -105,109,101,111,117,116,40,40,41,162,123,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114, -105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,180,125,41, -108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,125,41,125,125,41,40,41,255,255,255, -94,23,0,0,119,101,108,99,111,109,101,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -10,170,97,110,105,109,97,116,101,40,115,101,113,44,112,101,114,105,111,100,41,123,172,99,61,103,46,103,101,116,67,111, -108,111,114,40,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,163,40,115,101,113,46,108, -101,110,103,116,104,41,123,172,102,61,115,101,113,46,115,104,105,102,116,40,41,59,103,46,115,101,116,67,111,108,111,114, -40,99,41,59,163,40,102,41,102,40,41,59,125,164,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,125, -44,112,101,114,105,111,100,41,59,125,10,170,102,97,100,101,40,99,111,108,44,99,97,108,108,98,97,99,107,41,123,172, -110,61,48,59,170,102,40,41,123,34,114,97,109,34,103,46,115,101,116,67,111,108,111,114,40,99,111,108,41,59,167,40, -172,105,61,110,59,105,60,50,52,48,59,105,150,49,48,41,103,46,100,114,97,119,76,105,110,101,40,105,44,48,44,48, -44,105,41,46,100,114,97,119,76,105,110,101,40,105,44,50,52,48,44,50,52,48,44,105,41,59,103,46,102,108,105,112, -40,41,59,110,152,59,163,40,110,60,49,48,41,115,101,116,84,105,109,101,111,117,116,40,102,44,48,41,59,164,99,97, -108,108,98,97,99,107,40,41,59,125,102,40,41,59,125,10,172,83,67,69,78,69,95,67,79,85,78,84,61,49,48,59, -10,170,103,101,116,83,99,101,110,101,40,110,41,123,163,40,110,138,48,41,171,170,40,41,123,103,46,114,101,115,101,116, -40,41,46,115,101,116,66,103,67,111,108,111,114,40,48,41,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,49, -55,54,44,49,55,54,41,59,103,46,115,101,116,70,111,110,116,40,34,54,120,49,53,34,41,59,172,110,61,48,59,172, -108,61,66,97,110,103,108,101,46,103,101,116,76,111,103,111,40,41,59,172,105,109,61,103,46,105,109,97,103,101,77,101, -116,114,105,99,115,40,108,41,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,48,46, -49,59,103,46,115,101,116,67,111,108,111,114,40,110,44,110,44,110,41,59,103,46,100,114,97,119,73,109,97,103,101,40, -108,44,40,49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,44,40,49,55,54,45,105,109,46,104,101,105,103,104, -116,41,47,50,41,59,163,40,110,145,49,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,105,41,59,115,101, -116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,79,112,101,110,34,44, -52,52,44,49,48,52,41,44,53,48,48,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,72,97,99,107,97,98,108,101,34,44,52,52,44,49,49,54,41,44,49,48,48,48,41, -59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,83,109,97, -114,116,32,87,97,116,99,104,34,44,52,52,44,49,50,56,41,44,49,53,48,48,41,59,125,125,44,53,48,41,59,125, -59,163,40,110,138,49,41,171,170,40,41,123,172,105,109,103,61,114,101,113,117,105,114,101,40,34,104,101,97,116,115,104, -114,105,110,107,34,41,46,100,101,99,111,109,112,114,101,115,115,40,97,116,111,98,40,34,112,116,82,52,110,47,106,47, -52,103,72,43,56,72,53,119,108,43,106,79,117,107,86,86,111,72,90,56,100,116,47,110,47,47,110,51,55,79,116,103, -72,57,115,72,104,119,72,112,52,72,53,120,109,107,71,105,72,55,50,77,82,106,101,47,76,76,47,55,105,73,65,69, -69,55,115,80,69,103,111,65,67,43,65,108,97,103,73,108,73,105,77,81,69,114,80,120,68,119,85,89,120,65,65,66, -119,73,72,67,106,56,78,55,110,79,108,51,117,69,113,97,54,66,69,103,103,110,70,106,102,77,53,110,67,107,85,105, -108,51,103,69,113,53,75,68,65,65,81,109,67,54,81,109,66,69,52,74,120,83,69,104,73,65,66,105,81,109,66,56, -81,109,83,88,111,81,108,67,89,82,77,100,69,119,73,108,67,65,65,73,108,78,104,89,108,79,105,79,56,53,110,78, -69,121,77,80,69,111,90,119,73,65,65,99,115,89,73,89,109,80,88,111,89,108,77,105,75,97,70,69,120,88,47,117, -57,86,69,113,76,66,66,79,89,114,67,72,43,99,122,109,116,86,113,74,121,68,69,112,105,97,67,79,89,115,103,83, -89,115,122,109,99,51,113,116,84,69,113,77,82,55,104,122,71,56,65,108,71,109,100,49,79,81,103,108,79,79,89,54, -97,69,103,89,108,67,109,109,90,111,74,77,67,84,66,114,110,68,54,83,97,73,69,111,85,47,122,79,85,117,111,108, -83,106,98,110,66,74,103,113,97,67,69,111,85,53,122,79,88,88,52,82,121,81,89,66,66,122,67,83,52,88,53,122, -78,68,113,113,90,67,74,105,69,82,74,103,53,122,66,69,111,86,74,69,111,77,49,74,103,89,108,81,106,104,77,72, -99,52,74,76,69,109,90,77,69,69,112,54,90,73,74,103,80,122,83,52,87,84,109,90,77,86,84,73,76,109,70,89, -65,75,43,66,109,103,108,67,109,100,49,74,103,85,89,74,105,80,78,69,111,114,65,66,69,73,79,90,121,103,68,66, -109,53,77,67,105,74,77,81,108,104,77,72,56,66,121,66,88,119,73,108,66,74,103,85,120,74,105,77,100,53,110,79, -84,73,122,108,66,84,65,75,43,66,65,65,78,86,113,52,106,80,65,65,83,47,72,74,103,74,121,67,84,65,84,65, -69,65,67,67,47,66,52,83,47,73,74,103,73,108,67,89,65,103,65,80,105,83,47,75,110,53,121,69,89,65,78,84, -69,121,80,99,53,110,105,79,81,120,77,66,47,76,108,67,79,97,112,121,74,74,103,98,112,66,89,65,90,122,82,79, -81,75,47,71,108,48,65,84,73,87,102,69,111,90,122,66,99,54,73,108,66,54,83,89,71,103,66,74,66,74,103,112, -122,83,108,104,121,72,56,69,65,104,53,77,66,84,73,106,110,67,117,73,108,79,106,106,108,72,84,65,74,122,67,47, -76,109,68,84,83,83,89,73,69,111,84,65,66,79,89,73,108,69,84,83,75,89,72,88,119,73,65,66,79,89,77,48, -121,89,109,69,84,83,67,89,72,69,111,98,110,68,79,89,113,97,66,69,120,117,56,84,65,119,108,69,99,52,85,53, -69,111,105,97,67,109,75,43,78,84,65,111,108,70,69,119,88,48,84,81,122,66,77,88,119,88,105,69,112,84,66,67, -65,65,111,109,78,69,111,83,43,69,69,111,52,109,73,89,73,73,109,75,69,111,83,43,69,69,112,68,111,66,69,121, -85,98,69,111,51,103,69,111,52,109,74,100,65,73,109,73,74,89,52,108,74,69,121,99,100,69,111,80,79,79,66,89, -109,80,117,73,108,69,43,72,99,74,89,104,75,75,84,90,49,102,104,89,107,66,50,69,65,104,110,78,99,89,77,117, -69,104,111,109,77,114,56,65,51,89,65,66,69,111,74,121,66,53,103,106,79,65,65,89,109,72,109,57,86,103,69,76, -69,111,74,77,66,69,111,88,65,69,121,88,122,69,52,53,89,66,74,103,88,119,69,113,120,49,73,43,66,121,68,79, -89,74,121,86,74,119,53,121,67,103,69,66,51,99,81,71,103,74,77,87,74,119,81,110,67,117,54,47,67,103,70,66, -105,103,68,66,49,51,83,47,103,108,86,65,65,102,49,113,111,109,67,103,108,69,111,65,68,66,49,81,68,66,65,68, -69,80,69,111,78,86,113,69,65,111,108,69,103,69,75,111,108,75,69,114,74,77,68,89,65,74,77,68,48,108,69,48, -65,109,97,69,111,78,97,65,103,74,77,67,70,73,89,65,97,104,86,47,73,103,73,105,68,79,84,103,65,66,78,89, -74,77,69,79,84,111,105,67,73,111,74,77,67,79,84,122,102,67,78,52,82,77,66,79,84,120,115,68,74,73,82,121, -102,73,119,90,77,66,75,81,90,122,102,74,103,82,121,102,79,89,90,77,66,79,85,66,122,67,74,103,78,75,79,84, -53,122,68,74,103,76,111,67,65,68,120,75,66,79,65,73,65,66,79,84,54,97,67,65,65,82,121,102,79,89,82,121, -106,79,89,82,121,106,79,89,108,75,69,115,66,122,69,69,115,66,122,69,79,85,74,122,68,79,85,73,65,66,79,85, -105,97,68,79,85,82,122,67,79,85,90,122,67,69,115,99,75,67,105,89,34,41,41,59,172,105,109,61,103,46,105,109, -97,103,101,77,101,116,114,105,99,115,40,105,109,103,41,59,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66, -103,67,111,108,111,114,40,34,35,102,102,48,48,102,102,34,41,59,172,121,61,49,55,54,44,115,112,101,101,100,61,53, -59,170,98,97,108,108,111,111,110,40,99,97,108,108,98,97,99,107,41,123,121,151,115,112,101,101,100,59,172,120,61,40, -49,55,54,45,105,109,46,119,105,100,116,104,41,47,50,59,103,46,100,114,97,119,73,109,97,103,101,40,105,109,103,44, -120,44,121,41,59,103,46,99,108,101,97,114,82,101,99,116,40,120,44,121,43,56,49,44,120,43,55,55,44,121,43,56, -49,43,115,112,101,101,100,41,59,163,40,121,62,51,48,41,115,101,116,84,105,109,101,111,117,116,40,98,97,108,108,111, -111,110,44,48,44,99,97,108,108,98,97,99,107,41,59,164,99,97,108,108,98,97,99,107,40,41,59,125,102,97,100,101, -40,34,35,102,102,48,48,102,102,34,44,170,40,41,123,98,97,108,108,111,111,110,40,170,40,41,123,103,46,115,101,116, -67,111,108,111,114,40,45,49,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,46,115,101,116,70, -111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,87,101,108,99, -111,109,101,46,34,44,56,56,44,49,51,48,41,59,125,41,59,125,41,59,115,101,116,84,105,109,101,111,117,116,40,170, -40,41,123,172,110,61,48,59,172,105,61,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,110,150,52,59,103, -46,115,99,114,111,108,108,40,48,44,45,52,41,59,163,40,110,62,49,53,48,41,99,108,101,97,114,73,110,116,101,114, -118,97,108,40,105,41,59,125,44,50,48,41,59,125,44,51,53,48,48,41,59,125,59,163,40,110,138,50,41,171,170,40, -41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,48, -48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110, -116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61, -55,48,44,121,61,50,53,44,104,61,50,53,59,97,110,105,109,97,116,101,40,91,40,41,162,103,46,100,114,97,119,83, -116,114,105,110,103,40,34,89,111,117,114,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119,83,116,114, -105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97,119, -83,116,114,105,110,103,40,34,104,97,115,32,111,110,101,34,44,120,44,121,150,104,41,44,40,41,162,103,46,100,114,97, -119,83,116,114,105,110,103,40,34,98,117,116,116,111,110,34,44,120,44,121,150,104,41,44,40,41,162,123,103,46,115,101, -116,70,111,110,116,40,34,49,50,120,50,48,58,50,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44, -48,44,49,41,46,100,114,97,119,83,116,114,105,110,103,40,34,72,69,82,69,33,34,44,49,53,48,44,56,56,41,59, -125,93,44,50,48,48,41,59,125,59,163,40,110,138,51,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103, -46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,102,102,34,41,46,115,101,116,67,111,108,111,114,40, -48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,46,115, -101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80, -114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59, -103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40, -34,84,111,32,119,97,107,101,32,116,104,101,92,110,115,99,114,101,101,110,32,117,112,44,32,111,114,32,116,111,92,110, -115,101,108,101,99,116,34,44,56,56,44,54,48,41,59,125,59,163,40,110,138,52,41,171,170,40,41,123,103,46,114,101, -115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,102,102,102,102,34,41,46,115,101, -116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110, -40,48,44,48,41,46,115,101,116,70,111,110,116,40,34,54,120,49,53,58,50,34,41,59,103,46,100,114,97,119,83,116, -114,105,110,103,40,34,76,111,110,103,32,80,114,101,115,115,34,44,56,56,44,52,48,41,46,115,101,116,70,111,110,116, -65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,34,84,111,32,103,111,32,98,97,99,107,32,116,111,92,110,116,104,101,32, -99,108,111,99,107,34,44,56,56,44,54,48,41,59,125,59,163,40,110,138,53,41,171,170,40,41,123,103,46,114,101,115, -101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48,48,48,48,34,41,46,115,101,116, -67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40, -48,44,48,41,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,59,103,46,100,114,97,119,83,116,114,105, -110,103,40,34,73,102,32,66,97,110,103,108,101,46,106,115,32,101,118,101,114,92,110,115,116,111,112,115,44,32,104,111, -108,100,32,116,104,101,92,110,98,117,116,116,111,110,32,102,111,114,92,110,116,101,110,32,115,101,99,111,110,100,115,46, -92,110,92,110,66,97,110,103,108,101,46,106,115,32,119,105,108,108,92,110,116,104,101,110,32,114,101,98,111,111,116,46, -34,44,56,56,44,55,56,41,59,125,59,163,40,110,138,54,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59, -103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,48,48,48,48,102,102,34,41,46,115,101,116,67,111,108,111,114, -40,45,49,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46, -115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61,45,50,48,44,104,61, -54,48,59,97,110,105,109,97,116,101,40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97, -110,103,108,101,46,106,115,32,104,97,115,32,97,92,110,102,117,108,108,32,116,111,117,99,104,115,99,114,101,101,110,34, -44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -68,114,97,103,32,117,112,32,97,110,100,32,100,111,119,110,92,110,116,111,32,115,99,114,111,108,108,32,97,110,100,92, -110,116,97,112,32,116,111,32,115,101,108,101,99,116,34,44,120,44,121,150,104,41,59,125,44,93,44,51,48,48,41,59, -125,59,163,40,110,138,55,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111, -108,111,114,40,34,35,48,48,102,102,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114, -40,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105, -103,110,40,48,44,48,41,59,172,120,61,56,56,44,121,61,45,51,53,44,104,61,56,48,59,97,110,105,109,97,116,101, -40,91,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,32,99,111, -109,101,115,92,110,119,105,116,104,32,97,32,102,101,119,92,110,97,112,112,115,32,105,110,115,116,97,108,108,101,100,34, -44,120,44,121,150,104,41,59,125,44,48,44,48,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34, -84,111,32,97,100,100,32,109,111,114,101,44,32,118,105,115,105,116,92,110,98,97,110,103,108,101,106,115,46,99,111,109, -47,97,112,112,115,34,44,120,44,121,150,104,41,59,125,44,93,44,52,48,48,41,59,125,59,163,40,110,138,56,41,171, -170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101,116,66,103,67,111,108,111,114,40,34,35,102,102,48, -48,48,48,34,41,46,115,101,116,67,111,108,111,114,40,48,41,46,99,108,101,97,114,40,41,59,103,46,115,101,116,70, -111,110,116,40,34,49,50,120,50,48,34,41,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,172, -120,61,56,56,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,89,111,117,32,99,97,110,32,97,108,115,111,32, -109,97,107,101,92,110,121,111,117,114,32,111,119,110,32,97,112,112,115,33,34,44,120,44,51,48,41,59,103,46,100,114, -97,119,83,116,114,105,110,103,40,34,67,104,101,99,107,32,111,117,116,92,110,98,97,110,103,108,101,106,115,46,99,111, -109,34,44,120,44,49,51,48,41,59,172,114,120,61,48,44,114,121,61,48,59,170,100,114,97,119,40,41,123,114,120,150, -48,46,49,59,114,121,150,48,46,49,49,59,172,114,99,120,61,77,97,116,104,46,99,111,115,40,114,120,41,44,114,115, -120,61,77,97,116,104,46,115,105,110,40,114,120,41,44,114,99,121,61,77,97,116,104,46,99,111,115,40,114,121,41,44, -114,115,121,61,77,97,116,104,46,115,105,110,40,114,121,41,59,170,112,40,120,44,121,44,122,41,123,172,116,59,116,61, -120,42,114,99,121,43,122,42,114,115,121,59,122,61,122,42,114,99,121,45,120,42,114,115,121,59,120,61,116,59,116,61, -121,42,114,99,120,43,122,42,114,115,120,59,122,61,122,42,114,99,120,45,121,42,114,115,120,59,121,61,116,59,122,150, -52,59,171,91,56,56,43,54,48,42,120,47,122,44,55,56,43,54,48,42,121,47,122,93,59,125,172,97,59,172,115,61, -51,48,59,103,46,99,108,101,97,114,82,101,99,116,40,56,56,45,115,44,55,56,45,115,44,56,56,43,115,44,55,56, -43,115,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84,111,40,97,91,48,93,44, -97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93, -44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48,93, -44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97,91,48, -93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,108,105,110,101,84,111,40,97, -91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,109,111,118,101,84,111,40, -97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40, -97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97, -91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,103,46,108,105,110,101,84,111,40,97, -91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,108,105,110,101,84,111,40, -97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,45,49,41,59,103,46,109,111,118,101,84, -111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,45,49,44,49,41,59,103,46,108,105,110,101, -84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,45,49,41,59,103,46,109,111,118, -101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,45,49,44,49,41,59,103,46,108,105,110, -101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,45,49,41,59,103,46,109,111,118, -101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,49,44,49,44,49,41,59,103,46,108,105,110,101, -84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,45,49,41,59,103,46,109,111,118, -101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,97,61,112,40,45,49,44,49,44,49,41,59,103,46,108,105,110, -101,84,111,40,97,91,48,93,44,97,91,49,93,41,59,125,115,101,116,73,110,116,101,114,118,97,108,40,100,114,97,119, -44,53,48,41,59,125,59,163,40,110,138,57,41,171,170,40,41,123,103,46,114,101,115,101,116,40,41,59,103,46,115,101, -116,66,103,67,111,108,111,114,40,34,35,102,102,102,102,102,102,34,41,59,103,46,99,108,101,97,114,40,41,59,103,46, -115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,48,41,59,103,46,115,101,116,70,111,110,116,40,34,49,50,120, -50,48,34,41,59,172,120,61,56,56,44,121,61,49,48,44,104,61,50,49,59,97,110,105,109,97,116,101,40,91,40,41, -162,103,46,100,114,97,119,83,116,114,105,110,103,40,34,84,104,97,116,39,115,32,105,116,33,34,44,120,44,121,150,104, -41,44,40,41,162,123,103,46,100,114,97,119,83,116,114,105,110,103,40,34,80,114,101,115,115,34,44,120,44,121,150,104, -42,50,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,104,101,32,98,117,116,116,111,110,34,44,120,44, -121,150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,116,111,32,115,116,97,114,116,34,44,120,44,121, -150,104,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,34,66,97,110,103,108,101,46,106,115,34,44,120,44,121, -150,104,41,59,125,93,44,52,48,48,41,59,125,125,10,172,115,99,101,110,101,78,117,109,98,101,114,61,48,59,10,170, -109,111,118,101,40,100,105,114,41,123,163,40,100,105,114,62,48,158,115,99,101,110,101,78,117,109,98,101,114,43,49,138, -83,67,69,78,69,95,67,79,85,78,84,41,171,59,115,99,101,110,101,78,117,109,98,101,114,61,40,115,99,101,110,101, -78,117,109,98,101,114,43,100,105,114,41,37,83,67,69,78,69,95,67,79,85,78,84,59,163,40,115,99,101,110,101,78, -117,109,98,101,114,60,48,41,115,99,101,110,101,78,117,109,98,101,114,61,48,59,99,108,101,97,114,73,110,116,101,114, -118,97,108,40,41,59,103,101,116,83,99,101,110,101,40,115,99,101,110,101,78,117,109,98,101,114,41,40,41,59,163,40, -115,99,101,110,101,78,117,109,98,101,114,62,49,41,123,172,108,61,83,67,69,78,69,95,67,79,85,78,84,59,167,40, -172,105,61,48,59,105,60,108,45,50,59,105,152,41,123,172,120,61,56,56,43,40,105,45,40,108,45,50,41,47,50,41, -42,49,50,59,163,40,105,60,115,99,101,110,101,78,117,109,98,101,114,45,49,41,123,103,46,115,101,116,67,111,108,111, -114,40,45,49,41,46,102,105,108,108,67,105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,125,164,123,103,46,115, -101,116,67,111,108,111,114,40,48,41,46,102,105,108,108,67,105,114,99,108,101,40,120,44,49,54,54,44,52,41,59,103, -46,115,101,116,67,111,108,111,114,40,45,49,41,46,100,114,97,119,67,105,114,99,108,101,40,120,44,49,54,54,44,52, -41,59,125,125,125,163,40,115,99,101,110,101,78,117,109,98,101,114,60,83,67,69,78,69,95,67,79,85,78,84,45,49, -41,115,101,116,84,105,109,101,111,117,116,40,170,40,41,123,109,111,118,101,40,49,41,59,125,44,53,48,48,48,41,59, -125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,109,111,118,101,40,100,105,114, -41,41,59,10,115,101,116,87,97,116,99,104,40,40,41,162,123,163,40,115,99,101,110,101,78,117,109,98,101,114,138,83, -67,69,78,69,95,67,79,85,78,84,45,49,41,108,111,97,100,40,41,59,164,109,111,118,101,40,49,41,59,125,44,66, -84,78,49,44,123,114,101,112,101,97,116,58,180,125,41,59,10,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105, -109,101,111,117,116,40,48,41,59,10,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,48,41,59,10,66, -97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,10,109,111,118,101,40,48,41,59,255,255, -234,1,0,0,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0, -40,170,40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114, -97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,119,101,108,99,111,109,101,46,106,115,111,110,39,44,49,41, -160,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,101, -116,116,105,110,103,46,106,115,111,110,39,44,49,41,160,123,125,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58, -123,39,116,105,116,108,101,39,58,39,87,101,108,99,111,109,101,32,65,112,112,39,125,44,39,82,117,110,32,110,101,120, -116,32,98,111,111,116,39,58,123,118,97,108,117,101,58,33,115,101,116,116,105,110,103,115,46,119,101,108,99,111,109,101, -100,44,102,111,114,109,97,116,58,118,162,118,63,39,89,101,115,39,58,39,78,111,39,44,111,110,99,104,97,110,103,101, -58,118,162,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108, -99,111,109,101,46,106,115,111,110,39,44,123,119,101,108,99,111,109,101,100,58,33,118,125,41,44,125,44,39,82,117,110, -32,78,111,119,39,58,40,41,162,108,111,97,100,40,39,119,101,108,99,111,109,101,46,97,112,112,46,106,115,39,41,44, -39,84,117,114,110,32,111,102,102,32,38,32,114,117,110,32,110,101,120,116,39,58,40,41,162,123,114,101,113,117,105,114, -101,40,39,83,116,111,114,97,103,101,39,41,46,119,114,105,116,101,40,39,119,101,108,99,111,109,101,46,106,115,111,110, -39,44,123,119,101,108,99,111,109,101,100,58,181,125,41,59,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100, -40,180,41,59,163,40,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,41,66,97,110,103,108,101,46,115,111, -102,116,79,102,102,40,41,59,164,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,39,60,32,66,97,99,107,39, -58,98,97,99,107,44,125,41,125,41,255,255,4,9,0,0,119,101,108,99,111,109,101,46,105,109,103,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,48,48,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254, +254,254,254,204,204,204,204,204,204,204,204,204,204,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150, +150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192,150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204, +186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204, +204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204,205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204, +204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204, +206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204,213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204, +214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204, +213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204, +204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254, +254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254, +254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, +186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91, +204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254, +254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91,127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186, +150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91, +91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150, +186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97, +91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186, +186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97, +97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97, +97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,204,204,204,205,206,214,214,214,214,206,205,204,204,198,150,150,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,204,206,214,215,214,206,205,204,204,204,204,204,204,192, -150,150,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -204,204,213,215,214,205,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,204,204,206,215,214,205,204,204,204,204,204,204,204,204,204,204,204, -198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,91,91,127,204, -205,214,214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,97,97,97,91,91,169,204,206,215,206,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,192,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,134,171,172,135,204,204, -213,214,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,254,254,97,97,135,214,171,91,91,204,204,214,206,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,97,135,215,171,97,91,91,204,204, -214,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254, -254,254,254,254,254,254,97,134,215,172,97,97,91,91,204,204,213,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,97,172,215,134,97,97,91,91,168,204, -206,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254, -254,254,254,254,254,97,133,214,172,97,97,97,91,91,127,204,204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -204,192,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,97,134,215,135,97,97,97,91,91,91,204, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,97,134,215,134,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, -198,150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,97,134,215,134,97,97,97,97,91,91,127, -204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,186,254,254,254,254,254,254, -254,254,254,254,254,97,97,178,134,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,198, -150,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,171,97,97,97,97,97,91,91, -127,204,204,204,204,204,204,204,204,204,204,204,204,204,204,186,150,186,186,186,186,186,186,186,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,97,97,171,97,97,97,97,97,91,91,91,168,204,204,204,204,204,204,204,204,204,204,204,204,192,150, -150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,134,134,97,97,97,97,97,91, -91,91,204,204,204,204,204,204,204,204,204,204,204,198,150,150,186,186,186,186,186,186,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,204,204,204,204,204,204,204,204,204,198,150,150,186, -186,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97, -91,91,91,91,168,204,204,204,204,204,204,198,150,150,150,186,186,186,186,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,97,97,97,97,97,97,97,97,91,91,91,91,127,204,204,204,204,254,254,186,186,186,186, -186,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97,97,97,97, -97,97,91,91,91,254,198,198,198,198,254,150,150,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,91,97,97,97,97,97,97,91,254,254,198,198,198,198,254,150,150,150,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,97,97, -97,91,91,91,91,254,254,164,164,254,254,158,151,150,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254, +254,254,91,91,91,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,91,91,92,254,254,136,136,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254, +254,254,254,129,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,136,136,254,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254, +254,254,254,254,136,136,254,136,136,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,136,136,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,136,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254, +254,254,254,254,254,136,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,136,136,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,136,136,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, -254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44, -34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34,44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46, -97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101, -114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116,97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99, -111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101,108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111, -109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111,109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109, -101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101,108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97, -34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34,125,255,255,255,119,56,0,0,115,101,116,116,105,110,103,46, -97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67, -97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100, -111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101, -40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41, -42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44, -40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97, -116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112, -111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118, -105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101, -40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112, -117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101, -107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138, -50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41, -41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118, -105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41, -46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41, -44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116, -101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116, -104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109, -111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59, -172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49, -59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110, -116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98, -114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50, -41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115, -46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58, -109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40, -41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69, -74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116, -111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105, -110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119, -114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10, -170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116, -105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50,41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84, -78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160, -111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123,111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125, -125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50, -160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46,119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119, -97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101, -79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108, -101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125,10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41, -123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101,114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49, -57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98, -108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108,111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109, -101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58,180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50, -63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110,101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58, -182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114,115,116,68,97,121,79,102,87,101,101,107,58,48,44,98,114, -105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111,110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180, -44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97,107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79, -110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110,84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119, -105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115,104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116, -77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84,105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117, -112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97, -103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116,116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163, -40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111, -108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34,58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105, -110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, -83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65, -112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83, -121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101, -116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39, -58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162, -115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110, -109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109, -101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97, -99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41, -162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67, -68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39,58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101, -110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111,99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107, -77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84,105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84, -105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41, -59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101,110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116, -101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97, -108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101,112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70, -111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61, -118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101, -101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101, -113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114, -101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59,125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34, -118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79,102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98, -114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46, -109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101, -112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58,98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102, -111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116, -116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86,91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111, -103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84, -105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118, -138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40,86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101, -113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114, -101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, -59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115, -39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66, -101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101,109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118, -97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111, -108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105, -98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101, -116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66, -82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82, -65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41,59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101, -34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116, -58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109,115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51, -93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51, -59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40, -41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73,68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113, -109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59,125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117, -40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100, -86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34,107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93, -59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75,98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98, -114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115,101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69, -46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39,116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116, -104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39, -77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101,39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116, -97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101, -44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123, -115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101,116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116, -101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118, -97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111, -108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108, -101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101, -116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68,39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97, -120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120,79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41, -41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116, -58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, -72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44, -39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112, -97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111, -110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101, -121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105, -110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115, -116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34,41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101, -58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117, -41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171, -103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101,116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116, -104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101,116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59, -117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115, -101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115,101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101, -116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46,102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116, -104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61,170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116, -40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41, -44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59,125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110, -103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,109,46,100,114,97,119,40,41,59,125,172,116,104,101, -109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66, -97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66, -87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40, -34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34,35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35, -48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102,102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48, -102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39,76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112, -100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41,44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102, -103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103,50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72, -58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58,99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58, -181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47, -94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111,114,69,97,99,104,40,110,162,123,173,110,101,119,84,104,101, -109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,110, -41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119,84,104,101,109,101,46,110,97,109,101,63,110,101,119,84,104, -101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,110,101,119,84,104, -101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,41,44,102,103,50,58,99, -108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44,98,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46, -98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,72,41,44,98,103,72,58,99,108, -40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100,97,114,107,58,110,101,119,84,104,101,109,101,46,100,97,114, -107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77,101,110,117,91,39,67,117,115,116,111,109,105,122,101,39,93, -61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,59,172,109,61,69,46,115, -104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101,110,117,41,59,170,115,104,111,119,67,117,115,116,111,109,84, -104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84,40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109, -101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98,103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40, -118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117,112,100,40,116,104,41,59,125,173,114,103,98,61,123,125,59, -114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48,48,48,34,59,114,103,98,91,39,119,104,105,116,101,39,93, -61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100,39,93,61,34,35,102,48,48,34,59,114,103,98,91,39,103, -114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103,98,91,39,98,108,117,101,39,93,61,34,35,48,48,102,34, -59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48,102,102,34,59,114,103,98,91,39,109,97,103,101,110,116,97, -39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121,101,108,108,111,119,39,93,61,34,35,102,102,48,34,59,163, -40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98,91,39,111,114,97,110,103,101,39,93,61,34,35,102,102,55, -102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101,39,93,61,34,35,55,102,48,48,102,102,34,59,114,103,98, -91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55,102,34,59,125,173,99,111,108,111,114,115,61,91,93,44,110, -97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98,41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59, -99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114,103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123, -39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111,109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99, -107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123, -102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44,98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44, -102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32,50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117, -110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108,105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105, -103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34,102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34, -98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34,93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110, -117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105,110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108, -101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111, -108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116,104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109, -97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99, -111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103,39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115, -101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101,46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46, -116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40,39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41, -59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125,41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93, -61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117, -40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101, -110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68, -105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117, -112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125, -59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97, -115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121, -61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105, -61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123,109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43, -49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105, -93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110,99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116, -116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112,108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115, -101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116, -101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117, -40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172, -109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44, -34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, -61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40, -41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105, -110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111,114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91, -100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61,170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116, -40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101, -116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115, -46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120,79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83, -101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108, -105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125,125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101, -118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32, -100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116,111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87, -104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40,170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108, -108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108, -105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110, -101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78,82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44, -170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101, -116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105, -116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115, -40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101, -99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69, -46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41, -123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39, -60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68, -32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105, -103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44,109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111, -110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118, -160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67, -68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41, -59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, -115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110, -99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117, -112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109, -101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32, -111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, -46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110, -99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101, -79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66, -84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71, -76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87, -97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116, -105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97, -116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, -119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, -101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101, -32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110, -115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111, -110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107, -101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, -66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99, -116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85, -112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, -110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110, -103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97, -99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99, -101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32, -84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119, -97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99, -104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79, -110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84, -111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110, -32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46, -119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110, -99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101, -79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110, -84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32, -84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117,101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101, -116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109, -105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44,115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110, -103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101, -115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97,108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79, -112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101, -58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58, -45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101, -58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118, -160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32, -84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115, -46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101, -112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111, -110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61,118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116, -105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117, -41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110, -117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107, -39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101, -39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,44,102,111,114,109,97, -116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41,43,118,44,109,105,110,58,45,49,49,44,109,97,120,58,49, -51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46, -116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125, -44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123,118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115, -91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97,116,58,118,162,118,63,34,49,50,104,34,58,34,50,52,104, -34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93, -61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,83,116,97,114,116,32,87,101, -101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121, -79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48,44,109,97,120,58,49,44,102,111,114,109,97,116,58,118,162, -114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,40,118,44,49,41,44,111, -110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87, -101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,44,125,125,59,10,171, -69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108,101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116, -105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116, -105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101, -110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111,39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40, -48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48,44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44, -102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34,44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69, -46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116, -105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, -67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97, -103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46,46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92, -110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108,101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101, -113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85, -116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119,114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40, -41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111, -111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101, -97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106,115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101, -116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125,44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114, -121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103, -32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32,99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92, -110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116,111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59, -66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115, -101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119, -101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59, -163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72, -82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111, -109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101, -114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101, -114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40, -49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66, -97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73, -110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49,48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125, -125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10,109,101,110,117,91,39,67,97,108,105,98,114,97,116,101,32, -66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,73,115,32,116, -104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121,32,99,104,97,114,103,101,100,63,34,44,123,116,105,116,108, -101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46,116,104,101,110,40,111,107,162,123,163,40,111,107,41,123,172, -115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115, -101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46,98,97,116,70,117,108,108,86,111,108,116,97,103,101,61,40, -97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110, -97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,41,47,52,59,114, -101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,115,101,116, -116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46,115,104,111,119,65,108,101,114,116,40,34,67,97,108,105,98, -114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46, -97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115,104,111,119,65,108,101,114,116,40,34,80,108,101,97,115,101, -32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106,115,32,102,111,114,32,51,32,104,111,117,114,115,32,97,110, -100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104,101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116, -105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,125,41,59,125,59,10,109,101,110,117,91,39,82,101,115,101, -116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82, -101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115,63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105, -110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115, -97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41,59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41, -59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115, -104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,59,10,109,101,110,117,91,34,84,117,114,110,32,79, -102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115, -117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32,116,105,109,101,114,115,32,119,111,110,39,116,32,102,105,114, -101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32,79,102,102,34,125,41,46,116,104,101,110,40,40,99,111,110, -102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105,114,109,101,100,41,123,69,46,115,104,111,119,77,101,115,115, -97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97,116,101,114,33,34,44,34,71,111,111,100,98,121,101,34,41, -59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59, -103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108,101,46,115,111,102,116,79,102,102,63,66,97,110,103,108,101, -46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108,101,46,111,102,102,40,41,59,125,44,50,53,48,48,41,59, -125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,125,41,59,125,59,10,163,40,66,97,110,103,108, -101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123,109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101, -115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108, -108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104,105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97, -99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116,104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46, -115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101,114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108, -101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119, -85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125,10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110, -117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119, -97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123,125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67, -111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101,61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82, -70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115,117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99, -101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111,119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110, -83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101,63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101, -99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114,162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101, -140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101,61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46,115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101, -41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99, -107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65,112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111, -114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105,110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162, -123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158, -97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63,97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112, -112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44,98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98, -46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108,111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105, -116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111,99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40, -41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46, -102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46, -110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103,115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41, -160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108, -61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111,99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41, -162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116, -105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115,114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103, -115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99, -107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123,99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108, -111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162,123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117, -40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41, -123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105,109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116, -108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101,39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123, -115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109,101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121, -115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97,121,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68, -97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43, -51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68,97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44, -39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,111,110,116,104,40,41,43,49,44,102,111, -114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,109,111,110, -116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43, -49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77,111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59, -125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41, -44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49,48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41, -123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118,41,59,125,125,44,39,72,111,117,114,39,58,123,118,97,108, -117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46, -118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59,100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108, -117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58,123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117, -116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54, -48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116,101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39, -83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100,46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110, -99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46, -115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108,117,101,41,59,125,125,125,59,10,171,69,46,115,104,111,119, -77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103, -115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, -65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77, -97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112,115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47, -92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47,41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116, -114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41,41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116, -111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105,100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97, -109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110,97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111, -114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114,125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41, -162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114,100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114, -100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46,110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59, -163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41,171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46, -108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110,117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101, -116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125,10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40, -97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112,46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65, -112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125,59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97, -112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10, -174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36, -123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109,115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32, -103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116,99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110, -103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112,101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116, -116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116, -105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83,101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112, -83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40, -96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41, -171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59, -125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141,34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111, -119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112, -112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117, -40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112, -46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69, -114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119, -77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0,115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0, -0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80, -0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0, -85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85,69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0, -0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85,234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170, -213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122, -170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170,169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0, -0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42, -170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234, -170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170,171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0, -0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170, -181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0,0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85, -94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85,85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0, -0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0,5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80, -0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0, -5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116, -105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116, -114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114,117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34, -116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98,114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112, -34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110,101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101, -44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49,50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114, -105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116,105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84, -78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101, -79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97,107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115, -101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105, -115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84,104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44, -34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48,44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58, -49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116,105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115,101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34, -83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34, -44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103,46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114, -34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34,48,46,52,56,34,44,34,116,97,103,115,34,58,34,116,111, -111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101,115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111, -44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44,115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97, -116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111,110,34,125,255,210,14,0,0,104,101,97,108,116,104,46,97, -112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,170,109,101,110,117,77,97,105,110,40,41, -123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69, -46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108,116,104,32,84,114,97, -99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,108,111,97,100,40,41,44,34,83,116,101,112, -32,67,111,117,110,116,105,110,103,34,58,40,41,162,109,101,110,117,83,116,101,112,67,111,117,110,116,40,41,44,34,77, -111,118,101,109,101,110,116,34,58,40,41,162,109,101,110,117,77,111,118,101,109,101,110,116,40,41,44,34,72,101,97,114, -116,32,82,97,116,101,34,58,40,41,162,109,101,110,117,72,82,77,40,41,44,34,83,101,116,116,105,110,103,115,34,58, -40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40, -34,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46,106,115,34,41,41,40,40,41,162,109,101,110,117,77,97, -105,110,40,41,41,125,41,59,125,10,170,109,101,110,117,83,116,101,112,67,111,117,110,116,40,41,123,115,119,105,112,101, -95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77, -101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,83,116,101,112,115,34,125,44,34,60,32,66,97,99,107,34, -58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162,115,116,101, -112,115,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,115,116,101,112,115,80,101, -114,68,97,121,40,41,125,41,59,125,10,170,109,101,110,117,77,111,118,101,109,101,110,116,40,41,123,115,119,105,112,101, -95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77, -101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,77,111,118,101,109,101,110,116,34,125,44,34,60,32,66,97, -99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162, -109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,109, -111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,109,101,110,117,72,82,77,40,41,123, -115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46, -115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,114,116,32,82,97,116,101,34, -125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111, -117,114,34,58,40,41,162,104,114,109,80,101,114,72,111,117,114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41, -162,104,114,109,80,101,114,68,97,121,40,41,44,125,41,59,125,10,170,115,116,101,112,115,80,101,114,72,111,117,114,40, -41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100, -97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101, -97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46, -104,114,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100, -114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110, -40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44, -100,97,116,97,41,59,125,10,170,115,116,101,112,115,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115, -115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54, -65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100, -68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46, -100,97,121,93,150,104,46,115,116,101,112,115,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46, -100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111, -110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65,89,34,44, -100,97,116,97,41,59,125,10,170,104,114,109,80,101,114,72,111,117,114,40,41,123,69,46,115,104,111,119,77,101,115,115, -97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65, -114,114,97,121,40,50,52,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,50,51,41,59,114,101, -113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44, -104,162,123,100,97,116,97,91,104,46,104,114,93,150,104,46,98,112,109,59,163,40,104,46,98,112,109,41,99,110,116,91, -104,46,104,114,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40,100,44,105,41,162,100,97,116, -97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101, -46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116, -111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97,116,97, -41,59,125,10,170,104,114,109,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34, -76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40, -51,49,41,59,172,99,110,116,61,184,85,105,110,116,56,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101, -40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68, -97,116,101,40,41,44,104,162,123,100,97,116,97,91,104,46,100,97,121,93,150,104,46,98,112,109,59,163,40,104,46,98, -112,109,41,99,110,116,91,104,46,100,97,121,93,152,59,125,41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40, -100,44,105,41,162,100,97,116,97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49, -41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41, -59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67,104,97,114,116,40,34,68,65, -89,34,44,100,97,116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40,41,123,69,46, -115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61, -184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104, -34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,104,114,93,150, -104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114, -97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40, -109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97, -116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101, -115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49, -54,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97, -100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104, -46,100,97,121,93,150,104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110, -103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66, -117,116,116,111,110,40,109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65, -89,34,44,100,97,116,97,41,59,125,10,174,119,61,103,46,103,101,116,87,105,100,116,104,40,41,59,10,174,104,61,103, -46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,100,97,116,97,95,108,101,110,59,10,172,99,104,97,114,116,95, -105,110,100,101,120,59,10,172,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,59,10,172,99,104,97,114,116,95, -108,97,98,101,108,59,10,172,99,104,97,114,116,95,100,97,116,97,59,10,172,115,119,105,112,101,95,101,110,97,98,108, -101,100,61,181,59,10,172,98,116,110,59,10,170,109,97,120,40,97,114,114,41,123,172,109,61,45,73,110,102,105,110,105, -116,121,59,167,40,172,105,61,48,59,105,60,97,114,114,46,108,101,110,103,116,104,59,105,152,41,163,40,97,114,114,91, -105,93,62,109,41,109,61,97,114,114,91,105,93,59,171,109,59,125,10,170,103,101,116,95,100,97,116,97,95,108,101,110, -103,116,104,40,97,114,114,41,123,172,110,108,101,110,61,97,114,114,46,108,101,110,103,116,104,59,167,40,172,105,61,97, -114,114,46,108,101,110,103,116,104,45,49,59,105,62,48,158,97,114,114,91,105,93,138,48,59,105,153,41,110,108,101,110, -153,59,171,110,108,101,110,59,125,10,170,98,97,114,67,104,97,114,116,40,108,97,98,101,108,44,100,116,41,123,100,97, -116,97,95,108,101,110,61,103,101,116,95,100,97,116,97,95,108,101,110,103,116,104,40,100,116,41,59,99,104,97,114,116, -95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40,100,97,116,97,95,108,101,110,45,53,44,45,53,41,59,99, -104,97,114,116,95,109,97,120,95,100,97,116,117,109,61,109,97,120,40,100,116,41,59,99,104,97,114,116,95,108,97,98, -101,108,61,108,97,98,101,108,59,99,104,97,114,116,95,100,97,116,97,61,100,116,59,100,114,97,119,66,97,114,67,104, -97,114,116,40,41,59,115,119,105,112,101,95,101,110,97,98,108,101,100,61,180,59,125,10,170,100,114,97,119,66,97,114, -67,104,97,114,116,40,41,123,174,98,97,114,95,98,111,116,61,49,52,48,59,174,98,97,114,95,119,105,100,116,104,61, -40,119,45,50,41,47,57,59,172,98,97,114,95,116,111,112,59,172,98,97,114,59,103,46,115,101,116,67,111,108,111,114, -40,103,46,116,104,101,109,101,46,98,103,41,59,103,46,102,105,108,108,82,101,99,116,40,48,44,50,52,44,119,44,104, -41,59,167,40,98,97,114,61,49,59,98,97,114,60,49,48,59,98,97,114,152,41,123,163,40,98,97,114,138,53,41,123, -103,46,115,101,116,70,111,110,116,40,39,54,120,56,39,44,50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103, -110,40,48,44,45,49,41,59,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103, -46,100,114,97,119,83,116,114,105,110,103,40,99,104,97,114,116,95,108,97,98,101,108,43,34,32,34,43,40,99,104,97, -114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,43,34,32,32,32,34,43,99,104,97,114,116,95,100,97,116,97, -91,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,93,44,103,46,103,101,116,87,105,100,116,104,40,41, -47,50,44,49,53,48,41,59,103,46,115,101,116,67,111,108,111,114,40,34,35,48,48,102,34,41,59,125,164,123,103,46, -115,101,116,67,111,108,111,114,40,34,35,48,102,102,34,41,59,125,163,40,40,99,104,97,114,116,95,105,110,100,101,120, -43,98,97,114,45,49,41,145,48,158,40,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,60,100,97, -116,97,95,108,101,110,158,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,62,48,41,98,97,114,95,116,111,112, -61,98,97,114,95,98,111,116,45,49,48,48,42,40,99,104,97,114,116,95,100,97,116,97,91,99,104,97,114,116,95,105, -110,100,101,120,43,98,97,114,45,49,93,41,47,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,59,164,98,97, -114,95,116,111,112,61,98,97,114,95,98,111,116,59,103,46,102,105,108,108,82,101,99,116,40,49,43,40,98,97,114,45, -49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97,114,42,98,97,114,95,119, -105,100,116,104,44,98,97,114,95,116,111,112,41,59,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101, -46,102,103,41,59,103,46,100,114,97,119,82,101,99,116,40,49,43,40,98,97,114,45,49,41,42,98,97,114,95,119,105, -100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97,114,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95, -116,111,112,41,59,125,125,10,170,110,101,120,116,95,98,97,114,40,41,123,99,104,97,114,116,95,105,110,100,101,120,61, -77,97,116,104,46,109,105,110,40,100,97,116,97,95,108,101,110,45,53,44,99,104,97,114,116,95,105,110,100,101,120,43, -49,41,59,125,10,170,112,114,101,118,95,98,97,114,40,41,123,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116, -104,46,109,97,120,40,40,99,104,97,114,116,95,108,97,98,101,108,138,34,68,65,89,34,41,63,45,51,58,45,52,44, -99,104,97,114,116,95,105,110,100,101,120,45,49,41,59,125,10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112, -101,39,44,100,105,114,162,123,163,40,33,115,119,105,112,101,95,101,110,97,98,108,101,100,41,171,59,163,40,100,105,114, -138,49,41,112,114,101,118,95,98,97,114,40,41,59,164,110,101,120,116,95,98,97,114,40,41,59,100,114,97,119,66,97, -114,67,104,97,114,116,40,41,59,125,41,59,10,170,115,101,116,66,117,116,116,111,110,40,102,110,41,123,66,97,110,103, -108,101,46,115,101,116,85,73,40,34,117,112,100,111,119,110,34,44,183,41,59,163,40,112,114,111,99,101,115,115,46,101, -110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,98,116,110,61,115,101,116,87,97,116,99,104,40,102,110,44,66, -84,78,50,41,59,164,98,116,110,61,115,101,116,87,97,116,99,104,40,102,110,44,66,84,78,49,41,59,125,10,170,99, -108,101,97,114,66,117,116,116,111,110,40,41,123,163,40,98,116,110,141,183,41,123,99,108,101,97,114,87,97,116,99,104, -40,98,116,110,41,59,98,116,110,61,183,59,125,125,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116, -115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,109,101,110,117,77, -97,105,110,40,41,59,255,255,76,2,0,0,104,101,97,108,116,104,46,105,109,103,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,48,48,194,0,255,255,224,249,255,255,59,255,0,0,0,0,0,0,0,0,0,0,0,0, +225,0,0,0,119,101,108,99,111,109,101,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,119,101,108,99,111,109,101,34,44,34,110,97,109,101,34,58,34,87,101,108,99,111,109,101,34, +44,34,115,114,99,34,58,34,119,101,108,99,111,109,101,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34, +119,101,108,99,111,109,101,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,52,34,44,34,116, +97,103,115,34,58,34,115,116,97,114,116,44,119,101,108,99,111,109,101,34,44,34,102,105,108,101,115,34,58,34,119,101, +108,99,111,109,101,46,105,110,102,111,44,119,101,108,99,111,109,101,46,98,111,111,116,46,106,115,44,119,101,108,99,111, +109,101,46,97,112,112,46,106,115,44,119,101,108,99,111,109,101,46,115,101,116,116,105,110,103,115,46,106,115,44,119,101, +108,99,111,109,101,46,105,109,103,34,44,34,100,97,116,97,34,58,34,119,101,108,99,111,109,101,46,106,115,111,110,34, +125,255,255,255,119,56,0,0,115,101,116,116,105,110,103,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108, +115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101, +100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184, +68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101, +118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63, +49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101, +114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116, +68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93, +59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61, +48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40, +105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100, +41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100, +111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115, +46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114, +101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45, +48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108, +105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98, +98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58, +109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116, +101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40, +34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115, +46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41, +42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40, +48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114, +101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104, +46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,66,97,110, +103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105, +100,103,101,116,115,40,41,59,10,174,66,65,78,71,76,69,74,83,50,61,112,114,111,99,101,115,115,46,101,110,118,46, +72,87,86,69,82,83,73,79,78,138,50,59,10,174,115,116,111,114,97,103,101,61,114,101,113,117,105,114,101,40,39,83, +116,111,114,97,103,101,39,41,59,10,173,115,101,116,116,105,110,103,115,59,10,170,117,112,100,97,116,101,83,101,116,116, +105,110,103,115,40,41,123,115,116,111,114,97,103,101,46,119,114,105,116,101,40,39,115,101,116,116,105,110,103,46,106,115, +111,110,39,44,115,101,116,116,105,110,103,115,41,59,125,10,170,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41, +123,172,111,61,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,59,163,40,66,65,78,71,76,69,74,83,50, +41,123,163,40,33,40,111,46,119,97,107,101,79,110,66,84,78,49,160,111,46,119,97,107,101,79,110,70,97,99,101,85, +112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107,101,79,110,84,119,105,115,116,41,41,123, +111,46,119,97,107,101,79,110,66,84,78,49,61,180,59,125,125,164,123,163,40,33,40,111,46,119,97,107,101,79,110,66, +84,78,49,160,111,46,119,97,107,101,79,110,66,84,78,50,160,111,46,119,97,107,101,79,110,66,84,78,51,160,111,46, +119,97,107,101,79,110,70,97,99,101,85,112,160,111,46,119,97,107,101,79,110,84,111,117,99,104,160,111,46,119,97,107, +101,79,110,84,119,105,115,116,41,41,111,46,119,97,107,101,79,110,66,84,78,50,61,180,59,125,117,112,100,97,116,101, +83,101,116,116,105,110,103,115,40,41,59,66,97,110,103,108,101,46,115,101,116,79,112,116,105,111,110,115,40,111,41,125, +10,170,103,84,111,73,110,116,101,114,110,97,108,40,103,41,123,171,103,42,56,49,57,50,59,125,10,170,105,110,116,101, +114,110,97,108,84,111,71,40,117,41,123,171,117,47,56,49,57,50,125,10,170,114,101,115,101,116,83,101,116,116,105,110, +103,115,40,41,123,115,101,116,116,105,110,103,115,61,123,98,108,101,58,180,44,98,108,101,114,101,112,108,58,180,44,108, +111,103,58,181,44,113,117,105,101,116,58,48,44,116,105,109,101,111,117,116,58,49,48,44,118,105,98,114,97,116,101,58, +180,44,98,101,101,112,58,66,65,78,71,76,69,74,83,50,63,180,58,34,118,105,98,34,44,116,105,109,101,122,111,110, +101,58,48,44,72,73,68,58,181,44,99,108,111,99,107,58,182,44,34,49,50,104,111,117,114,34,58,181,44,102,105,114, +115,116,68,97,121,79,102,87,101,101,107,58,48,44,98,114,105,103,104,116,110,101,115,115,58,49,44,111,112,116,105,111, +110,115,58,123,119,97,107,101,79,110,66,84,78,49,58,180,44,119,97,107,101,79,110,66,84,78,50,58,180,44,119,97, +107,101,79,110,66,84,78,51,58,180,44,119,97,107,101,79,110,70,97,99,101,85,112,58,181,44,119,97,107,101,79,110, +84,111,117,99,104,58,181,44,119,97,107,101,79,110,84,119,105,115,116,58,180,44,116,119,105,115,116,84,104,114,101,115, +104,111,108,100,58,56,49,57,46,50,44,116,119,105,115,116,77,97,120,89,58,45,56,48,48,44,116,119,105,115,116,84, +105,109,101,111,117,116,58,49,48,48,48,125,44,125,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +125,10,115,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,39,115,101,116, +116,105,110,103,46,106,115,111,110,39,44,49,41,59,10,163,40,33,115,101,116,116,105,110,103,115,41,114,101,115,101,116, +83,101,116,116,105,110,103,115,40,41,59,10,174,98,111,111,108,70,111,114,109,97,116,61,118,162,118,63,34,79,110,34, +58,34,79,102,102,34,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110, +117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,116,116,105,110,103,115,39,125,44,39,60,32,66,97, +99,107,39,58,40,41,162,108,111,97,100,40,41,44,39,65,112,112,115,39,58,40,41,162,115,104,111,119,65,112,112,83, +101,116,116,105,110,103,115,77,101,110,117,40,41,44,39,83,121,115,116,101,109,39,58,40,41,162,115,104,111,119,83,121, +115,116,101,109,77,101,110,117,40,41,44,39,66,108,117,101,116,111,111,116,104,39,58,40,41,162,115,104,111,119,66,76, +69,77,101,110,117,40,41,44,39,65,108,101,114,116,115,39,58,40,41,162,115,104,111,119,65,108,101,114,116,115,77,101, +110,117,40,41,44,39,85,116,105,108,115,39,58,40,41,162,115,104,111,119,85,116,105,108,77,101,110,117,40,41,125,59, +171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,83,121,115, +116,101,109,77,101,110,117,40,41,123,174,109,97,105,110,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39, +58,39,83,121,115,116,101,109,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77, +101,110,117,40,41,44,39,84,104,101,109,101,39,58,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110,117,40,41, +44,39,76,67,68,39,58,40,41,162,115,104,111,119,76,67,68,77,101,110,117,40,41,44,39,76,111,99,97,108,101,39, +58,40,41,162,115,104,111,119,76,111,99,97,108,101,77,101,110,117,40,41,44,39,83,101,108,101,99,116,32,67,108,111, +99,107,39,58,40,41,162,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,44,39,68,97,116,101,32,38,32,84, +105,109,101,39,58,40,41,162,115,104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,125,59,171,69,46,115,104, +111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104,111,119,65,108,101,114,116,115,77,101, +110,117,40,41,123,172,98,101,101,112,77,101,110,117,73,116,101,109,59,163,40,66,65,78,71,76,69,74,83,50,41,123, +98,101,101,112,77,101,110,117,73,116,101,109,61,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,101,101, +112,140,181,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115, +40,41,59,163,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,123,97,110,97,108,111,103,87,114,105,116,101,40, +86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, +111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,125,125,59, +125,164,123,172,98,101,101,112,86,61,91,181,44,180,44,34,118,105,98,34,93,59,172,98,101,101,112,78,61,91,34,79, +102,102,34,44,34,80,105,101,122,111,34,44,34,86,105,98,114,97,116,101,34,93,59,98,101,101,112,77,101,110,117,73, +116,101,109,61,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,124,98,101,101,112,86,46,105,110,100,101, +120,79,102,40,115,101,116,116,105,110,103,115,46,98,101,101,112,41,44,48,41,44,109,105,110,58,48,44,109,97,120,58, +98,101,101,112,86,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,98,101,101,112,78,91,118,93, +44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,101,101,112,61,98,101,101,112,86, +91,118,93,59,163,40,118,138,49,41,123,97,110,97,108,111,103,87,114,105,116,101,40,68,49,56,44,48,46,53,44,123, +102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,68,49,56,46,114,101, +115,101,116,40,41,44,50,48,48,41,59,125,164,163,40,118,138,50,41,123,97,110,97,108,111,103,87,114,105,116,101,40, +86,73,66,82,65,84,69,44,48,46,49,44,123,102,114,101,113,58,50,48,48,48,125,41,59,115,101,116,84,105,109,101, +111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,114,101,115,101,116,40,41,44,50,48,48,41,59,125,117,112,100, +97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125,174,109,97,105,110,109,101,110,117,61,123,39,39,58, +123,39,116,105,116,108,101,39,58,39,65,108,101,114,116,115,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115, +104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,66,101,101,112,39,58,98,101,101,112,77,101,110,117,73,116,101, +109,44,39,86,105,98,114,97,116,105,111,110,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,118,105, +98,114,97,116,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, +58,40,41,162,123,115,101,116,116,105,110,103,115,46,118,105,98,114,97,116,101,61,33,115,101,116,116,105,110,103,115,46, +118,105,98,114,97,116,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,163,40,115,101,116,116,105, +110,103,115,46,118,105,98,114,97,116,101,41,123,86,73,66,82,65,84,69,46,119,114,105,116,101,40,49,41,59,115,101, +116,84,105,109,101,111,117,116,40,40,41,162,86,73,66,82,65,84,69,46,119,114,105,116,101,40,48,41,44,49,48,41, +59,125,125,125,44,34,81,117,105,101,116,32,77,111,100,101,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, +115,46,113,117,105,101,116,124,48,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,65,108,97,114,109, +115,34,44,34,83,105,108,101,110,116,34,93,91,118,37,51,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, +116,116,105,110,103,115,46,113,117,105,101,116,61,118,37,51,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40, +41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,163,40,34,113,109,115,99,104,101,100,34,185,87,73, +68,71,69,84,83,41,87,73,68,71,69,84,83,91,34,113,109,115,99,104,101,100,34,93,46,100,114,97,119,40,41,59, +125,44,125,125,59,171,69,46,115,104,111,119,77,101,110,117,40,109,97,105,110,109,101,110,117,41,59,125,10,170,115,104, +111,119,66,76,69,77,101,110,117,40,41,123,172,104,105,100,86,61,91,181,44,34,107,98,109,101,100,105,97,34,44,34, +107,98,34,44,34,99,111,109,34,44,34,106,111,121,34,93,59,172,104,105,100,78,61,91,34,79,102,102,34,44,34,75, +98,114,100,32,38,32,77,101,100,105,97,34,44,34,75,98,114,100,34,44,34,75,98,114,100,32,38,32,77,111,117,115, +101,34,44,34,74,111,121,115,116,105,99,107,34,93,59,69,46,115,104,111,119,77,101,110,117,40,123,39,39,58,123,39, +116,105,116,108,101,39,58,39,66,108,117,101,116,111,111,116,104,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162, +115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,77,97,107,101,32,67,111,110,110,101,99,116,97,98,108,101, +39,58,40,41,162,109,97,107,101,67,111,110,110,101,99,116,97,98,108,101,40,41,44,39,66,76,69,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,108,101,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109, +97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,61,33,115,101, +116,116,105,110,103,115,46,98,108,101,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39, +80,114,111,103,114,97,109,109,97,98,108,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,98,108, +101,114,101,112,108,44,102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101, +58,40,41,162,123,115,101,116,116,105,110,103,115,46,98,108,101,114,101,112,108,61,33,115,101,116,116,105,110,103,115,46, +98,108,101,114,101,112,108,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,72,73,68, +39,58,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,48,124,104,105,100,86,46,105,110,100,101,120, +79,102,40,115,101,116,116,105,110,103,115,46,72,73,68,41,41,44,109,105,110,58,48,44,109,97,120,58,104,105,100,78, +46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,104,105,100,78,91,118,93,44,111,110,99,104,97, +110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,72,73,68,61,104,105,100,86,91,118,93,59,117,112,100,97, +116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,80,97,115,115,107,101,121,32,66,69,84,65,39,58,123, +118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,63,115,101,116,116,105,110,103,115,46, +112,97,115,115,107,101,121,58,34,110,111,110,101,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105, +109,101,111,117,116,40,115,104,111,119,80,97,115,115,107,101,121,77,101,110,117,41,125,44,39,87,104,105,116,101,108,105, +115,116,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,63,40,115, +101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,108,101,110,103,116,104,43,34,32,100,101,118,115,34, +41,58,34,111,102,102,34,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115, +104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,41,125,125,41,59,125,10,170,115,104,111,119,84,104,101,109, +101,77,101,110,117,40,41,123,170,99,108,40,120,41,123,171,103,46,115,101,116,67,111,108,111,114,40,120,41,46,103,101, +116,67,111,108,111,114,40,41,59,125,170,117,112,100,40,116,104,41,123,103,46,116,104,101,109,101,61,116,104,59,115,101, +116,116,105,110,103,115,46,116,104,101,109,101,61,116,104,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41, +59,190,103,46,114,101,115,101,116,59,103,46,95,114,101,115,101,116,61,103,46,114,101,115,101,116,59,103,46,114,101,115, +101,116,61,170,40,110,41,123,171,103,46,95,114,101,115,101,116,40,41,46,115,101,116,67,111,108,111,114,40,116,104,46, +102,103,41,46,115,101,116,66,103,67,111,108,111,114,40,116,104,46,98,103,41,59,125,59,103,46,99,108,101,97,114,61, +170,40,110,41,123,163,40,110,41,103,46,114,101,115,101,116,40,41,59,171,103,46,99,108,101,97,114,82,101,99,116,40, +48,44,48,44,103,46,103,101,116,87,105,100,116,104,40,41,44,103,46,103,101,116,72,101,105,103,104,116,40,41,41,59, +125,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40, +41,59,109,46,100,114,97,119,40,41,59,125,172,116,104,101,109,101,115,77,101,110,117,61,123,39,39,58,123,116,105,116, +108,101,58,39,84,104,101,109,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116, +101,109,77,101,110,117,40,41,44,39,68,97,114,107,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99, +108,40,34,35,102,102,102,34,41,44,98,103,58,99,108,40,34,35,48,48,48,34,41,44,102,103,50,58,99,108,40,34, +35,102,102,102,34,41,44,98,103,50,58,99,108,40,34,35,48,48,52,34,41,44,102,103,72,58,99,108,40,34,35,102, +102,102,34,41,44,98,103,72,58,99,108,40,34,35,48,48,102,34,41,44,100,97,114,107,58,180,125,41,59,125,44,39, +76,105,103,104,116,32,66,87,39,58,40,41,162,123,117,112,100,40,123,102,103,58,99,108,40,34,35,48,48,48,34,41, +44,98,103,58,99,108,40,34,35,102,102,102,34,41,44,102,103,50,58,99,108,40,34,35,48,48,48,34,41,44,98,103, +50,58,99,108,40,34,35,99,102,102,34,41,44,102,103,72,58,99,108,40,34,35,48,48,48,34,41,44,98,103,72,58, +99,108,40,34,35,48,102,102,34,41,44,100,97,114,107,58,181,125,41,59,125,125,59,114,101,113,117,105,114,101,40,34, +83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,94,46,42,92,46,116,104,101,109,101,36,47,41,46,102,111, +114,69,97,99,104,40,110,162,123,173,110,101,119,84,104,101,109,101,61,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,110,41,59,116,104,101,109,101,115,77,101,110,117,91,110,101,119, +84,104,101,109,101,46,110,97,109,101,63,110,101,119,84,104,101,109,101,46,110,97,109,101,58,110,93,61,40,41,162,123, +117,112,100,40,123,102,103,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,41,44,98,103,58,99,108,40,110,101, +119,84,104,101,109,101,46,98,103,41,44,102,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,102,103,50,41,44, +98,103,50,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,50,41,44,102,103,72,58,99,108,40,110,101,119,84, +104,101,109,101,46,102,103,72,41,44,98,103,72,58,99,108,40,110,101,119,84,104,101,109,101,46,98,103,72,41,44,100, +97,114,107,58,110,101,119,84,104,101,109,101,46,100,97,114,107,125,41,59,125,59,125,41,59,116,104,101,109,101,115,77, +101,110,117,91,39,67,117,115,116,111,109,105,122,101,39,93,61,40,41,162,115,104,111,119,67,117,115,116,111,109,84,104, +101,109,101,77,101,110,117,40,41,59,172,109,61,69,46,115,104,111,119,77,101,110,117,40,116,104,101,109,101,115,77,101, +110,117,41,59,170,115,104,111,119,67,117,115,116,111,109,84,104,101,109,101,77,101,110,117,40,41,123,170,115,101,116,84, +40,116,44,118,41,123,173,116,104,61,103,46,116,104,101,109,101,59,116,104,91,116,93,61,118,59,163,40,116,139,34,98, +103,34,41,123,116,104,91,39,100,97,114,107,39,93,61,40,118,139,99,108,40,34,35,48,48,48,34,41,41,59,125,117, +112,100,40,116,104,41,59,125,173,114,103,98,61,123,125,59,114,103,98,91,39,98,108,97,99,107,39,93,61,34,35,48, +48,48,34,59,114,103,98,91,39,119,104,105,116,101,39,93,61,34,35,102,102,102,34,59,114,103,98,91,39,114,101,100, +39,93,61,34,35,102,48,48,34,59,114,103,98,91,39,103,114,101,101,110,39,93,61,34,35,48,102,48,34,59,114,103, +98,91,39,98,108,117,101,39,93,61,34,35,48,48,102,34,59,114,103,98,91,39,99,121,97,110,39,93,61,34,35,48, +102,102,34,59,114,103,98,91,39,109,97,103,101,110,116,97,39,93,61,34,35,102,48,102,34,59,114,103,98,91,39,121, +101,108,108,111,119,39,93,61,34,35,102,102,48,34,59,163,40,33,66,65,78,71,76,69,74,83,50,41,123,114,103,98, +91,39,111,114,97,110,103,101,39,93,61,34,35,102,102,55,102,48,48,34,59,114,103,98,91,39,112,117,114,112,108,101, +39,93,61,34,35,55,102,48,48,102,102,34,59,114,103,98,91,39,103,114,101,121,39,93,61,34,35,55,102,55,102,55, +102,34,59,125,173,99,111,108,111,114,115,61,91,93,44,110,97,109,101,115,61,91,93,59,167,40,174,99,185,114,103,98, +41,123,110,97,109,101,115,46,112,117,115,104,40,99,41,59,99,111,108,111,114,115,46,112,117,115,104,40,99,108,40,114, +103,98,91,99,93,41,41,59,125,173,109,101,110,117,61,123,39,39,58,123,116,105,116,108,101,58,39,67,117,115,116,111, +109,32,84,104,101,109,101,39,125,44,34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,84,104,101,109,101,77, +101,110,117,40,41,125,59,174,108,97,98,101,108,115,61,123,102,103,58,39,70,111,114,101,103,114,111,117,110,100,39,44, +98,103,58,39,66,97,99,107,103,114,111,117,110,100,39,44,102,103,50,58,39,70,111,114,101,103,114,111,117,110,100,32, +50,39,44,98,103,50,58,39,66,97,99,107,103,114,111,117,110,100,32,50,39,44,102,103,72,58,39,72,105,103,104,108, +105,103,104,116,32,70,71,39,44,98,103,72,58,39,72,105,103,104,108,105,103,104,116,32,66,71,39,44,125,59,91,34, +102,103,34,44,34,98,103,34,44,34,102,103,50,34,44,34,98,103,50,34,44,34,102,103,72,34,44,34,98,103,72,34, +93,46,102,111,114,69,97,99,104,40,116,162,123,109,101,110,117,91,108,97,98,101,108,115,91,116,93,93,61,123,109,105, +110,58,48,44,109,97,120,58,99,111,108,111,114,115,46,108,101,110,103,116,104,45,49,44,119,114,97,112,58,180,44,118, +97,108,117,101,58,77,97,116,104,46,109,97,120,40,99,111,108,111,114,115,46,105,110,100,101,120,79,102,40,103,46,116, +104,101,109,101,91,116,93,41,44,48,41,44,102,111,114,109,97,116,58,118,162,110,97,109,101,115,91,118,93,44,111,110, +99,104,97,110,103,101,58,170,40,118,41,123,172,99,61,99,111,108,111,114,115,91,118,93,59,163,40,116,139,39,102,103, +39,158,103,46,116,104,101,109,101,46,98,103,139,99,41,115,101,116,84,40,39,98,103,39,44,103,46,116,104,101,109,101, +46,102,103,41,59,163,40,116,139,39,98,103,39,158,103,46,116,104,101,109,101,46,102,103,139,99,41,115,101,116,84,40, +39,102,103,39,44,103,46,116,104,101,109,101,46,98,103,41,59,115,101,116,84,40,116,44,99,41,59,125,44,125,59,125, +41,59,109,101,110,117,91,34,60,32,66,97,99,107,34,93,61,40,41,162,115,104,111,119,84,104,101,109,101,77,101,110, +117,40,41,59,109,61,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,125,125,10,170,115,104,111,119,80, +97,115,115,107,101,121,77,101,110,117,40,41,123,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40,41,162, +115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101,116,116, +105,110,103,115,46,112,97,115,115,107,101,121,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,163,40,33,115,101,116,116,105,110,103,115,46,112,97,115, +115,107,101,121,160,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,108,101,110,103,116,104,140,54,41,123, +115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61,34,49,50,51,52,53,54,34,59,117,112,100,97,116,101, +83,101,116,116,105,110,103,115,40,41,59,125,167,40,172,105,61,48,59,105,60,54,59,105,152,41,40,170,40,105,41,123, +109,101,110,117,91,96,68,105,103,105,116,32,36,123,105,43,49,125,96,93,61,123,118,97,108,117,101,58,48,124,115,101, +116,116,105,110,103,115,46,112,97,115,115,107,101,121,91,105,93,44,109,105,110,58,48,44,109,97,120,58,57,44,111,110, +99,104,97,110,103,101,58,118,162,123,172,112,61,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,46,115,112, +108,105,116,40,34,34,41,59,112,91,105,93,61,118,59,115,101,116,116,105,110,103,115,46,112,97,115,115,107,101,121,61, +112,46,106,111,105,110,40,34,34,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,59,125, +41,40,105,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,87,104, +105,116,101,108,105,115,116,77,101,110,117,40,41,123,10,172,109,101,110,117,61,123,34,60,32,66,97,99,107,34,58,40, +41,162,115,104,111,119,66,76,69,77,101,110,117,40,41,44,34,68,105,115,97,98,108,101,34,58,40,41,162,123,115,101, +116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,61,183,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,115,104,111,119,66,76,69,77,101,110,117,40,41,59,125,125,59,10,163,40,115,101,116,116,105,110,103,115, +46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,102,111, +114,69,97,99,104,40,170,40,100,41,123,109,101,110,117,91,100,46,115,117,98,115,116,114,40,48,44,49,55,41,93,61, +170,40,41,123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,109,111,118,101,92,110,39,43,100,41,46,116, +104,101,110,40,40,118,41,162,123,163,40,118,41,123,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, +46,115,112,108,105,99,101,40,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,105,110,100,101,120, +79,102,40,100,41,44,49,41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,115,101,116,84,105, +109,101,111,117,116,40,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,44,53,48,41,59,125,41,59,125, +125,41,59,10,109,101,110,117,91,39,65,100,100,32,68,101,118,105,99,101,39,93,61,170,40,41,123,69,46,115,104,111, +119,65,108,101,114,116,40,34,67,111,110,110,101,99,116,32,100,101,118,105,99,101,92,110,116,111,32,97,100,100,32,116, +111,92,110,119,104,105,116,101,108,105,115,116,34,44,34,87,104,105,116,101,108,105,115,116,34,41,46,116,104,101,110,40, +170,40,41,123,78,82,70,46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110, +101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105,115,116,77,101,110,117,40,41,59,125,41,59,78,82,70, +46,114,101,109,111,118,101,65,108,108,76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,78, +82,70,46,111,110,40,39,99,111,110,110,101,99,116,39,44,170,40,97,100,100,114,41,123,163,40,33,115,101,116,116,105, +110,103,115,46,119,104,105,116,101,108,105,115,116,41,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116, +61,91,93,59,115,101,116,116,105,110,103,115,46,119,104,105,116,101,108,105,115,116,46,112,117,115,104,40,97,100,100,114, +41,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,78,82,70,46,114,101,109,111,118,101,65,108,108, +76,105,115,116,101,110,101,114,115,40,39,99,111,110,110,101,99,116,39,41,59,115,104,111,119,87,104,105,116,101,108,105, +115,116,77,101,110,117,40,41,59,125,41,59,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59, +10,125,170,115,104,111,119,76,67,68,77,101,110,117,40,41,123,10,174,108,99,100,77,101,110,117,61,123,39,39,58,123, +39,116,105,116,108,101,39,58,39,76,67,68,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83, +121,115,116,101,109,77,101,110,117,40,41,44,39,76,67,68,32,66,114,105,103,104,116,110,101,115,115,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,44,109,105,110,58,48,46,49,44, +109,97,120,58,49,44,115,116,101,112,58,48,46,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,46,98,114,105,103,104,116,110,101,115,115,61,118,160,49,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,66,114,105,103,104,116,110,101,115,115,40,115,101,116,116, +105,110,103,115,46,98,114,105,103,104,116,110,101,115,115,41,59,125,125,44,39,76,67,68,32,84,105,109,101,111,117,116, +39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,116,105,109,101,111,117,116,44,109,105,110,58,48,44, +109,97,120,58,54,48,44,115,116,101,112,58,53,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, +103,115,46,116,105,109,101,111,117,116,61,48,124,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59, +66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109,101,111,117,116,40,115,101,116,116,105,110,103,115,46,116,105, +109,101,111,117,116,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,49,39,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,44,102,111,114,109, +97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, +110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,61,33,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,49,59,117,112,100,97,116,101,79,112,116,105,111,110, +115,40,41,59,125,125,125,59,10,163,40,33,66,65,78,71,76,69,74,83,50,41,10,79,98,106,101,99,116,46,97,115, +115,105,103,110,40,108,99,100,77,101,110,117,44,123,39,87,97,107,101,32,111,110,32,66,84,78,50,39,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,44, +102,111,114,109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115, +101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,61,33,115,101,116,116, +105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,50,59,117,112,100,97,116,101,79,112, +116,105,111,110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,66,84,78,51,39,58,123,118,97,108,117,101, +58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,44,102,111,114, +109,97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116, +105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,61,33,115,101,116,116,105,110,103, +115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,66,84,78,51,59,117,112,100,97,116,101,79,112,116,105,111, +110,115,40,41,59,125,125,125,41,59,10,79,98,106,101,99,116,46,97,115,115,105,103,110,40,108,99,100,77,101,110,117, +44,123,39,87,97,107,101,32,111,110,32,70,97,99,101,85,112,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110, +103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,44,102,111,114,109,97,116,58,98, +111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110,103,115,46, +111,112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,61,33,115,101,116,116,105,110,103,115,46,111, +112,116,105,111,110,115,46,119,97,107,101,79,110,70,97,99,101,85,112,59,117,112,100,97,116,101,79,112,116,105,111,110, +115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,111,117,99,104,39,58,123,118,97,108,117,101,58,115,101, +116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,44,102,111,114,109,97, +116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105,110, +103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,61,33,115,101,116,116,105,110,103,115, +46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,111,117,99,104,59,117,112,100,97,116,101,79,112,116,105,111, +110,115,40,41,59,125,125,44,39,87,97,107,101,32,111,110,32,84,119,105,115,116,39,58,123,118,97,108,117,101,58,115, +101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,44,102,111,114,109, +97,116,58,98,111,111,108,70,111,114,109,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,123,115,101,116,116,105, +110,103,115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,61,33,115,101,116,116,105,110,103, +115,46,111,112,116,105,111,110,115,46,119,97,107,101,79,110,84,119,105,115,116,59,117,112,100,97,116,101,79,112,116,105, +111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,104,114,101,115,104,111,108,100,39,58,123,118,97,108,117, +101,58,105,110,116,101,114,110,97,108,84,111,71,40,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116, +119,105,115,116,84,104,114,101,115,104,111,108,100,41,44,109,105,110,58,45,48,46,53,44,109,97,120,58,48,46,53,44, +115,116,101,112,58,48,46,48,49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111, +112,116,105,111,110,115,46,116,119,105,115,116,84,104,114,101,115,104,111,108,100,61,103,84,111,73,110,116,101,114,110,97, +108,40,118,160,48,46,49,41,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,44,39,84,119,105, +115,116,32,77,97,120,32,89,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110, +115,46,116,119,105,115,116,77,97,120,89,44,109,105,110,58,45,49,53,48,48,44,109,97,120,58,49,53,48,48,44,115, +116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,111,112,116, +105,111,110,115,46,116,119,105,115,116,77,97,120,89,61,118,160,45,56,48,48,59,117,112,100,97,116,101,79,112,116,105, +111,110,115,40,41,59,125,125,44,39,84,119,105,115,116,32,84,105,109,101,111,117,116,39,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,44,109,105, +110,58,48,44,109,97,120,58,50,48,48,48,44,115,116,101,112,58,49,48,48,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,111,112,116,105,111,110,115,46,116,119,105,115,116,84,105,109,101,111,117,116,61, +118,160,49,48,48,48,59,117,112,100,97,116,101,79,112,116,105,111,110,115,40,41,59,125,125,125,41,59,10,171,69,46, +115,104,111,119,77,101,110,117,40,108,99,100,77,101,110,117,41,10,125,170,115,104,111,119,76,111,99,97,108,101,77,101, +110,117,40,41,123,10,174,108,111,99,97,108,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39, +76,111,99,97,108,101,39,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77, +101,110,117,40,41,44,39,84,105,109,101,32,90,111,110,101,39,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103, +115,46,116,105,109,101,122,111,110,101,44,102,111,114,109,97,116,58,118,162,40,118,62,48,63,34,43,34,58,34,34,41, +43,118,44,109,105,110,58,45,49,49,44,109,97,120,58,49,51,44,115,116,101,112,58,48,46,53,44,111,110,99,104,97, +110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,116,105,109,101,122,111,110,101,61,118,160,48,59,117,112,100, +97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,84,105,109,101,32,70,111,114,109,97,116,39,58,123, +118,97,108,117,101,58,33,33,115,101,116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,44,102,111,114,109,97, +116,58,118,162,118,63,34,49,50,104,34,58,34,50,52,104,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101, +116,116,105,110,103,115,91,34,49,50,104,111,117,114,34,93,61,118,59,117,112,100,97,116,101,83,101,116,116,105,110,103, +115,40,41,59,125,125,44,39,83,116,97,114,116,32,87,101,101,107,32,79,110,39,58,123,118,97,108,117,101,58,115,101, +116,116,105,110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,160,48,44,109,105,110,58,48, +44,109,97,120,58,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116, +105,108,115,34,41,46,100,111,119,40,118,44,49,41,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105, +110,103,115,91,34,102,105,114,115,116,68,97,121,79,102,87,101,101,107,34,93,61,118,59,117,112,100,97,116,101,83,101, +116,116,105,110,103,115,40,41,59,125,44,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,108,111,99,97,108, +101,109,101,110,117,41,59,10,125,170,115,104,111,119,85,116,105,108,77,101,110,117,40,41,123,10,172,109,101,110,117,61, +123,39,39,58,123,39,116,105,116,108,101,39,58,39,85,116,105,108,105,116,105,101,115,39,125,44,39,60,32,66,97,99, +107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,39,68,101,98,117,103,32,73,110,102,111, +39,58,123,118,97,108,117,101,58,69,46,99,108,105,112,40,48,124,115,101,116,116,105,110,103,115,46,108,111,103,44,48, +44,50,41,44,109,105,110,58,48,44,109,97,120,58,50,44,102,111,114,109,97,116,58,118,162,91,34,72,105,100,101,34, +44,34,83,104,111,119,34,44,34,76,111,103,34,93,91,69,46,99,108,105,112,40,48,124,118,44,48,44,50,41,93,44, +111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,108,111,103,61,118,59,117,112,100,97,116, +101,83,101,116,116,105,110,103,115,40,41,59,125,125,44,39,67,111,109,112,97,99,116,32,83,116,111,114,97,103,101,39, +58,40,41,162,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,67,111,109,112,97,99,116,105,110,103,46,46, +46,92,110,84,97,107,101,115,32,97,112,112,114,111,120,92,110,49,32,109,105,110,117,116,101,34,44,123,116,105,116,108, +101,58,34,83,116,111,114,97,103,101,34,125,41,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, +46,99,111,109,112,97,99,116,40,41,59,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,44,39,82,101,119, +114,105,116,101,32,83,101,116,116,105,110,103,115,39,58,40,41,162,123,114,101,113,117,105,114,101,40,34,83,116,111,114, +97,103,101,34,41,46,119,114,105,116,101,40,34,46,98,111,111,116,48,34,44,34,101,118,97,108,40,114,101,113,117,105, +114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,40,39,98,111,111,116,117,112,100,97,116,101,46,106, +115,39,41,41,59,34,41,59,108,111,97,100,40,34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,41,59,125, +44,39,70,108,97,116,116,101,110,32,66,97,116,116,101,114,121,39,58,40,41,162,123,69,46,115,104,111,119,77,101,115, +115,97,103,101,40,39,70,108,97,116,116,101,110,105,110,103,32,98,97,116,116,101,114,121,32,45,32,116,104,105,115,32, +99,97,110,32,116,97,107,101,32,104,111,117,114,115,46,92,110,76,111,110,103,45,112,114,101,115,115,32,98,117,116,116, +111,110,32,116,111,32,99,97,110,99,101,108,46,39,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,84,105,109, +101,111,117,116,40,48,41,59,66,97,110,103,108,101,46,115,101,116,76,67,68,80,111,119,101,114,40,49,41,59,163,40, +66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83, +80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103,108,101,46,115,101,116,72,82,77,80, +111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,102,108,97,116,34, +41,59,163,40,66,97,110,103,108,101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,41,66,97,110,103,108, +101,46,115,101,116,67,111,109,112,97,115,115,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97, +110,103,108,101,46,115,101,116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101, +116,66,97,114,111,109,101,116,101,114,80,111,119,101,114,40,49,44,34,102,108,97,116,34,41,59,163,40,66,97,110,103, +108,101,46,115,101,116,72,82,77,80,111,119,101,114,41,66,97,110,103,108,101,46,115,101,116,71,80,83,80,111,119,101, +114,40,49,44,34,102,108,97,116,34,41,59,115,101,116,73,110,116,101,114,118,97,108,40,170,40,41,123,172,105,61,49, +48,48,48,59,166,40,105,153,41,59,125,44,49,41,59,125,125,59,10,163,40,66,65,78,71,76,69,74,83,50,41,10, +109,101,110,117,91,39,67,97,108,105,98,114,97,116,101,32,66,97,116,116,101,114,121,39,93,61,40,41,162,123,69,46, +115,104,111,119,80,114,111,109,112,116,40,34,73,115,32,116,104,101,32,98,97,116,116,101,114,121,32,102,117,108,108,121, +32,99,104,97,114,103,101,100,63,34,44,123,116,105,116,108,101,58,34,67,97,108,105,98,114,97,116,101,34,125,41,46, +116,104,101,110,40,111,107,162,123,163,40,111,107,41,123,172,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97, +103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,41,59,115,46, +98,97,116,70,117,108,108,86,111,108,116,97,103,101,61,40,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97, +110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97,108,111,103,82,101,97,100,40,68,51,41,43,97,110,97, +108,111,103,82,101,97,100,40,68,51,41,41,47,52,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34, +41,46,119,114,105,116,101,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,115,41,59,69,46, +115,104,111,119,65,108,101,114,116,40,34,67,97,108,105,98,114,97,116,101,100,33,34,41,46,116,104,101,110,40,40,41, +162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125,164,123,69,46,115, +104,111,119,65,108,101,114,116,40,34,80,108,101,97,115,101,32,99,104,97,114,103,101,32,66,97,110,103,108,101,46,106, +115,32,102,111,114,32,51,32,104,111,117,114,115,32,97,110,100,32,116,114,121,32,97,103,97,105,110,34,41,46,116,104, +101,110,40,40,41,162,108,111,97,100,40,34,115,101,116,116,105,110,103,115,46,97,112,112,46,106,115,34,41,41,59,125, +125,41,59,125,59,10,109,101,110,117,91,39,82,101,115,101,116,32,83,101,116,116,105,110,103,115,39,93,61,40,41,162, +123,69,46,115,104,111,119,80,114,111,109,112,116,40,39,82,101,115,101,116,32,116,111,32,68,101,102,97,117,108,116,115, +63,39,44,123,116,105,116,108,101,58,34,83,101,116,116,105,110,103,115,34,125,41,46,116,104,101,110,40,40,118,41,162, +123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,39,82,101,115,101,116,116,105,110,103,39,41, +59,114,101,115,101,116,83,101,116,116,105,110,103,115,40,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, +77,97,105,110,77,101,110,117,44,53,48,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41, +59,125,59,10,109,101,110,117,91,34,84,117,114,110,32,79,102,102,34,93,61,40,41,162,123,69,46,115,104,111,119,80, +114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,32,65,108,97,114,109,115,32,97,110,100,32, +116,105,109,101,114,115,32,119,111,110,39,116,32,102,105,114,101,34,44,123,116,105,116,108,101,58,34,84,117,114,110,32, +79,102,102,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,101,100,41,162,123,163,40,99,111,110,102,105, +114,109,101,100,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,83,101,101,32,121,111,117,92,110,108,97, +116,101,114,33,34,44,34,71,111,111,100,98,121,101,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,162,123, +69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,103,46,99,108,101,97,114,40,180,41,59,66,97,110,103,108, +101,46,115,111,102,116,79,102,102,63,66,97,110,103,108,101,46,115,111,102,116,79,102,102,40,41,58,66,97,110,103,108, +101,46,111,102,102,40,41,59,125,44,50,53,48,48,41,59,125,164,123,115,104,111,119,85,116,105,108,77,101,110,117,40, +41,59,125,125,41,59,125,59,10,163,40,66,97,110,103,108,101,46,102,97,99,116,111,114,121,82,101,115,101,116,41,123, +109,101,110,117,91,39,70,97,99,116,111,114,121,32,82,101,115,101,116,39,93,61,40,41,162,123,69,46,115,104,111,119, +80,114,111,109,112,116,40,39,84,104,105,115,32,119,105,108,108,32,114,101,109,111,118,101,32,101,118,101,114,121,116,104, +105,110,103,33,39,44,123,116,105,116,108,101,58,34,70,97,99,116,111,114,121,32,82,101,115,101,116,34,125,41,46,116, +104,101,110,40,40,118,41,162,123,163,40,118,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,41,59,84,101, +114,109,105,110,97,108,46,115,101,116,67,111,110,115,111,108,101,40,41,59,66,97,110,103,108,101,46,102,97,99,116,111, +114,121,82,101,115,101,116,40,41,59,125,164,115,104,111,119,85,116,105,108,77,101,110,117,40,41,59,125,41,59,125,125, +10,171,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,109,97,107,101,67,111,110,110,101,99, +116,97,98,108,101,40,41,123,10,177,123,78,82,70,46,119,97,107,101,40,41,59,125,99,97,116,99,104,40,101,41,123, +125,10,66,108,117,101,116,111,111,116,104,46,115,101,116,67,111,110,115,111,108,101,40,49,41,59,10,172,110,97,109,101, +61,34,66,97,110,103,108,101,46,106,115,32,34,43,78,82,70,46,103,101,116,65,100,100,114,101,115,115,40,41,46,115, +117,98,115,116,114,40,45,53,41,46,114,101,112,108,97,99,101,40,34,58,34,44,34,34,41,59,10,69,46,115,104,111, +119,80,114,111,109,112,116,40,110,97,109,101,43,34,92,110,83,116,97,121,32,67,111,110,110,101,99,116,97,98,108,101, +63,34,44,123,116,105,116,108,101,58,34,67,111,110,110,101,99,116,97,98,108,101,34,125,41,46,116,104,101,110,40,114, +162,123,163,40,115,101,116,116,105,110,103,115,46,98,108,101,140,114,41,123,115,101,116,116,105,110,103,115,46,98,108,101, +61,114,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,125,163,40,33,114,41,177,123,78,82,70,46, +115,108,101,101,112,40,41,59,125,99,97,116,99,104,40,101,41,123,125,115,104,111,119,77,97,105,110,77,101,110,117,40, +41,59,125,41,59,10,125,170,115,104,111,119,67,108,111,99,107,77,101,110,117,40,41,123,10,172,99,108,111,99,107,65, +112,112,115,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,108,105,115,116,40,47,92,46,105, +110,102,111,36,47,41,10,46,109,97,112,40,97,112,112,162,123,172,97,61,115,116,111,114,97,103,101,46,114,101,97,100, +74,83,79,78,40,97,112,112,44,49,41,59,171,40,97,158,97,46,116,121,112,101,138,34,99,108,111,99,107,34,41,63, +97,58,183,125,41,10,46,102,105,108,116,101,114,40,97,112,112,162,97,112,112,41,10,46,115,111,114,116,40,40,97,44, +98,41,162,97,46,115,111,114,116,111,114,100,101,114,45,98,46,115,111,114,116,111,114,100,101,114,41,59,10,174,99,108, +111,99,107,77,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,83,101,108,101,99,116,32,67,108,111, +99,107,39,44,125,44,39,60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,83,121,115,116,101,109,77,101,110,117, +40,41,44,125,59,10,99,108,111,99,107,65,112,112,115,46,102,111,114,69,97,99,104,40,40,97,112,112,44,105,110,100, +101,120,41,162,123,172,108,97,98,101,108,61,97,112,112,46,110,97,109,101,59,163,40,40,33,115,101,116,116,105,110,103, +115,46,99,108,111,99,107,158,105,110,100,101,120,139,48,41,160,40,115,101,116,116,105,110,103,115,46,99,108,111,99,107, +139,97,112,112,46,115,114,99,41,41,123,108,97,98,101,108,61,34,42,32,34,43,108,97,98,101,108,59,125,99,108,111, +99,107,77,101,110,117,91,108,97,98,101,108,93,61,40,41,162,123,163,40,115,101,116,116,105,110,103,115,46,99,108,111, +99,107,141,97,112,112,46,115,114,99,41,123,115,101,116,116,105,110,103,115,46,99,108,111,99,107,61,97,112,112,46,115, +114,99,59,117,112,100,97,116,101,83,101,116,116,105,110,103,115,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117, +40,41,59,125,125,59,125,41,59,10,163,40,99,108,111,99,107,65,112,112,115,46,108,101,110,103,116,104,139,48,41,123, +99,108,111,99,107,77,101,110,117,91,34,78,111,32,67,108,111,99,107,115,32,70,111,117,110,100,34,93,61,40,41,162, +123,125,59,125,10,171,69,46,115,104,111,119,77,101,110,117,40,99,108,111,99,107,77,101,110,117,41,59,10,125,170,115, +104,111,119,83,101,116,84,105,109,101,77,101,110,117,40,41,123,10,100,61,184,68,97,116,101,40,41,59,10,174,116,105, +109,101,109,101,110,117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,68,97,116,101,32,38,32,84,105,109,101, +39,125,44,39,60,32,66,97,99,107,39,58,170,40,41,123,115,101,116,84,105,109,101,40,100,46,103,101,116,84,105,109, +101,40,41,47,49,48,48,48,41,59,115,104,111,119,83,121,115,116,101,109,77,101,110,117,40,41,59,125,44,39,68,97, +121,39,58,123,118,97,108,117,101,58,100,46,103,101,116,68,97,116,101,40,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,51,48,41,37,51,49,41,43,49,59,100,46,115,101,116,68, +97,116,101,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,111,110,116,104,39,58,123,118,97,108,117,101,58,100, +46,103,101,116,77,111,110,116,104,40,41,43,49,44,102,111,114,109,97,116,58,118,162,114,101,113,117,105,114,101,40,34, +100,97,116,101,95,117,116,105,108,115,34,41,46,109,111,110,116,104,40,118,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,40,118,43,49,49,41,37,49,50,41,43,49,59,100,46,115,101,116,77, +111,110,116,104,40,175,46,118,97,108,117,101,45,49,41,59,125,125,44,39,89,101,97,114,39,58,123,118,97,108,117,101, +58,100,46,103,101,116,70,117,108,108,89,101,97,114,40,41,44,109,105,110,58,50,48,49,57,44,109,97,120,58,50,49, +48,48,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,100,46,115,101,116,70,117,108,108,89,101,97,114,40,118, +41,59,125,125,44,39,72,111,117,114,39,58,123,118,97,108,117,101,58,100,46,103,101,116,72,111,117,114,115,40,41,44, +111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,50,52,41,37,50,52,59, +100,46,115,101,116,72,111,117,114,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,77,105,110,117,116,101,39,58, +123,118,97,108,117,101,58,100,46,103,101,116,77,105,110,117,116,101,115,40,41,44,111,110,99,104,97,110,103,101,58,170, +40,118,41,123,175,46,118,97,108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,77,105,110,117,116, +101,115,40,175,46,118,97,108,117,101,41,59,125,125,44,39,83,101,99,111,110,100,39,58,123,118,97,108,117,101,58,100, +46,103,101,116,83,101,99,111,110,100,115,40,41,44,111,110,99,104,97,110,103,101,58,170,40,118,41,123,175,46,118,97, +108,117,101,61,40,118,43,54,48,41,37,54,48,59,100,46,115,101,116,83,101,99,111,110,100,115,40,175,46,118,97,108, +117,101,41,59,125,125,125,59,10,171,69,46,115,104,111,119,77,101,110,117,40,116,105,109,101,109,101,110,117,41,59,10, +125,170,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,123,10,173,97,112,112,109,101,110, +117,61,123,39,39,58,123,39,116,105,116,108,101,39,58,39,65,112,112,32,83,101,116,116,105,110,103,115,39,125,44,39, +60,32,66,97,99,107,39,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,125,10,174,97,112,112, +115,61,115,116,111,114,97,103,101,46,108,105,115,116,40,47,92,46,115,101,116,116,105,110,103,115,92,46,106,115,36,47, +41,10,46,109,97,112,40,115,162,115,46,115,117,98,115,116,114,40,48,44,115,46,108,101,110,103,116,104,45,49,50,41, +41,10,46,109,97,112,40,105,100,162,123,174,97,61,115,116,111,114,97,103,101,46,114,101,97,100,74,83,79,78,40,105, +100,43,39,46,105,110,102,111,39,44,49,41,160,123,110,97,109,101,58,105,100,125,59,171,123,105,100,58,105,100,44,110, +97,109,101,58,97,46,110,97,109,101,44,115,111,114,116,111,114,100,101,114,58,97,46,115,111,114,116,111,114,100,101,114, +125,59,125,41,10,46,115,111,114,116,40,40,97,44,98,41,162,123,174,110,61,40,48,124,97,46,115,111,114,116,111,114, +100,101,114,41,45,40,48,124,98,46,115,111,114,116,111,114,100,101,114,41,59,163,40,110,41,171,110,59,163,40,97,46, +110,97,109,101,60,98,46,110,97,109,101,41,171,45,49,59,163,40,97,46,110,97,109,101,62,98,46,110,97,109,101,41, +171,49,59,171,48,59,125,41,10,163,40,97,112,112,115,46,108,101,110,103,116,104,139,48,41,123,97,112,112,109,101,110, +117,91,39,78,111,32,97,112,112,32,104,97,115,32,115,101,116,116,105,110,103,115,39,93,61,40,41,162,123,125,59,125, +10,97,112,112,115,46,102,111,114,69,97,99,104,40,170,40,97,112,112,41,123,97,112,112,109,101,110,117,91,97,112,112, +46,110,97,109,101,93,61,40,41,162,123,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,40,97,112,112,41,125, +59,125,41,10,69,46,115,104,111,119,77,101,110,117,40,97,112,112,109,101,110,117,41,10,125,170,115,104,111,119,65,112, +112,83,101,116,116,105,110,103,115,40,97,112,112,41,123,10,174,115,104,111,119,69,114,114,111,114,61,109,115,103,162,123, +69,46,115,104,111,119,77,101,115,115,97,103,101,40,96,36,123,97,112,112,46,110,97,109,101,125,58,92,110,36,123,109, +115,103,125,33,92,110,92,110,66,84,78,49,32,116,111,32,103,111,32,98,97,99,107,96,41,59,115,101,116,87,97,116, +99,104,40,115,104,111,119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,44,66,84,78,49,44,123,114,101,112, +101,97,116,58,181,125,41,59,125,173,97,112,112,83,101,116,116,105,110,103,115,61,115,116,111,114,97,103,101,46,114,101, +97,100,40,97,112,112,46,105,100,43,39,46,115,101,116,116,105,110,103,115,46,106,115,39,41,59,177,123,97,112,112,83, +101,116,116,105,110,103,115,61,101,118,97,108,40,97,112,112,83,101,116,116,105,110,103,115,41,59,125,99,97,116,99,104, +40,101,41,123,99,111,110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116, +116,105,110,103,115,32,101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111, +114,32,105,110,32,115,101,116,116,105,110,103,115,39,41,59,125,163,40,191,97,112,112,83,101,116,116,105,110,103,115,141, +34,102,117,110,99,116,105,111,110,34,41,123,171,115,104,111,119,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32, +115,101,116,116,105,110,103,115,39,41,59,125,177,123,97,112,112,83,101,116,116,105,110,103,115,40,40,41,162,115,104,111, +119,65,112,112,83,101,116,116,105,110,103,115,77,101,110,117,40,41,41,59,125,99,97,116,99,104,40,101,41,123,99,111, +110,115,111,108,101,46,108,111,103,40,96,36,123,97,112,112,46,110,97,109,101,125,32,115,101,116,116,105,110,103,115,32, +101,114,114,111,114,58,96,44,101,41,171,115,104,111,119,69,114,114,111,114,40,39,69,114,114,111,114,32,105,110,32,115, +101,116,116,105,110,103,115,39,41,59,125,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,255,76,2,0,0, +115,101,116,116,105,110,103,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0, +255,255,241,99,204,66,111,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,1,85,85,80,0,0,0,0,0,0,0,0, +1,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, +0,0,16,0,5,85,85,80,0,5,0,0,0,0,85,0,85,85,85,85,0,85,0,0,0,1,85,81,85,85,85,85, +69,85,64,0,0,1,85,85,85,250,175,85,85,85,80,0,0,5,85,85,94,170,170,181,85,85,80,0,0,21,85,85, +234,170,170,171,85,85,84,0,0,21,85,87,170,170,170,170,213,85,84,0,0,85,85,94,170,170,170,170,181,85,85,0, +0,85,85,90,170,170,170,170,165,85,85,0,0,85,85,122,170,170,170,170,173,85,85,0,0,21,85,106,170,160,10,170, +169,85,84,0,0,1,85,234,170,0,0,170,171,85,64,0,0,0,85,234,170,0,0,170,171,85,0,0,0,0,21,170, +168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0,0,0,21,170,168,0,0,42,170,85,0,0, +0,0,21,170,168,0,0,42,170,85,0,0,0,0,85,234,170,0,0,170,171,85,0,0,0,1,85,234,170,0,0,170, +171,85,64,0,0,21,85,106,170,160,10,170,169,85,84,0,0,85,85,122,170,170,170,170,173,85,85,0,0,85,85,90, +170,170,170,170,165,85,85,0,0,85,85,94,170,170,170,170,181,85,85,0,0,21,85,87,170,170,170,170,213,85,84,0, +0,21,85,85,234,170,170,171,85,85,84,0,0,5,85,85,94,170,170,181,85,85,80,0,0,5,85,85,85,250,175,85, +85,85,64,0,0,1,85,81,85,85,85,85,69,85,64,0,0,0,85,0,85,85,85,85,0,85,0,0,0,0,80,0, +5,85,85,80,0,4,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0, +0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,5,85,85,64,0,0,0,0,0,0,0,0,1,85,85,64, +0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,78,1,0,0,115,101,116,116,105,110,103,46,106,115,111,110,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,123,34,98,108,101,34,58,116,114,117,101,44,34,98,108,101,114,101,112,108,34,58,116,114, +117,101,44,34,108,111,103,34,58,102,97,108,115,101,44,34,116,105,109,101,111,117,116,34,58,49,48,44,34,118,105,98, +114,97,116,101,34,58,116,114,117,101,44,34,98,101,101,112,34,58,34,118,105,98,34,44,34,116,105,109,101,122,111,110, +101,34,58,48,44,34,72,73,68,34,58,102,97,108,115,101,44,34,99,108,111,99,107,34,58,110,117,108,108,44,34,49, +50,104,111,117,114,34,58,102,97,108,115,101,44,34,98,114,105,103,104,116,110,101,115,115,34,58,49,44,34,111,112,116, +105,111,110,115,34,58,123,34,119,97,107,101,79,110,66,84,78,49,34,58,116,114,117,101,44,34,119,97,107,101,79,110, +66,84,78,50,34,58,116,114,117,101,44,34,119,97,107,101,79,110,66,84,78,51,34,58,116,114,117,101,44,34,119,97, +107,101,79,110,70,97,99,101,85,112,34,58,102,97,108,115,101,44,34,119,97,107,101,79,110,84,111,117,99,104,34,58, +102,97,108,115,101,44,34,119,97,107,101,79,110,84,119,105,115,116,34,58,116,114,117,101,44,34,116,119,105,115,116,84, +104,114,101,115,104,111,108,100,34,58,56,49,57,46,50,44,34,116,119,105,115,116,77,97,120,89,34,58,45,56,48,48, +44,34,116,119,105,115,116,84,105,109,101,111,117,116,34,58,49,48,48,48,125,125,255,255,203,0,0,0,115,101,116,116, +105,110,103,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,115, +101,116,116,105,110,103,34,44,34,110,97,109,101,34,58,34,83,101,116,116,105,110,103,115,34,44,34,115,114,99,34,58, +34,115,101,116,116,105,110,103,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,115,101,116,116,105,110,103, +46,105,109,103,34,44,34,115,111,114,116,111,114,100,101,114,34,58,45,53,44,34,118,101,114,115,105,111,110,34,58,34, +48,46,52,56,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,34,44,34,102,105,108,101, +115,34,58,34,115,101,116,116,105,110,103,46,105,110,102,111,44,115,101,116,116,105,110,103,46,97,112,112,46,106,115,44, +115,101,116,116,105,110,103,46,105,109,103,34,44,34,100,97,116,97,34,58,34,115,101,116,116,105,110,103,46,106,115,111, +110,34,125,255,210,14,0,0,104,101,97,108,116,104,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,10,170,109,101,110,117,77,97,105,110,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181, +59,99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116, +105,116,108,101,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34, +58,40,41,162,108,111,97,100,40,41,44,34,83,116,101,112,32,67,111,117,110,116,105,110,103,34,58,40,41,162,109,101, +110,117,83,116,101,112,67,111,117,110,116,40,41,44,34,77,111,118,101,109,101,110,116,34,58,40,41,162,109,101,110,117, +77,111,118,101,109,101,110,116,40,41,44,34,72,101,97,114,116,32,82,97,116,101,34,58,40,41,162,109,101,110,117,72, +82,77,40,41,44,34,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40, +34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115, +46,106,115,34,41,41,40,40,41,162,109,101,110,117,77,97,105,110,40,41,41,125,41,59,125,10,170,109,101,110,117,83, +116,101,112,67,111,117,110,116,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114, +66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34, +83,116,101,112,115,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40,41,44,34, +112,101,114,32,104,111,117,114,34,58,40,41,162,115,116,101,112,115,80,101,114,72,111,117,114,40,41,44,34,112,101,114, +32,100,97,121,34,58,40,41,162,115,116,101,112,115,80,101,114,68,97,121,40,41,125,41,59,125,10,170,109,101,110,117, +77,111,118,101,109,101,110,116,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,99,108,101,97,114, +66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34, +77,111,118,101,109,101,110,116,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101,110,117,77,97,105,110,40, +41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162,109,111,118,101,109,101,110,116,80,101,114,72,111,117,114,40, +41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,109,111,118,101,109,101,110,116,80,101,114,68,97,121,40,41,44, +125,41,59,125,10,170,109,101,110,117,72,82,77,40,41,123,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59, +99,108,101,97,114,66,117,116,116,111,110,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105, +116,108,101,58,34,72,101,97,114,116,32,82,97,116,101,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,109,101, +110,117,77,97,105,110,40,41,44,34,112,101,114,32,104,111,117,114,34,58,40,41,162,104,114,109,80,101,114,72,111,117, +114,40,41,44,34,112,101,114,32,100,97,121,34,58,40,41,162,104,114,109,80,101,114,68,97,121,40,41,44,125,41,59, +125,10,170,115,116,101,112,115,80,101,114,72,111,117,114,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40, +34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121, +40,50,52,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184, +68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,104,114,93,150,104,46,115,116,101,112,115,41,59,103,46,99, +108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114, +101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41,59, +98,97,114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97,116,97,41,59,125,10,170,115,116,101,112,115,80,101, +114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46, +34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105,114, +101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40,184, +68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,100,97,121,93,150,104,46,115,116,101,112,115,41,59,103,46, +99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46, +114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,83,116,101,112,67,111,117,110,116,41, +59,98,97,114,67,104,97,114,116,40,34,68,65,89,34,44,100,97,116,97,41,59,125,10,170,104,114,109,80,101,114,72, +111,117,114,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34, +41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41,59,172,99,110,116,61,184,85, +105,110,116,56,65,114,114,97,121,40,50,51,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46, +114,101,97,100,68,97,121,40,184,68,97,116,101,40,41,44,104,162,123,100,97,116,97,91,104,46,104,114,93,150,104,46, +98,112,109,59,163,40,104,46,98,112,109,41,99,110,116,91,104,46,104,114,93,152,59,125,41,59,100,97,116,97,46,102, +111,114,69,97,99,104,40,40,100,44,105,41,162,100,97,116,97,91,105,93,61,100,47,99,110,116,91,105,93,41,59,103, +46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103, +46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,72,82,77,41,59,98,97,114,67, +104,97,114,116,40,34,72,79,85,82,34,44,100,97,116,97,41,59,125,10,170,104,114,109,80,101,114,68,97,121,40,41, +123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46,46,34,41,59,172,100,97, +116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,51,49,41,59,172,99,110,116,61,184,85,105,110,116,56,65, +114,114,97,121,40,51,49,41,59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68, +97,105,108,121,83,117,109,109,97,114,105,101,115,40,184,68,97,116,101,40,41,44,104,162,123,100,97,116,97,91,104,46, +100,97,121,93,150,104,46,98,112,109,59,163,40,104,46,98,112,109,41,99,110,116,91,104,46,100,97,121,93,152,59,125, +41,59,100,97,116,97,46,102,111,114,69,97,99,104,40,40,100,44,105,41,162,100,97,116,97,91,105,93,61,100,47,99, +110,116,91,105,93,41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100, +103,101,116,115,40,41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,72, +82,77,41,59,98,97,114,67,104,97,114,116,40,34,68,65,89,34,44,100,97,116,97,41,59,125,10,170,109,111,118,101, +109,101,110,116,80,101,114,72,111,117,114,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97, +100,105,110,103,46,46,46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,50,52,41, +59,114,101,113,117,105,114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,121,40,184,68,97,116,101, +40,41,44,104,162,100,97,116,97,91,104,46,104,114,93,150,104,46,109,111,118,101,109,101,110,116,41,59,103,46,99,108, +101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,103,46,114,101, +115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,77,111,118,101,109,101,110,116,41,59,98,97, +114,67,104,97,114,116,40,34,72,79,85,82,34,44,100,97,116,97,41,59,125,10,170,109,111,118,101,109,101,110,116,80, +101,114,68,97,121,40,41,123,69,46,115,104,111,119,77,101,115,115,97,103,101,40,34,76,111,97,100,105,110,103,46,46, +46,34,41,59,172,100,97,116,97,61,184,85,105,110,116,49,54,65,114,114,97,121,40,51,49,41,59,114,101,113,117,105, +114,101,40,34,104,101,97,108,116,104,34,41,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,40, +184,68,97,116,101,40,41,44,104,162,100,97,116,97,91,104,46,100,97,121,93,150,104,46,109,111,118,101,109,101,110,116, +41,59,103,46,99,108,101,97,114,40,49,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40, +41,59,103,46,114,101,115,101,116,40,41,59,115,101,116,66,117,116,116,111,110,40,109,101,110,117,77,111,118,101,109,101, +110,116,41,59,98,97,114,67,104,97,114,116,40,34,68,65,89,34,44,100,97,116,97,41,59,125,10,174,119,61,103,46, +103,101,116,87,105,100,116,104,40,41,59,10,174,104,61,103,46,103,101,116,72,101,105,103,104,116,40,41,59,10,172,100, +97,116,97,95,108,101,110,59,10,172,99,104,97,114,116,95,105,110,100,101,120,59,10,172,99,104,97,114,116,95,109,97, +120,95,100,97,116,117,109,59,10,172,99,104,97,114,116,95,108,97,98,101,108,59,10,172,99,104,97,114,116,95,100,97, +116,97,59,10,172,115,119,105,112,101,95,101,110,97,98,108,101,100,61,181,59,10,172,98,116,110,59,10,170,109,97,120, +40,97,114,114,41,123,172,109,61,45,73,110,102,105,110,105,116,121,59,167,40,172,105,61,48,59,105,60,97,114,114,46, +108,101,110,103,116,104,59,105,152,41,163,40,97,114,114,91,105,93,62,109,41,109,61,97,114,114,91,105,93,59,171,109, +59,125,10,170,103,101,116,95,100,97,116,97,95,108,101,110,103,116,104,40,97,114,114,41,123,172,110,108,101,110,61,97, +114,114,46,108,101,110,103,116,104,59,167,40,172,105,61,97,114,114,46,108,101,110,103,116,104,45,49,59,105,62,48,158, +97,114,114,91,105,93,138,48,59,105,153,41,110,108,101,110,153,59,171,110,108,101,110,59,125,10,170,98,97,114,67,104, +97,114,116,40,108,97,98,101,108,44,100,116,41,123,100,97,116,97,95,108,101,110,61,103,101,116,95,100,97,116,97,95, +108,101,110,103,116,104,40,100,116,41,59,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40, +100,97,116,97,95,108,101,110,45,53,44,45,53,41,59,99,104,97,114,116,95,109,97,120,95,100,97,116,117,109,61,109, +97,120,40,100,116,41,59,99,104,97,114,116,95,108,97,98,101,108,61,108,97,98,101,108,59,99,104,97,114,116,95,100, +97,116,97,61,100,116,59,100,114,97,119,66,97,114,67,104,97,114,116,40,41,59,115,119,105,112,101,95,101,110,97,98, +108,101,100,61,180,59,125,10,170,100,114,97,119,66,97,114,67,104,97,114,116,40,41,123,174,98,97,114,95,98,111,116, +61,49,52,48,59,174,98,97,114,95,119,105,100,116,104,61,40,119,45,50,41,47,57,59,172,98,97,114,95,116,111,112, +59,172,98,97,114,59,103,46,115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,98,103,41,59,103,46,102, +105,108,108,82,101,99,116,40,48,44,50,52,44,119,44,104,41,59,167,40,98,97,114,61,49,59,98,97,114,60,49,48, +59,98,97,114,152,41,123,163,40,98,97,114,138,53,41,123,103,46,115,101,116,70,111,110,116,40,39,54,120,56,39,44, +50,41,59,103,46,115,101,116,70,111,110,116,65,108,105,103,110,40,48,44,45,49,41,59,103,46,115,101,116,67,111,108, +111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103,46,100,114,97,119,83,116,114,105,110,103,40,99,104,97,114, +116,95,108,97,98,101,108,43,34,32,34,43,40,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,43, +34,32,32,32,34,43,99,104,97,114,116,95,100,97,116,97,91,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114, +45,49,93,44,103,46,103,101,116,87,105,100,116,104,40,41,47,50,44,49,53,48,41,59,103,46,115,101,116,67,111,108, +111,114,40,34,35,48,48,102,34,41,59,125,164,123,103,46,115,101,116,67,111,108,111,114,40,34,35,48,102,102,34,41, +59,125,163,40,40,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,41,145,48,158,40,99,104,97,114,116, +95,105,110,100,101,120,43,98,97,114,45,49,41,60,100,97,116,97,95,108,101,110,158,99,104,97,114,116,95,109,97,120, +95,100,97,116,117,109,62,48,41,98,97,114,95,116,111,112,61,98,97,114,95,98,111,116,45,49,48,48,42,40,99,104, +97,114,116,95,100,97,116,97,91,99,104,97,114,116,95,105,110,100,101,120,43,98,97,114,45,49,93,41,47,99,104,97, +114,116,95,109,97,120,95,100,97,116,117,109,59,164,98,97,114,95,116,111,112,61,98,97,114,95,98,111,116,59,103,46, +102,105,108,108,82,101,99,116,40,49,43,40,98,97,114,45,49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114, +95,98,111,116,44,49,43,98,97,114,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,116,111,112,41,59,103,46, +115,101,116,67,111,108,111,114,40,103,46,116,104,101,109,101,46,102,103,41,59,103,46,100,114,97,119,82,101,99,116,40, +49,43,40,98,97,114,45,49,41,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,98,111,116,44,49,43,98,97, +114,42,98,97,114,95,119,105,100,116,104,44,98,97,114,95,116,111,112,41,59,125,125,10,170,110,101,120,116,95,98,97, +114,40,41,123,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116,104,46,109,105,110,40,100,97,116,97,95,108,101, +110,45,53,44,99,104,97,114,116,95,105,110,100,101,120,43,49,41,59,125,10,170,112,114,101,118,95,98,97,114,40,41, +123,99,104,97,114,116,95,105,110,100,101,120,61,77,97,116,104,46,109,97,120,40,40,99,104,97,114,116,95,108,97,98, +101,108,138,34,68,65,89,34,41,63,45,51,58,45,52,44,99,104,97,114,116,95,105,110,100,101,120,45,49,41,59,125, +10,66,97,110,103,108,101,46,111,110,40,39,115,119,105,112,101,39,44,100,105,114,162,123,163,40,33,115,119,105,112,101, +95,101,110,97,98,108,101,100,41,171,59,163,40,100,105,114,138,49,41,112,114,101,118,95,98,97,114,40,41,59,164,110, +101,120,116,95,98,97,114,40,41,59,100,114,97,119,66,97,114,67,104,97,114,116,40,41,59,125,41,59,10,170,115,101, +116,66,117,116,116,111,110,40,102,110,41,123,66,97,110,103,108,101,46,115,101,116,85,73,40,34,117,112,100,111,119,110, +34,44,183,41,59,163,40,112,114,111,99,101,115,115,46,101,110,118,46,72,87,86,69,82,83,73,79,78,138,49,41,98, +116,110,61,115,101,116,87,97,116,99,104,40,102,110,44,66,84,78,50,41,59,164,98,116,110,61,115,101,116,87,97,116, +99,104,40,102,110,44,66,84,78,49,41,59,125,10,170,99,108,101,97,114,66,117,116,116,111,110,40,41,123,163,40,98, +116,110,141,183,41,123,99,108,101,97,114,87,97,116,99,104,40,98,116,110,41,59,98,116,110,61,183,59,125,125,10,66, +97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119, +87,105,100,103,101,116,115,40,41,59,10,109,101,110,117,77,97,105,110,40,41,59,255,255,76,2,0,0,104,101,97,108, +116,104,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,194,0,255,255,224,249, +255,255,59,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,85,80,0,0,5, +85,64,0,0,0,0,21,85,85,0,0,85,85,84,0,0,0,0,85,85,85,64,1,85,85,90,0,0,0,1,85,85, +85,80,5,85,85,106,128,0,0,5,85,85,85,84,21,85,85,234,160,0,0,21,85,85,85,85,85,85,87,170,180,0, +0,21,85,85,85,85,85,85,94,170,212,0,0,85,85,85,85,85,85,85,122,171,85,0,0,85,85,85,85,85,85,85, +234,173,85,0,0,85,85,122,213,85,85,87,170,181,85,0,0,85,85,106,181,85,85,94,170,213,85,0,0,85,85,106, +173,85,85,122,171,85,85,0,0,85,85,122,171,85,85,234,173,85,85,0,0,85,85,94,170,213,87,170,181,85,85,0, +0,21,85,87,170,181,94,170,213,85,84,0,0,21,85,85,234,173,122,171,85,85,84,0,0,5,85,85,122,171,234,173, +85,85,80,0,0,1,85,85,94,170,170,181,85,85,64,0,0,0,85,85,87,170,170,213,85,85,0,0,0,0,21,85, +85,234,171,85,85,84,0,0,0,0,5,85,85,122,173,85,85,80,0,0,0,0,1,85,85,94,181,85,85,64,0,0, +0,0,0,85,85,87,213,85,85,0,0,0,0,0,0,21,85,85,85,85,84,0,0,0,0,0,0,5,85,85,85,85, +80,0,0,0,0,0,0,1,85,85,85,85,64,0,0,0,0,0,0,0,85,85,85,85,0,0,0,0,0,0,0,0, +21,85,85,84,0,0,0,0,0,0,0,0,5,85,85,80,0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0, +0,0,0,0,0,85,85,0,0,0,0,0,0,0,0,0,0,21,84,0,0,0,0,0,0,0,0,0,0,5,80,0, +0,0,0,0,0,0,0,0,0,1,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,85,80,0,0,5,85,64,0,0,0,0,21,85,85,0,0,85,85,84,0,0, -0,0,85,85,85,64,1,85,85,90,0,0,0,1,85,85,85,80,5,85,85,106,128,0,0,5,85,85,85,84,21,85, -85,234,160,0,0,21,85,85,85,85,85,85,87,170,180,0,0,21,85,85,85,85,85,85,94,170,212,0,0,85,85,85, -85,85,85,85,122,171,85,0,0,85,85,85,85,85,85,85,234,173,85,0,0,85,85,122,213,85,85,87,170,181,85,0, -0,85,85,106,181,85,85,94,170,213,85,0,0,85,85,106,173,85,85,122,171,85,85,0,0,85,85,122,171,85,85,234, -173,85,85,0,0,85,85,94,170,213,87,170,181,85,85,0,0,21,85,87,170,181,94,170,213,85,84,0,0,21,85,85, -234,173,122,171,85,85,84,0,0,5,85,85,122,171,234,173,85,85,80,0,0,1,85,85,94,170,170,181,85,85,64,0, -0,0,85,85,87,170,170,213,85,85,0,0,0,0,21,85,85,234,171,85,85,84,0,0,0,0,5,85,85,122,173,85, -85,80,0,0,0,0,1,85,85,94,181,85,85,64,0,0,0,0,0,85,85,87,213,85,85,0,0,0,0,0,0,21, -85,85,85,85,84,0,0,0,0,0,0,5,85,85,85,85,80,0,0,0,0,0,0,1,85,85,85,85,64,0,0,0, -0,0,0,0,85,85,85,85,0,0,0,0,0,0,0,0,21,85,85,84,0,0,0,0,0,0,0,0,5,85,85,80, -0,0,0,0,0,0,0,0,1,85,85,64,0,0,0,0,0,0,0,0,0,85,85,0,0,0,0,0,0,0,0,0, -0,21,84,0,0,0,0,0,0,0,0,0,0,5,80,0,0,0,0,0,0,0,0,0,0,1,64,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,6,0,0,104,101,97,108,116,104,46,98, -111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,102,117,110,99,116,105,111,110,40,41,123, -118,97,114,32,97,61,48,124,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100, -74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,49,41,124,124,123,125,41,46,104,114,109,59,105, -102,40,49,61,61,97,124,124,50,61,61,97,41,123,102,117,110,99,116,105,111,110,32,102,40,41,123,66,97,110,103,108, -101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101,97,108,116,104,34,41,59,115,101,116,84,105,109, -101,111,117,116,40,40,41,61,62,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104, -101,97,108,116,104,34,41,44,54,69,52,42,97,41,59,105,102,40,49,61,61,97,41,102,111,114,40,118,97,114,32,98, -61,49,59,50,62,61,98,59,98,43,43,41,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,123,66,97,110,103, -108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44,34,104,101,97,108,116,104,34,41,59,115,101,116,84,105, -109,101,111,117,116,40,40,41,61,62,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44, -34,104,101,97,108,116,104,34,41,125,44,50,69,53,42,98,43,54,69,52,41,125,44,50,69,53,42,98,41,125,66,97, -110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34,44,102,41,59,66,97,110,103,108,101,46,111,110,40,34,72, -82,77,34,44,98,61,62,123,56,48,60,98,46,99,111,110,102,105,100,101,110,99,101,38,38,66,97,110,103,108,101,46, -115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,125,41,59,66,97,110,103,108,101, -46,103,101,116,72,101,97,108,116,104,83,116,97,116,117,115,40,41,46,98,112,109,67,111,110,102,105,100,101,110,99,101, -124,124,102,40,41,125,101,108,115,101,32,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,33, -61,10,97,44,34,104,101,97,108,116,104,34,41,125,41,40,41,59,66,97,110,103,108,101,46,111,110,40,34,104,101,97, -108,116,104,34,44,97,61,62,123,102,117,110,99,116,105,111,110,32,102,40,99,41,123,114,101,116,117,114,110,32,83,116, -114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,99,46,115,116,101,112,115,62,62,56,44,99,46,115, -116,101,112,115,38,50,53,53,44,99,46,98,112,109,44,77,97,116,104,46,109,105,110,40,99,46,109,111,118,101,109,101, -110,116,47,56,44,50,53,53,41,41,125,118,97,114,32,98,61,110,101,119,32,68,97,116,101,40,68,97,116,101,46,110, -111,119,40,41,45,53,57,69,52,41,44,101,61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,32, -49,52,53,42,40,99,46,103,101,116,68,97,116,101,40,41,45,49,41,43,54,42,99,46,103,101,116,72,111,117,114,115, -40,41,43,40,48,124,54,42,99,46,103,101,116,77,105,110,117,116,101,115,40,41,47,54,48,41,125,40,98,41,59,98, -61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,34,104,101,97,108,116,104,45,34,43,99,46,103, -101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,99,46,103,101,116,77,111,110,116,104,40,41,43,49, -41,43,34,46,114,97,119,34,125,40,98,41,59,118,97,114,32,103,61,114,101,113,117,105,114,101,40,34,83,116,111,114, -97,103,101,34,41,46,114,101,97,100,40,98,41,59,105,102,40,103,41,123,118,97,114,32,100,61,103,46,115,117,98,115, -116,114,40,56,43,52,42,101,44,52,41,59,105,102,40,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48, -102,102,92,117,48,48,102,102,34,33,61,100,41,123,112,114,105,110,116,40,34,72,69,65,76,84,72,32,69,82,82,58, -32,65,108,114,101,97,100,121,32,119,114,105,116,116,101,110,33,34,41,59,114,101,116,117,114,110,125,125,101,108,115,101, -32,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,10,34,72,69, -65,76,84,72,49,92,120,48,48,34,44,48,44,49,55,57,56,56,41,59,118,97,114,32,104,61,56,43,52,42,101,59, -114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,102,40,97,41,44, -104,44,49,55,57,56,56,41,59,105,102,40,49,52,51,61,61,101,37,49,52,53,41,105,102,40,101,61,104,43,52,44, -34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,103,46,115,117, -98,115,116,114,40,101,44,52,41,41,112,114,105,110,116,40,34,72,69,65,76,84,72,32,69,82,82,58,32,68,97,105, -108,121,32,115,117,109,109,97,114,121,32,97,108,114,101,97,100,121,32,119,114,105,116,116,101,110,33,34,41,59,101,108, -115,101,123,97,61,123,115,116,101,112,115,58,48,44,98,112,109,58,48,44,109,111,118,101,109,101,110,116,58,48,44,109, -111,118,67,110,116,58,48,44,98,112,109,67,110,116,58,48,125,59,102,111,114,40,118,97,114,32,107,61,48,59,49,52, -52,62,107,59,107,43,43,41,100,61,103,46,115,117,98,115,116,114,40,104,44,52,41,44,34,92,117,48,48,102,102,92, -117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,100,38,38,40,97,46,115,116,101,112,115,43, -61,40,100,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56,41,43,100,46,99,104,97,114,67,111,100,101, -65,116,40,49,41,44,97,46,109,111,118,101,109,101,110,116,43,61,100,46,99,104,97,114,67,111,100,101,65,116,40,50, -41,44,97,46,109,111,118,67,110,116,43,43,44,100,61,100,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,97, -46,98,112,109,43,61,100,44,100,38,38,97,46,98,112,109,67,110,116,43,43,41,44,104,45,61,52,59,97,46,98,112, -109,67,110,116,38,38,40,97,46,98,112,109,47,61,97,46,98,112,109,67,110,116,41,59,97,46,109,111,118,67,110,116, -38,38,40,97,46,109,111,118,101,109,101,110,116,47,61,97,46,109,111,118,67,110,116,41,59,10,114,101,113,117,105,114, -101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,40,98,44,102,40,97,41,44,101,44,49,55,57,56, -56,41,125,125,41,255,255,255,65,4,0,0,104,101,97,108,116,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,104,40,97,41,123,114,101,116,117,114,110,34,104,101,97, -108,116,104,45,34,43,97,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34,43,40,97,46,103,101,116, -77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119,34,125,102,117,110,99,116,105,111,110,32,107,40,97,41,123, -114,101,116,117,114,110,32,49,52,53,42,40,97,46,103,101,116,68,97,116,101,40,41,45,49,41,43,54,42,97,46,103, -101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,97,46,103,101,116,77,105,110,117,116,101,115,40,41,47,54,48, -41,125,101,120,112,111,114,116,115,46,114,101,97,100,65,108,108,82,101,99,111,114,100,115,61,102,117,110,99,116,105,111, -110,40,97,44,102,41,123,97,61,104,40,97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, -34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111,114,40,118,97,114, -32,99,61,56,44,100,61,48,59,51,49,62,100,59,100,43,43,41,123,102,111,114,40,118,97,114,32,98,61,48,59,50, -52,62,98,59,98,43,43,41,102,111,114,40,118,97,114,32,101,61,48,59,54,62,101,59,101,43,43,41,123,118,97,114, -32,103,61,97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117, -48,48,102,102,92,117,48,48,102,102,34,33,61,103,38,38,102,40,123,100,97,121,58,100,43,49,44,104,114,58,98,44, -109,105,110,58,49,48,42,101,44,115,116,101,112,115,58,103,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60, -56,124,103,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,103,46,99,104,97,114,67,111,100,101, -65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,103,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41, -59,99,43,61,10,52,125,99,43,61,52,125,125,59,101,120,112,111,114,116,115,46,114,101,97,100,68,97,105,108,121,83, -117,109,109,97,114,105,101,115,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,107,40,97,41,59,97,61,104,40, -97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,97,41,59, -105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111,114,40,118,97,114,32,99,61,53,56,52,44,100,61,48,59, -51,49,62,100,59,100,43,43,41,123,118,97,114,32,98,61,97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92, -117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,98,38,38,102,40,123, -100,97,121,58,100,43,49,44,115,116,101,112,115,58,98,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56, -124,98,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,98,46,99,104,97,114,67,111,100,101,65, -116,40,50,41,44,109,111,118,101,109,101,110,116,58,98,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41,59, -99,43,61,53,56,48,125,125,59,101,120,112,111,114,116,115,46,114,101,97,100,68,97,121,61,102,117,110,99,116,105,111, -110,40,97,44,102,41,123,107,40,97,41,59,118,97,114,32,99,61,104,40,97,41,59,99,61,114,101,113,117,105,114,101, -40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,99,41,59,105,102,40,118,111,105,100,32,48,33,61,61, -99,41,123,97,61,56,43,53,56,48,42,40,97,46,103,101,116,68,97,116,101,40,41,45,49,41,59,102,111,114,40,118, -97,114,32,100,61,48,59,50,52,62,100,59,100,43,43,41,102,111,114,40,118,97,114,32,98,61,48,59,54,62,98,59, -98,43,43,41,123,118,97,114,32,101,61,99,46,115,117,98,115,116,114,40,97,44,52,41,59,34,92,117,48,48,102,102, -92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,101,38,38,102,40,123,104,114,58,100,44, -10,109,105,110,58,49,48,42,98,44,115,116,101,112,115,58,101,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60, -60,56,124,101,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,98,112,109,58,101,46,99,104,97,114,67,111,100, -101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,101,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125, -41,59,97,43,61,52,125,125,125,255,255,255,4,2,0,0,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46, -106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98,97,99,107,41,123,172,115,101,116,116,105,110,103,115,61,79, -98,106,101,99,116,46,97,115,115,105,103,110,40,123,104,114,109,58,48,44,115,116,101,112,71,111,97,108,58,49,48,48, -48,48,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40, -34,104,101,97,108,116,104,46,106,115,111,110,34,44,180,41,160,123,125,41,59,69,46,115,104,111,119,77,101,110,117,40, -123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,125,44,34,60, -32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41,44,34,72,82,77,32,73,110,116,101,114,118,97,108,34,58, -123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,104,114,109,44,109,105,110,58,48,44,109,97,120,58,51,44, -102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44,34,51,32,109,105,110,34,44,34,49,48,32,109,105,110,34, -44,34,65,108,119,97,121,115,34,93,91,118,93,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110, -103,115,46,104,114,109,61,118,59,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125, -125,44,34,68,97,105,108,121,32,83,116,101,112,32,71,111,97,108,34,58,123,118,97,108,117,101,58,115,101,116,116,105, -110,103,115,46,115,116,101,112,71,111,97,108,44,109,105,110,58,48,44,109,97,120,58,50,48,48,48,48,44,115,116,101, -112,58,50,53,48,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,115,116,101,112,71, -111,97,108,61,118,59,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,125,41, -59,170,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,123,114,101,113,117,105,114,101,40, -34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111, -110,34,44,115,101,116,116,105,110,103,115,41,59,125,125,41,236,0,0,0,104,101,97,108,116,104,46,105,110,102,111,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,104,101,97,108,116,104,34,44,34, -110,97,109,101,34,58,34,72,101,97,108,116,104,32,84,114,97,99,107,105,110,103,34,44,34,115,114,99,34,58,34,104, -101,97,108,116,104,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,104,101,97,108,116,104,46,105,109,103, -34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,53,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44, -115,121,115,116,101,109,44,104,101,97,108,116,104,34,44,34,102,105,108,101,115,34,58,34,104,101,97,108,116,104,46,105, -110,102,111,44,104,101,97,108,116,104,46,97,112,112,46,106,115,44,104,101,97,108,116,104,46,105,109,103,44,104,101,97, -108,116,104,46,98,111,111,116,46,106,115,44,104,101,97,108,116,104,44,104,101,97,108,116,104,46,115,101,116,116,105,110, -103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,104,101,97,108,116,104,46,106,115,111,110,34,125,198,41,0,0, -97,108,97,114,109,46,97,112,112,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117, -108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170,40,41,123,174, -79,78,69,95,83,69,67,79,78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61,54,48,42,79, -78,69,95,83,69,67,79,78,68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77,73,78,85,84, -69,59,174,79,78,69,95,68,65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114,116,115,46,101, -110,99,111,100,101,84,105,109,101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84,105,109,101,40, -116,105,109,101,41,59,171,116,105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104,42,79,78,69, -95,72,79,85,82,43,116,105,109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101,46,115,42,79, -78,69,95,83,69,67,79,78,68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171,123,100,58,116, -105,109,101,46,100,160,48,44,104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160,48,44,115,58, -116,105,109,101,46,115,160,48,125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,61,40,109, -105,108,108,105,115,41,162,123,163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176,34,79,110,108, -121,32,97,32,110,117,109,98,101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172,100,61,77,97, -116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108,108,105,115,151, -100,42,79,78,69,95,68,65,89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79, -78,69,95,72,79,85,82,41,59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172,109,61,77,97, -116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59,109,105,108,108, -105,115,151,109,42,79,78,69,95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111,114,40,109,105, -108,108,105,115,47,79,78,69,95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109,58,109,44,115, -58,115,125,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108,117,101,41,162, -123,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63, -118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41, -59,163,40,116,105,109,101,46,100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100, -32,104,101,114,101,34,59,163,40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41,176,34,73,110, -118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32,60,61,32,50, -51,34,59,163,40,116,105,109,101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110,118,97,108,105, -100,32,118,97,108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53,57,34,59,171, -116,105,109,101,46,104,43,34,58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115,116,114,40,45, -50,41,59,125,101,120,112,111,114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40,118,97,108,117, -101,44,99,111,109,112,97,99,116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160,181,59,172,100, -117,114,97,116,105,111,110,61,34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101, -139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105, -109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105,111,110,150,116, -105,109,101,46,100,43,34,100,32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105,111,110,150,116, -105,109,101,46,104,43,34,104,32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105,111,110,150,116, -105,109,101,46,109,43,34,109,32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105,111,110,150,116, -105,109,101,46,115,43,34,115,34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116,114,105,109,40, -41,171,99,111,109,112,97,99,116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34,32,34,44,34, -34,41,58,100,117,114,97,116,105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114,101,110,116,84, -105,109,101,77,105,108,108,105,115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105, -109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77,105,110,117,116, -101,115,40,41,42,54,48,43,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49,48,48,48,59, -125,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105, -108,115,34,44,170,40,41,123,101,120,112,111,114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116, -101,100,41,162,123,172,100,111,119,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40, -184,68,97,116,101,40,40,40,105,160,48,41,43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114, -101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41, -63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112, -101,114,67,97,115,101,40,41,58,100,111,119,59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115, -116,68,97,121,79,102,87,101,101,107,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91, -93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105, -61,48,59,105,60,55,59,105,152,41,123,100,111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119, -40,105,43,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101, -100,41,41,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162, -100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116, -115,46,109,111,110,116,104,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61, -114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105, -45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115, -108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97, -98,98,114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41, -58,109,111,110,116,104,59,125,101,120,112,111,114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97, -116,101,100,41,162,123,172,109,111,110,116,104,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101, -40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104, -115,46,112,117,115,104,40,108,111,99,97,108,101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53, -41,42,50,54,50,56,48,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101, -40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98, -114,101,118,105,97,116,101,100,138,50,63,109,111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116, -104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,77,111, -100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114, -116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111, -108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111, -108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116, -101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85, -90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77, -95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103, -108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110, +0,0,0,0,17,6,0,0,104,101,97,108,116,104,46,98,111,111,116,46,106,115,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,40,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,97,61,48,124,40,114,101,113,117,105,114,101, +40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111, +110,34,44,49,41,124,124,123,125,41,46,104,114,109,59,105,102,40,49,61,61,97,124,124,50,61,61,97,41,123,102,117, +110,99,116,105,111,110,32,102,40,41,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49,44, +34,104,101,97,108,116,104,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,66,97,110,103,108,101,46, +115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,44,54,69,52,42,97,41,59,105, +102,40,49,61,61,97,41,102,111,114,40,118,97,114,32,98,61,49,59,50,62,61,98,59,98,43,43,41,115,101,116,84, +105,109,101,111,117,116,40,40,41,61,62,123,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,49, +44,34,104,101,97,108,116,104,34,41,59,115,101,116,84,105,109,101,111,117,116,40,40,41,61,62,123,66,97,110,103,108, +101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104,101,97,108,116,104,34,41,125,44,50,69,53,42,98, +43,54,69,52,41,125,44,50,69,53,42,98,41,125,66,97,110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34, +44,102,41,59,66,97,110,103,108,101,46,111,110,40,34,72,82,77,34,44,98,61,62,123,56,48,60,98,46,99,111,110, +102,105,100,101,110,99,101,38,38,66,97,110,103,108,101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,44,34,104, +101,97,108,116,104,34,41,125,41,59,66,97,110,103,108,101,46,103,101,116,72,101,97,108,116,104,83,116,97,116,117,115, +40,41,46,98,112,109,67,111,110,102,105,100,101,110,99,101,124,124,102,40,41,125,101,108,115,101,32,66,97,110,103,108, +101,46,115,101,116,72,82,77,80,111,119,101,114,40,48,33,61,10,97,44,34,104,101,97,108,116,104,34,41,125,41,40, +41,59,66,97,110,103,108,101,46,111,110,40,34,104,101,97,108,116,104,34,44,97,61,62,123,102,117,110,99,116,105,111, +110,32,102,40,99,41,123,114,101,116,117,114,110,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100, +101,40,99,46,115,116,101,112,115,62,62,56,44,99,46,115,116,101,112,115,38,50,53,53,44,99,46,98,112,109,44,77, +97,116,104,46,109,105,110,40,99,46,109,111,118,101,109,101,110,116,47,56,44,50,53,53,41,41,125,118,97,114,32,98, +61,110,101,119,32,68,97,116,101,40,68,97,116,101,46,110,111,119,40,41,45,53,57,69,52,41,44,101,61,102,117,110, +99,116,105,111,110,40,99,41,123,114,101,116,117,114,110,32,49,52,53,42,40,99,46,103,101,116,68,97,116,101,40,41, +45,49,41,43,54,42,99,46,103,101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,99,46,103,101,116,77,105,110, +117,116,101,115,40,41,47,54,48,41,125,40,98,41,59,98,61,102,117,110,99,116,105,111,110,40,99,41,123,114,101,116, +117,114,110,34,104,101,97,108,116,104,45,34,43,99,46,103,101,116,70,117,108,108,89,101,97,114,40,41,43,34,45,34, +43,40,99,46,103,101,116,77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119,34,125,40,98,41,59,118,97,114, +32,103,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,98,41,59,105,102, +40,103,41,123,118,97,114,32,100,61,103,46,115,117,98,115,116,114,40,56,43,52,42,101,44,52,41,59,105,102,40,34, +92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,100,41,123,112,114, +105,110,116,40,34,72,69,65,76,84,72,32,69,82,82,58,32,65,108,114,101,97,100,121,32,119,114,105,116,116,101,110, +33,34,41,59,114,101,116,117,114,110,125,125,101,108,115,101,32,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103, +101,34,41,46,119,114,105,116,101,40,98,44,10,34,72,69,65,76,84,72,49,92,120,48,48,34,44,48,44,49,55,57, +56,56,41,59,118,97,114,32,104,61,56,43,52,42,101,59,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, +34,41,46,119,114,105,116,101,40,98,44,102,40,97,41,44,104,44,49,55,57,56,56,41,59,105,102,40,49,52,51,61, +61,101,37,49,52,53,41,105,102,40,101,61,104,43,52,44,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48, +48,102,102,92,117,48,48,102,102,34,33,61,103,46,115,117,98,115,116,114,40,101,44,52,41,41,112,114,105,110,116,40, +34,72,69,65,76,84,72,32,69,82,82,58,32,68,97,105,108,121,32,115,117,109,109,97,114,121,32,97,108,114,101,97, +100,121,32,119,114,105,116,116,101,110,33,34,41,59,101,108,115,101,123,97,61,123,115,116,101,112,115,58,48,44,98,112, +109,58,48,44,109,111,118,101,109,101,110,116,58,48,44,109,111,118,67,110,116,58,48,44,98,112,109,67,110,116,58,48, +125,59,102,111,114,40,118,97,114,32,107,61,48,59,49,52,52,62,107,59,107,43,43,41,100,61,103,46,115,117,98,115, +116,114,40,104,44,52,41,44,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102, +102,34,33,61,100,38,38,40,97,46,115,116,101,112,115,43,61,40,100,46,99,104,97,114,67,111,100,101,65,116,40,48, +41,60,60,56,41,43,100,46,99,104,97,114,67,111,100,101,65,116,40,49,41,44,97,46,109,111,118,101,109,101,110,116, +43,61,100,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,97,46,109,111,118,67,110,116,43,43,44,100,61,100, +46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,97,46,98,112,109,43,61,100,44,100,38,38,97,46,98,112,109, +67,110,116,43,43,41,44,104,45,61,52,59,97,46,98,112,109,67,110,116,38,38,40,97,46,98,112,109,47,61,97,46, +98,112,109,67,110,116,41,59,97,46,109,111,118,67,110,116,38,38,40,97,46,109,111,118,101,109,101,110,116,47,61,97, +46,109,111,118,67,110,116,41,59,10,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105, +116,101,40,98,44,102,40,97,41,44,101,44,49,55,57,56,56,41,125,125,41,255,255,255,65,4,0,0,104,101,97,108, +116,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110, +32,104,40,97,41,123,114,101,116,117,114,110,34,104,101,97,108,116,104,45,34,43,97,46,103,101,116,70,117,108,108,89, +101,97,114,40,41,43,34,45,34,43,40,97,46,103,101,116,77,111,110,116,104,40,41,43,49,41,43,34,46,114,97,119, +34,125,102,117,110,99,116,105,111,110,32,107,40,97,41,123,114,101,116,117,114,110,32,49,52,53,42,40,97,46,103,101, +116,68,97,116,101,40,41,45,49,41,43,54,42,97,46,103,101,116,72,111,117,114,115,40,41,43,40,48,124,54,42,97, +46,103,101,116,77,105,110,117,116,101,115,40,41,47,54,48,41,125,101,120,112,111,114,116,115,46,114,101,97,100,65,108, +108,82,101,99,111,114,100,115,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,97,61,104,40,97,41,59,97,61, +114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111, +105,100,32,48,33,61,61,97,41,102,111,114,40,118,97,114,32,99,61,56,44,100,61,48,59,51,49,62,100,59,100,43, +43,41,123,102,111,114,40,118,97,114,32,98,61,48,59,50,52,62,98,59,98,43,43,41,102,111,114,40,118,97,114,32, +101,61,48,59,54,62,101,59,101,43,43,41,123,118,97,114,32,103,61,97,46,115,117,98,115,116,114,40,99,44,52,41, +59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,34,33,61,103,38,38, +102,40,123,100,97,121,58,100,43,49,44,104,114,58,98,44,109,105,110,58,49,48,42,101,44,115,116,101,112,115,58,103, +46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56,124,103,46,99,104,97,114,67,111,100,101,65,116,40,49, +41,44,98,112,109,58,103,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,103, +46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41,59,99,43,61,10,52,125,99,43,61,52,125,125,59,101,120, +112,111,114,116,115,46,114,101,97,100,68,97,105,108,121,83,117,109,109,97,114,105,101,115,61,102,117,110,99,116,105,111, +110,40,97,44,102,41,123,107,40,97,41,59,97,61,104,40,97,41,59,97,61,114,101,113,117,105,114,101,40,34,83,116, +111,114,97,103,101,34,41,46,114,101,97,100,40,97,41,59,105,102,40,118,111,105,100,32,48,33,61,61,97,41,102,111, +114,40,118,97,114,32,99,61,53,56,52,44,100,61,48,59,51,49,62,100,59,100,43,43,41,123,118,97,114,32,98,61, +97,46,115,117,98,115,116,114,40,99,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102, +102,92,117,48,48,102,102,34,33,61,98,38,38,102,40,123,100,97,121,58,100,43,49,44,115,116,101,112,115,58,98,46, +99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56,124,98,46,99,104,97,114,67,111,100,101,65,116,40,49,41, +44,98,112,109,58,98,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58,98,46, +99,104,97,114,67,111,100,101,65,116,40,51,41,125,41,59,99,43,61,53,56,48,125,125,59,101,120,112,111,114,116,115, +46,114,101,97,100,68,97,121,61,102,117,110,99,116,105,111,110,40,97,44,102,41,123,107,40,97,41,59,118,97,114,32, +99,61,104,40,97,41,59,99,61,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100, +40,99,41,59,105,102,40,118,111,105,100,32,48,33,61,61,99,41,123,97,61,56,43,53,56,48,42,40,97,46,103,101, +116,68,97,116,101,40,41,45,49,41,59,102,111,114,40,118,97,114,32,100,61,48,59,50,52,62,100,59,100,43,43,41, +102,111,114,40,118,97,114,32,98,61,48,59,54,62,98,59,98,43,43,41,123,118,97,114,32,101,61,99,46,115,117,98, +115,116,114,40,97,44,52,41,59,34,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48,102,102,92,117,48,48, +102,102,34,33,61,101,38,38,102,40,123,104,114,58,100,44,10,109,105,110,58,49,48,42,98,44,115,116,101,112,115,58, +101,46,99,104,97,114,67,111,100,101,65,116,40,48,41,60,60,56,124,101,46,99,104,97,114,67,111,100,101,65,116,40, +49,41,44,98,112,109,58,101,46,99,104,97,114,67,111,100,101,65,116,40,50,41,44,109,111,118,101,109,101,110,116,58, +101,46,99,104,97,114,67,111,100,101,65,116,40,51,41,125,41,59,97,43,61,52,125,125,125,255,255,255,4,2,0,0, +104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46,106,115,0,0,0,0,0,0,0,0,0,0,40,170,40,98, +97,99,107,41,123,172,115,101,116,116,105,110,103,115,61,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,104,114, +109,58,48,44,115,116,101,112,71,111,97,108,58,49,48,48,48,48,125,44,114,101,113,117,105,114,101,40,34,83,116,111, +114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,180,41, +160,123,125,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123,116,105,116,108,101,58,34,72,101,97,108, +116,104,32,84,114,97,99,107,105,110,103,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,98,97,99,107,40,41, +44,34,72,82,77,32,73,110,116,101,114,118,97,108,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46, +104,114,109,44,109,105,110,58,48,44,109,97,120,58,51,44,102,111,114,109,97,116,58,118,162,91,34,79,102,102,34,44, +34,51,32,109,105,110,34,44,34,49,48,32,109,105,110,34,44,34,65,108,119,97,121,115,34,93,91,118,93,44,111,110, +99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,104,114,109,61,118,59,115,101,116,83,101,116,116, +105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,68,97,105,108,121,32,83,116,101,112,32,71,111, +97,108,34,58,123,118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,115,116,101,112,71,111,97,108,44,109,105,110, +58,48,44,109,97,120,58,50,48,48,48,48,44,115,116,101,112,58,50,53,48,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,115,116,101,112,71,111,97,108,61,118,59,115,101,116,83,101,116,116,105,110,103, +115,40,115,101,116,116,105,110,103,115,41,59,125,125,125,41,59,170,115,101,116,83,101,116,116,105,110,103,115,40,115,101, +116,116,105,110,103,115,41,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101, +74,83,79,78,40,34,104,101,97,108,116,104,46,106,115,111,110,34,44,115,101,116,116,105,110,103,115,41,59,125,125,41, +236,0,0,0,104,101,97,108,116,104,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,104,101,97,108,116,104,34,44,34,110,97,109,101,34,58,34,72,101,97,108,116,104,32,84,114, +97,99,107,105,110,103,34,44,34,115,114,99,34,58,34,104,101,97,108,116,104,46,97,112,112,46,106,115,34,44,34,105, +99,111,110,34,58,34,104,101,97,108,116,104,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49, +53,34,44,34,116,97,103,115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,104,101,97,108,116,104,34,44,34, +102,105,108,101,115,34,58,34,104,101,97,108,116,104,46,105,110,102,111,44,104,101,97,108,116,104,46,97,112,112,46,106, +115,44,104,101,97,108,116,104,46,105,109,103,44,104,101,97,108,116,104,46,98,111,111,116,46,106,115,44,104,101,97,108, +116,104,44,104,101,97,108,116,104,46,115,101,116,116,105,110,103,115,46,106,115,34,44,34,100,97,116,97,34,58,34,104, +101,97,108,116,104,46,106,115,111,110,34,125,133,2,0,0,115,99,104,101,100,46,98,111,111,116,46,106,115,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,40,170,40,41,123,163,40,66,97,110,103,108,101,46,83,67,72,69,68,41, +123,99,108,101,97,114,84,105,109,101,111,117,116,40,66,97,110,103,108,101,46,83,67,72,69,68,41,59,190,66,97,110, +103,108,101,46,83,67,72,69,68,59,125,172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,39,83,116,111,114, +97,103,101,39,41,46,114,101,97,100,74,83,79,78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49,41,160,91, +93,59,172,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114,114,101,110,116,84,105,109,101,61,40,116,105, +109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116, +77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,83,101,99,111,110,100, +115,40,41,42,49,48,48,48,41,59,172,100,61,116,105,109,101,46,103,101,116,68,97,116,101,40,41,59,172,97,99,116, +105,118,101,61,97,108,97,114,109,115,46,102,105,108,116,101,114,40,97,162,97,46,111,110,158,40,97,46,108,97,115,116, +140,100,41,158,40,97,46,116,43,54,48,48,48,48,62,99,117,114,114,101,110,116,84,105,109,101,41,158,40,97,46,100, +111,119,146,116,105,109,101,46,103,101,116,68,97,121,40,41,38,49,41,158,40,33,97,46,100,97,116,101,160,97,46,100, +97,116,101,138,116,105,109,101,46,116,111,73,83,79,83,116,114,105,110,103,40,41,46,115,117,98,115,116,114,40,48,44, +49,48,41,41,41,59,163,40,97,99,116,105,118,101,46,108,101,110,103,116,104,41,123,97,99,116,105,118,101,61,97,99, +116,105,118,101,46,115,111,114,116,40,40,97,44,98,41,162,97,46,116,45,98,46,116,41,59,172,116,61,97,99,116,105, +118,101,91,48,93,46,116,45,99,117,114,114,101,110,116,84,105,109,101,59,163,40,116,60,49,48,48,48,41,116,61,49, +48,48,48,59,66,97,110,103,108,101,46,83,67,72,69,68,61,115,101,116,84,105,109,101,111,117,116,40,97,99,116,105, +118,101,91,48,93,46,106,115,160,39,108,111,97,100,40,34,115,99,104,101,100,46,106,115,34,41,39,44,116,41,59,125, +164,123,66,97,110,103,108,101,46,83,67,72,69,68,61,115,101,116,84,105,109,101,111,117,116,40,39,101,118,97,108,40, +114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,98, +111,111,116,46,106,115,34,41,41,39,44,56,54,52,48,48,48,48,48,45,40,68,97,116,101,46,110,111,119,40,41,37, +56,54,52,48,48,48,48,48,41,41,59,125,125,41,40,41,59,255,255,255,104,18,0,0,115,99,104,101,100,46,106,115, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67, +97,99,104,101,100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170,40,41,123,174,79,78,69,95,83,69,67,79, +78,68,61,49,48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61,54,48,42,79,78,69,95,83,69,67,79,78, +68,59,174,79,78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77,73,78,85,84,69,59,174,79,78,69,95,68, +65,89,61,50,52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114,116,115,46,101,110,99,111,100,101,84,105,109, +101,61,40,116,105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84,105,109,101,40,116,105,109,101,41,59,171,116, +105,109,101,46,100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104,42,79,78,69,95,72,79,85,82,43,116,105, +109,101,46,109,42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101,46,115,42,79,78,69,95,83,69,67,79,78, +68,59,125,170,115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171,123,100,58,116,105,109,101,46,100,160,48,44, +104,58,116,105,109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160,48,44,115,58,116,105,109,101,46,115,160,48, +125,59,125,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,61,40,109,105,108,108,105,115,41,162,123, +163,40,191,109,105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176,34,79,110,108,121,32,97,32,110,117,109,98, +101,114,32,99,97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172,100,61,77,97,116,104,46,102,108,111,111,114, +40,109,105,108,108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108,108,105,115,151,100,42,79,78,69,95,68,65, +89,59,172,104,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,72,79,85,82,41, +59,109,105,108,108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172,109,61,77,97,116,104,46,102,108,111,111,114, +40,109,105,108,108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59,109,105,108,108,105,115,151,109,42,79,78,69, +95,77,73,78,85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69, +95,83,69,67,79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109,58,109,44,115,58,115,125,59,125,101,120,112, +111,114,116,115,46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108,117,101,41,162,123,172,116,105,109,101,61,115, +97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120, +112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46, +100,140,48,41,176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,104,101,114,101,34,59,163, +40,116,105,109,101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41,176,34,73,110,118,97,108,105,100,32,118,97, +108,117,101,58,32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32,60,61,32,50,51,34,59,163,40,116,105,109, +101,46,109,60,48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58, +32,109,117,115,116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53,57,34,59,171,116,105,109,101,46,104,43,34, +58,34,43,40,34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115,116,114,40,45,50,41,59,125,101,120,112,111, +114,116,115,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40,118,97,108,117,101,44,99,111,109,112,97,99, +116,41,162,123,99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160,181,59,172,100,117,114,97,116,105,111,110,61, +34,34,59,172,116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116, +34,63,118,97,108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101, +41,41,59,163,40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,100,43,34,100, +32,34,59,163,40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,104,43,34,104, +32,34,59,163,40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,109,43,34,109, +32,34,59,163,40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,115,43,34,115, +34,100,117,114,97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116,114,105,109,40,41,171,99,111,109,112,97,99, +116,63,100,117,114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34,32,34,44,34,34,41,58,100,117,114,97,116, +105,111,110,59,125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105, +115,61,40,41,162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105,109,101,46,103,101,116,72,111, +117,114,115,40,41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,43, +116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49,48,48,48,59,125,125,41,59,10,77,111,100, +117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114,116, +115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111,108, +118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111,108, +118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116,101, +114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85,90, +90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77,95, +77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103,108, +101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40, +40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138, +34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,87, +69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49, +48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77, +83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40, +100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117,122, +122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162, +115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59,34, +41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82,79, +78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48, +48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83, +44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116, +40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122, +44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10,163,40,66,97,110,103,108,101,46, +83,67,72,69,68,41,123,99,108,101,97,114,73,110,116,101,114,118,97,108,40,66,97,110,103,108,101,46,83,67,72,69, +68,41,59,190,66,97,110,103,108,101,46,83,67,72,69,68,59,125,10,170,115,104,111,119,65,108,97,114,109,40,97,108, +97,114,109,41,123,174,97,108,97,114,109,73,110,100,101,120,61,97,108,97,114,109,115,46,105,110,100,101,120,79,102,40, +97,108,97,114,109,41,59,174,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34, +41,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,173,109,101,115,115,97,103,101,61,34,34,59,109,101,115,115, +97,103,101,150,97,108,97,114,109,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,97,108,97,114,109,46,116,105,109,101,114, +41,58,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,84,105, +109,101,40,97,108,97,114,109,46,116,41,59,163,40,97,108,97,114,109,46,109,115,103,41,123,109,101,115,115,97,103,101, +150,34,92,110,34,43,97,108,97,114,109,46,109,115,103,59,125,164,123,109,101,115,115,97,103,101,61,40,97,108,97,114, +109,46,116,105,109,101,114,63,97,116,111,98,40,34,65,67,81,115,119,103,68,47,47,51,51,118,82,99,71,72,73,81, +65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65, +65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66,86,86,86,65,65,65,65,65,65,65,65,66, +86,86,86,65,65,65,65,65,65,65,65,65,80,47,119,65,65,65,65,65,65,65,65,65,80,47,119,65,65,65,65,65, +65,65,65,65,113,113,111,65,80,65,65,65,65,65,65,113,113,113,113,111,80,56,65,65,65,65,75,113,113,113,113,113, +118,47,65,65,65,67,113,113,113,113,113,113,113,47,119,65,65,75,113,113,113,108,87,113,113,118,119,65,65,113,113,113, +113,108,86,97,113,114,65,65,67,113,113,113,113,108,86,86,113,113,65,65,75,113,113,113,113,108,86,86,97,113,103,65, +75,113,97,113,113,108,86,86,87,113,103,65,113,112,87,113,113,108,86,86,86,113,111,65,113,108,87,113,113,108,86,86, +86,97,111,67,113,108,86,54,113,108,86,86,86,97,113,67,113,86,86,102,113,108,86,86,86,87,113,67,113,86,86,102, +54,108,86,86,86,87,113,75,112,86,86,88,47,108,86,86,86,86,113,113,112,86,86,86,47,43,86,86,86,86,113,113, +112,86,86,86,47,47,108,86,86,86,113,113,112,86,86,86,102,114,49,86,86,86,113,113,112,86,86,86,102,114,49,86, +86,86,113,113,112,86,86,86,98,47,108,86,86,86,113,113,112,86,86,86,87,43,86,86,86,86,113,113,112,86,86,86, +86,86,86,86,86,86,113,105,113,86,86,86,86,86,86,86,86,87,113,67,113,86,86,86,86,86,86,86,86,87,113,67, +113,108,86,86,86,86,86,86,86,97,113,65,113,108,86,86,86,86,86,86,86,97,111,65,113,112,86,86,86,86,86,86, +86,113,111,65,75,113,86,86,86,86,86,86,87,113,103,65,75,113,108,86,86,86,86,86,97,113,103,65,67,113,112,86, +86,86,86,86,113,113,65,65,65,113,113,108,86,86,86,97,113,111,65,65,65,75,113,113,86,86,87,113,113,103,65,65, +65,67,113,113,113,113,113,113,113,65,65,65,65,65,75,113,113,113,113,113,103,65,65,65,65,65,65,113,113,113,113,111, +65,65,65,65,65,65,65,65,113,113,111,65,65,65,65,65,61,61,34,41,58,97,116,111,98,40,34,65,67,48,115,119, +103,70,57,55,47,47,47,82,99,69,112,77,108,86,86,86,86,86,86,102,57,86,86,86,86,86,86,86,86,88,47,57, +86,86,102,57,86,86,102,47,49,86,86,86,47,47,47,49,86,102,57,86,88,47,47,47,86,86,88,47,47,47,86,87, +113,113,108,86,47,47,47,49,86,102,47,47,57,97,113,113,113,113,112,102,47,47,57,86,47,47,47,50,113,113,113,113, +113,113,110,47,47,47,86,47,47,47,54,113,113,113,113,113,113,114,47,47,47,88,47,47,43,113,113,111,65,65,75,113, +113,118,47,47,51,47,47,54,113,111,65,65,65,65,75,113,114,47,47,51,47,47,113,113,65,65,65,65,65,65,113,113, +47,47,51,47,43,113,111,65,65,68,119,65,65,75,113,118,47,51,47,43,113,103,65,65,68,119,65,65,67,113,118,47, +51,47,97,113,65,65,65,68,119,65,65,65,113,112,47,49,57,113,111,65,65,65,68,119,65,65,65,75,113,102,86,49, +113,103,65,65,65,68,119,65,65,65,67,113,88,86,87,113,103,65,65,65,68,119,65,65,65,67,113,108,86,87,113,65, +65,65,65,68,119,65,65,65,65,113,108,86,87,113,65,65,65,65,68,119,65,65,65,65,113,108,86,87,113,65,65,65, +65,68,119,65,65,65,65,113,108,86,97,111,65,65,65,65,68,119,65,65,65,65,75,112,86,97,111,65,65,65,65,68, +119,65,65,65,65,75,112,86,97,111,65,65,65,65,68,119,65,65,65,65,75,112,86,97,111,65,65,65,65,79,115,65, +65,65,65,75,112,86,97,111,65,65,65,65,79,115,65,65,65,65,75,112,86,97,111,65,65,65,65,76,47,65,65,65, +65,75,112,86,97,111,65,65,65,65,103,80,119,65,65,65,75,112,86,97,111,65,65,65,67,65,68,56,65,65,65,75, +112,86,87,113,65,65,65,73,65,65,47,65,65,65,113,108,86,87,113,65,65,65,103,65,65,80,119,65,65,113,108,86, +87,113,65,65,67,65,65,65,68,119,65,65,113,108,86,87,113,103,65,73,65,65,65,65,65,65,67,113,108,86,86,113, +103,65,103,65,65,65,65,65,65,67,113,86,86,86,113,111,65,65,65,65,65,65,65,65,75,113,86,86,86,97,113,65, +65,65,65,65,65,65,65,113,112,86,86,86,87,113,103,65,65,65,65,65,65,67,113,108,86,86,86,87,113,111,65,65, +65,65,65,65,75,113,108,86,86,86,86,113,113,65,65,65,65,65,65,113,113,86,86,86,86,86,97,113,111,65,65,65, +65,75,113,112,86,86,86,86,86,101,113,113,111,65,65,75,113,113,116,86,86,86,86,86,47,54,113,113,113,113,113,113, +114,47,86,86,86,86,88,47,50,113,113,113,113,113,113,110,47,49,86,86,86,102,47,86,97,113,113,113,113,112,86,47, +57,86,86,86,102,57,86,86,87,113,113,108,86,86,102,57,86,86,86,102,49,86,86,86,86,86,86,86,86,88,57,86, +81,61,61,34,41,41,43,34,32,34,43,109,101,115,115,97,103,101,125,66,97,110,103,108,101,46,108,111,97,100,87,105, +100,103,101,116,115,40,41,59,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,173,98,117, +122,122,67,111,117,110,116,61,115,101,116,116,105,110,103,115,46,98,117,122,122,67,111,117,110,116,59,69,46,115,104,111, +119,80,114,111,109,112,116,40,109,101,115,115,97,103,101,44,123,116,105,116,108,101,58,97,108,97,114,109,46,116,105,109, +101,114,63,34,84,73,77,69,82,33,34,58,34,65,76,65,82,77,33,34,44,98,117,116,116,111,110,115,58,123,34,83, +110,111,111,122,101,34,58,180,44,34,83,116,111,112,34,58,181,125,125,41,46,116,104,101,110,40,170,40,115,108,101,101, +112,41,123,98,117,122,122,67,111,117,110,116,61,48,59,163,40,115,108,101,101,112,41,123,163,40,97,108,97,114,109,46, +111,116,139,183,41,123,97,108,97,114,109,46,111,116,61,97,108,97,114,109,46,116,59,125,97,108,97,114,109,46,116,150, +115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108,105,115,59,125,164,123, +173,100,101,108,61,97,108,97,114,109,46,100,101,108,139,183,63,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108, +116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115,58,97,108,97,114,109,46,100,101,108,59,163, +40,100,101,108,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49, +41,59,125,164,123,163,40,33,97,108,97,114,109,46,116,105,109,101,114,41,123,97,108,97,114,109,46,108,97,115,116,61, +184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41,59,125,163,40,97,108,97,114,109,46,111,116,141,183,41, +123,97,108,97,114,109,46,116,61,97,108,97,114,109,46,111,116,59,190,97,108,97,114,109,46,111,116,59,125,163,40,33, +97,108,97,114,109,46,114,112,41,123,97,108,97,114,109,46,111,110,61,181,59,125,125,125,114,101,113,117,105,114,101,40, +34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,108,111,97,100,40, +41,59,125,41,59,170,98,117,122,122,40,41,123,163,40,115,101,116,116,105,110,103,115,46,117,110,108,111,99,107,65,116, +66,117,122,122,41,123,66,97,110,103,108,101,46,115,101,116,76,111,99,107,101,100,40,181,41,59,125,174,112,97,116,116, +101,114,110,61,97,108,97,114,109,46,118,105,98,114,97,116,101,160,40,97,108,97,114,109,46,116,105,109,101,114,63,115, +101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,58,115,101,116,116, +105,110,103,115,46,100,101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,41,59,114,101,113,117,105,114, +101,40,34,98,117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97,116,116,101,114,110,41,46,116,104,101,110,40, +40,41,162,123,163,40,98,117,122,122,67,111,117,110,116,153,41,123,115,101,116,84,105,109,101,111,117,116,40,98,117,122, +122,44,115,101,116,116,105,110,103,115,46,98,117,122,122,73,110,116,101,114,118,97,108,77,105,108,108,105,115,41,59,125, +164,163,40,97,108,97,114,109,46,97,115,41,123,98,117,122,122,67,111,117,110,116,61,115,101,116,116,105,110,103,115,46, +98,117,122,122,67,111,117,110,116,59,115,101,116,84,105,109,101,111,117,116,40,98,117,122,122,44,115,101,116,116,105,110, +103,115,46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108,105,115,41,59,125,125,41,59,125,163,40,40, +114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,101,116, +116,105,110,103,46,106,115,111,110,34,44,49,41,160,123,125,41,46,113,117,105,101,116,62,49,41,171,59,98,117,122,122, +40,41,59,125,10,173,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,103,101, +116,65,108,97,114,109,115,40,41,59,10,173,97,99,116,105,118,101,61,114,101,113,117,105,114,101,40,34,115,99,104,101, +100,34,41,46,103,101,116,65,99,116,105,118,101,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,10,163,40,97, +99,116,105,118,101,46,108,101,110,103,116,104,41,123,115,104,111,119,65,108,97,114,109,40,97,99,116,105,118,101,91,48, +93,41,59,125,164,123,115,101,116,84,105,109,101,111,117,116,40,108,111,97,100,44,49,48,48,41,59,125,132,4,0,0, +115,99,104,101,100,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,132,6, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,17,102,102,102,102,17,17,102,102,102, +102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17,17,102,102,102,17,17,17,17,17,102,102,102, +102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17,17,22,102,102,102,102,17,17,17,17,17,102, +204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17,17,17,22,204,204,204,204,204,204,204,204,204, +204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204,204,204,204,204,204,193,17,17,17,17,22,102, +102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17,17,17,17,102,102,17,17,17,17,76,204,204, +67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17,20,204,204,195,255,255,255,255,255,255,255,255, +60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240,15,255,255,255,243,76,204,196,17,17,17,102, +102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204,17,17,17,102,102,17,17,108,204,196,255,255, +255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204,204,195,255,255,255,255,255,240,15,255,255,255, +255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240,15,255,255,255,255,255,243,204,204,102,22,102, +102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76,204,198,102,102,102,102,108,204,195,255,255,255, +255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255, +255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102, +102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255, +255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,48,3,255,255,255, +255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,255,255,255,255,255,255,255,204,204,102,102, +102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255, +255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204,63,255,255,255,255,255,52,63,48,0,63,255, +255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255,243,0,3,255,255,255,255,243,204,204,102,102, +102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255, +243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204,195,255,255,255,52,63,255,255,255,255,48,47, +255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255,255,255,243,255,255,255,255,76,204,198,102,102, +102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204,204,102,102,102,102,102,102,204,204,195,255,243, +255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108,204,196,255,255,255,255,255,255,255,255,255,255, +255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255,255,255,255,255,255,244,204,204,102,102,102,102, +102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204,102,102,102,102,102,102,102,102,108,204,204,195, +255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102,102,204,204,204,67,255,255,255,255,255,255,52, +204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255,255,51,68,204,204,204,65,102,102,102,102,102, +102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22,102,102,102,102,102,102,102,102,17,17,22,204, +204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97,17,17,102,102,204,204,204,204,204,204,204,204, +102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204,204,204,102,102,102,102,97,17,22,102,102,102, +102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,22,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +172,8,0,0,115,99,104,101,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +10,101,120,112,111,114,116,115,46,103,101,116,65,108,97,114,109,115,61,170,40,41,123,171,114,101,113,117,105,114,101,40, +34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,99,104,101,100,46,106,115,111,110,34, +44,49,41,160,91,93,59,125,59,10,101,120,112,111,114,116,115,46,115,101,116,65,108,97,114,109,115,61,170,40,97,108, +97,114,109,115,41,123,171,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,119,114,105,116,101,74, +83,79,78,40,34,115,99,104,101,100,46,106,115,111,110,34,44,97,108,97,114,109,115,41,59,125,59,10,101,120,112,111, +114,116,115,46,103,101,116,65,108,97,114,109,61,170,40,105,100,41,123,171,101,120,112,111,114,116,115,46,103,101,116,65, +108,97,114,109,115,40,41,46,102,105,110,100,40,97,162,97,46,105,100,138,105,100,41,59,125,59,10,101,120,112,111,114, +116,115,46,103,101,116,65,99,116,105,118,101,65,108,97,114,109,115,61,170,40,97,108,97,114,109,115,44,116,105,109,101, +41,123,163,40,33,116,105,109,101,41,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114,114,101,110,116,84, +105,109,101,61,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48,41,43,40,116, +105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105,109,101,46,103,101, +116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,43,49,48,48,48,48,59,171,97,108,97,114,109,115,46,102, +105,108,116,101,114,40,97,162,97,46,111,110,158,40,97,46,108,97,115,116,140,116,105,109,101,46,103,101,116,68,97,116, +101,40,41,41,158,40,97,46,116,60,99,117,114,114,101,110,116,84,105,109,101,41,158,40,97,46,100,111,119,146,116,105, +109,101,46,103,101,116,68,97,121,40,41,38,49,41,158,40,33,97,46,100,97,116,101,160,97,46,100,97,116,101,138,116, +105,109,101,46,116,111,73,83,79,83,116,114,105,110,103,40,41,46,115,117,98,115,116,114,40,48,44,49,48,41,41,41, +46,115,111,114,116,40,40,97,44,98,41,162,97,46,116,45,98,46,116,41,59,125,10,101,120,112,111,114,116,115,46,115, +101,116,65,108,97,114,109,61,170,40,105,100,44,97,108,97,114,109,41,123,172,97,108,97,114,109,115,61,101,120,112,111, +114,116,115,46,103,101,116,65,108,97,114,109,115,40,41,46,102,105,108,116,101,114,40,97,162,97,46,105,100,140,105,100, +41,59,163,40,97,108,97,114,109,141,183,41,123,97,108,97,114,109,46,105,100,61,105,100,59,163,40,97,108,97,114,109, +46,100,111,119,139,183,41,97,108,97,114,109,46,100,111,119,61,48,98,49,49,49,49,49,49,49,59,163,40,97,108,97, +114,109,46,111,110,141,181,41,97,108,97,114,109,46,111,110,61,180,59,163,40,97,108,97,114,109,46,116,105,109,101,114, +41,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,172,99,117,114,114,101,110,116,84,105,109,101,61,40,116,105, +109,101,46,103,101,116,72,111,117,114,115,40,41,42,51,54,48,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116, +77,105,110,117,116,101,115,40,41,42,54,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,83,101,99,111,110,100, +115,40,41,42,49,48,48,48,41,59,97,108,97,114,109,46,116,61,99,117,114,114,101,110,116,84,105,109,101,43,97,108, +97,114,109,46,116,105,109,101,114,59,125,97,108,97,114,109,115,46,112,117,115,104,40,97,108,97,114,109,41,59,125,101, +120,112,111,114,116,115,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,125,59,10,101,120,112,111, +114,116,115,46,103,101,116,84,105,109,101,84,111,65,108,97,114,109,61,170,40,97,108,97,114,109,44,116,105,109,101,41, +123,163,40,33,97,108,97,114,109,41,171,183,59,163,40,33,116,105,109,101,41,116,105,109,101,61,184,68,97,116,101,40, +41,59,172,99,117,114,114,101,110,116,84,105,109,101,61,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40,41,42, +51,54,48,48,48,48,48,41,43,40,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,48,48, +48,41,43,40,116,105,109,101,46,103,101,116,83,101,99,111,110,100,115,40,41,42,49,48,48,48,41,59,172,97,99,116, +105,118,101,61,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109,46,100,111,119,146,40,40,116,105,109,101,46,103, +101,116,68,97,121,40,41,43,40,97,108,97,114,109,46,116,60,99,117,114,114,101,110,116,84,105,109,101,41,41,37,55, +41,41,38,49,158,40,33,97,108,97,114,109,46,100,97,116,101,160,97,108,97,114,109,46,100,97,116,101,138,116,105,109, +101,46,116,111,73,83,79,83,116,114,105,110,103,40,41,46,115,117,98,115,116,114,40,48,44,49,48,41,41,59,163,40, +33,97,99,116,105,118,101,41,171,183,59,172,116,61,97,108,97,114,109,46,116,45,99,117,114,114,101,110,116,84,105,109, +101,59,163,40,97,108,97,114,109,46,108,97,115,116,138,116,105,109,101,46,103,101,116,68,97,116,101,40,41,160,116,60, +45,54,48,48,48,48,41,116,150,56,54,52,48,48,48,48,48,59,171,116,59,125,59,10,101,120,112,111,114,116,115,46, +114,101,108,111,97,100,61,170,40,41,123,101,118,97,108,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101, +34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,98,111,111,116,46,106,115,34,41,41,59,163,40,103,108,111,98, +97,108,46,87,73,68,71,69,84,83,158,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,41,123,87,73,68, +71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,66,97,110,103,108,101,46,100,114, +97,119,87,105,100,103,101,116,115,40,41,59,125,125,59,10,101,120,112,111,114,116,115,46,110,101,119,68,101,102,97,117, +108,116,65,108,97,114,109,61,170,40,41,123,174,115,101,116,116,105,110,103,115,61,101,120,112,111,114,116,115,46,103,101, +116,83,101,116,116,105,110,103,115,40,41,59,172,97,108,97,114,109,61,123,116,58,49,50,42,51,54,48,48,48,48,48, +44,100,101,108,58,181,44,111,110,58,180,44,114,112,58,181,44,97,115,58,115,101,116,116,105,110,103,115,46,100,101,102, +97,117,108,116,65,117,116,111,83,110,111,111,122,101,44,100,111,119,58,48,98,49,49,49,49,49,49,49,44,108,97,115, +116,58,48,44,118,105,98,114,97,116,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,108,97,114, +109,80,97,116,116,101,114,110,44,125,59,190,115,101,116,116,105,110,103,115,59,171,97,108,97,114,109,59,125,10,101,120, +112,111,114,116,115,46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,61,170,40,41,123,174,115,101,116,116,105, +110,103,115,61,101,120,112,111,114,116,115,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,172,116,105,109,101,114, +61,123,116,105,109,101,114,58,53,42,54,48,42,49,48,48,48,44,100,101,108,58,115,101,116,116,105,110,103,115,46,100, +101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115,44,111,110,58,180,44,114, +112,58,181,44,97,115,58,181,44,100,111,119,58,48,98,49,49,49,49,49,49,49,44,108,97,115,116,58,48,44,118,105, +98,114,97,116,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,84,105,109,101,114,80,97,116,116,101, +114,110,125,190,115,101,116,116,105,110,103,115,59,171,116,105,109,101,114,59,125,59,10,101,120,112,111,114,116,115,46,103, +101,116,83,101,116,116,105,110,103,115,61,170,40,41,123,171,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,117, +110,108,111,99,107,65,116,66,117,122,122,58,181,44,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108,105, +115,58,54,48,48,48,48,48,44,100,101,102,97,117,108,116,65,117,116,111,83,110,111,111,122,101,58,181,44,100,101,102, +97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115,58,180,44,98,117,122,122,67,111, +117,110,116,58,49,48,44,98,117,122,122,73,110,116,101,114,118,97,108,77,105,108,108,105,115,58,51,48,48,48,44,100, +101,102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,58,34,58,58,34,44,100,101,102,97,117,108,116,84, +105,109,101,114,80,97,116,116,101,114,110,58,34,58,58,34,125,44,114,101,113,117,105,114,101,40,34,83,116,111,114,97, +103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106,115, +111,110,34,44,180,41,160,123,125,41,59,125,10,101,120,112,111,114,116,115,46,115,101,116,83,101,116,116,105,110,103,115, +61,170,40,115,101,116,116,105,110,103,115,41,123,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46, +119,114,105,116,101,74,83,79,78,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106,115,111,110,34,44, +115,101,116,116,105,110,103,115,41,59,125,59,85,9,0,0,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106, +115,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98, +117,122,122,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110, +162,184,80,114,111,109,105,115,101,40,114,101,115,111,108,118,101,162,123,170,100,111,66,117,122,122,40,41,123,163,40,112, +97,116,116,101,114,110,138,34,34,41,114,101,115,111,108,118,101,40,41,59,172,99,61,112,97,116,116,101,114,110,91,48, +93,59,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,46,115,117,98,115,116,114,40,49,41,59,174,66,85,90, +90,95,87,69,65,75,61,48,46,50,53,44,66,85,90,90,95,83,84,82,79,78,71,61,49,59,174,83,72,79,82,84, +95,77,83,61,49,48,48,44,77,69,68,73,85,77,95,77,83,61,50,48,48,44,76,79,78,71,95,77,83,61,53,48, +48,59,163,40,99,138,34,46,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66, +85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66, +117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77, +69,68,73,85,77,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84, +105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110, +103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110, 40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99, -138,34,44,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95, -87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44, -49,48,48,41,41,59,164,163,40,99,138,34,45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95, -77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116, -40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117, -122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41, -162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59, -34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82, -79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49, -48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77, -83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117, -116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122, -122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125,41,59,125,41,59,10,77,111,100,117,108,101,115,46, -97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116, -115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,112,97,116, -116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44,34,46,46,34,44,34,58,58,34,44,34,44,34,44, -34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44,34,61,34,44,34,45,45,34,44,34,61,61,34,44, -34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44,34,59,59,59,34,44,34,61,61,61,34,93,59,171, -123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44,112,97,116,116,101,114,110,115,46,105,110,100,101,120, -79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109,97,120,58,112,97,116,116,101,114,110,115,46,108,101, -110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102, -34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97, -116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41,59,99,97,108,108,98,97,99,107,40,112,97,116,116, -101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103, -101,116,115,40,41,59,10,66,97,110,103,108,101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,102,105, -114,115,116,68,97,121,79,102,87,101,101,107,61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, -46,114,101,97,100,74,83,79,78,40,34,115,101,116,116,105,110,103,46,106,115,111,110,34,44,180,41,160,123,125,41,46, -102,105,114,115,116,68,97,121,79,102,87,101,101,107,160,48,59,10,174,87,79,82,75,68,65,89,83,61,54,50,10,174, -87,69,69,75,69,78,68,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,49,57,50,58,54,53,59,10,174, -69,86,69,82,89,95,68,65,89,61,102,105,114,115,116,68,97,121,79,102,87,101,101,107,63,50,53,52,58,49,50,55, -59,10,174,105,99,111,110,65,108,97,114,109,79,110,61,34,92,48,34,43,97,116,111,98,40,34,71,66,105,66,65,65, -65,65,65,65,65,65,65,65,89,65,89,65,52,65,99,66,120,43,79,68,110,47,110,65,80,47,119,65,102,47,52,65, -47,110,56,65,47,110,56,66,47,110,43,66,47,110,43,66,47,110,43,66,47,110,43,66,47,104,43,66,47,52,43,65, -47,43,56,65,47,47,56,65,102,47,52,65,80,47,119,65,72,47,103,65,66,43,65,65,65,65,65,65,65,65,65,65, -61,61,34,41,59,10,174,105,99,111,110,65,108,97,114,109,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109, +138,34,58,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44,66,85,90,90,95,83, +84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122, +44,49,48,48,41,41,59,164,163,40,99,138,34,59,34,41,66,97,110,103,108,101,46,98,117,122,122,40,77,69,68,73, +85,77,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105, +109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,61,34,41,66,97,110,103, +108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101, +110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,115,101, +116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,59,125,100,111,66,117,122,122,40,41,59,125, +41,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98,117,122,122,95,109,101, +110,117,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,170,40,118,97,108,117,101,44, +99,97,108,108,98,97,99,107,41,123,172,112,97,116,116,101,114,110,115,61,91,34,34,44,34,46,34,44,34,58,34,44, +34,46,46,34,44,34,58,58,34,44,34,44,34,44,34,59,34,44,34,44,44,34,44,34,59,59,34,44,34,45,34,44, +34,61,34,44,34,45,45,34,44,34,61,61,34,44,34,46,46,46,34,44,34,58,58,58,34,44,34,45,45,45,34,44, +34,59,59,59,34,44,34,61,61,61,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46,109,97,120,40,48,44, +112,97,116,116,101,114,110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109,105,110,58,48,44,109, +97,120,58,112,97,116,116,101,114,110,115,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97,116,58,118,162,112,97, +116,116,101,114,110,115,91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118,162,123,114,101,113,117, +105,114,101,40,34,98,117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97,116,116,101,114,110,115,91,118,93,41, +59,99,97,108,108,98,97,99,107,40,112,97,116,116,101,114,110,115,91,118,93,41,59,125,125,59,125,125,41,59,40,170, +40,98,97,99,107,41,123,173,115,101,116,116,105,110,103,115,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34, +41,46,103,101,116,83,101,116,116,105,110,103,115,40,41,59,69,46,115,104,111,119,77,101,110,117,40,123,34,34,58,123, +34,116,105,116,108,101,34,58,34,83,99,104,101,100,117,108,101,114,34,125,44,34,60,32,66,97,99,107,34,58,40,41, +162,98,97,99,107,40,41,44,34,85,110,108,111,99,107,32,97,116,32,66,117,122,122,34,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,117,110,108,111,99,107,65,116,66,117,122,122,44,111,110,99,104,97,110,103,101,58,118, +162,123,115,101,116,116,105,110,103,115,46,117,110,108,111,99,107,65,116,66,117,122,122,61,118,59,114,101,113,117,105,114, +101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41, +59,125,125,44,34,68,101,108,101,116,101,32,69,120,112,105,114,101,100,32,84,105,109,101,114,115,34,58,123,118,97,108, +117,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100, +84,105,109,101,114,115,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,100,101,102,97, +117,108,116,68,101,108,101,116,101,69,120,112,105,114,101,100,84,105,109,101,114,115,61,118,59,114,101,113,117,105,114,101, +40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59, +125,125,44,34,68,101,102,97,117,108,116,32,65,117,116,111,32,83,110,111,111,122,101,34,58,123,118,97,108,117,101,58, +115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,117,116,111,83,110,111,111,122,101,44,111,110,99,104,97, +110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,65,117,116,111,83,110,111,111,122, +101,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115, +40,115,101,116,116,105,110,103,115,41,59,125,125,44,34,68,101,102,97,117,108,116,32,83,110,111,111,122,101,34,58,123, +118,97,108,117,101,58,115,101,116,116,105,110,103,115,46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108, +105,115,47,54,48,48,48,48,44,109,105,110,58,53,44,109,97,120,58,51,48,44,115,116,101,112,58,53,44,102,111,114, +109,97,116,58,118,162,118,43,34,109,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115, +46,100,101,102,97,117,108,116,83,110,111,111,122,101,77,105,108,108,105,115,61,118,42,54,48,48,48,48,59,114,101,113, +117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110, +103,115,41,59,125,125,44,34,66,117,122,122,32,67,111,117,110,116,34,58,123,118,97,108,117,101,58,115,101,116,116,105, +110,103,115,46,98,117,122,122,67,111,117,110,116,44,109,105,110,58,53,44,109,97,120,58,49,53,44,115,116,101,112,58, +49,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,117,122,122,67,111,117,110,116, +61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40, +115,101,116,116,105,110,103,115,41,59,125,125,44,34,66,117,122,122,32,73,110,116,101,114,118,97,108,34,58,123,118,97, +108,117,101,58,115,101,116,116,105,110,103,115,46,98,117,122,122,73,110,116,101,114,118,97,108,77,105,108,108,105,115,47, +49,48,48,48,44,109,105,110,58,49,44,109,97,120,58,53,44,115,116,101,112,58,49,44,102,111,114,109,97,116,58,118, +162,118,43,34,115,34,44,111,110,99,104,97,110,103,101,58,118,162,123,115,101,116,116,105,110,103,115,46,98,117,122,122, +73,110,116,101,114,118,97,108,77,105,108,108,105,115,61,118,42,49,48,48,48,59,114,101,113,117,105,114,101,40,34,115, +99,104,101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,125,44, +34,68,101,102,97,117,108,116,32,65,108,97,114,109,32,80,97,116,116,101,114,110,34,58,114,101,113,117,105,114,101,40, +34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,115,101,116,116,105,110,103,115,46,100,101, +102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,44,118,162,123,115,101,116,116,105,110,103,115,46,100,101, +102,97,117,108,116,65,108,97,114,109,80,97,116,116,101,114,110,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104, +101,100,34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,41,44,34,68, +101,102,97,117,108,116,32,84,105,109,101,114,32,80,97,116,116,101,114,110,34,58,114,101,113,117,105,114,101,40,34,98, +117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,115,101,116,116,105,110,103,115,46,100,101,102,97, +117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,44,118,162,123,115,101,116,116,105,110,103,115,46,100,101,102,97, +117,108,116,84,105,109,101,114,80,97,116,116,101,114,110,61,118,59,114,101,113,117,105,114,101,40,34,115,99,104,101,100, +34,41,46,115,101,116,83,101,116,116,105,110,103,115,40,115,101,116,116,105,110,103,115,41,59,125,41,125,41,59,125,41, +59,255,255,255,233,0,0,0,115,99,104,101,100,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,123,34,105,100,34,58,34,115,99,104,101,100,34,44,34,110,97,109,101,34,58,34,83,99,104,101,100,117, +108,101,114,34,44,34,116,121,112,101,34,58,34,115,99,104,101,100,117,108,101,114,34,44,34,105,99,111,110,34,58,34, +115,99,104,101,100,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,49,51,34,44,34,116,97,103, +115,34,58,34,116,111,111,108,44,115,121,115,116,101,109,44,97,108,97,114,109,34,44,34,102,105,108,101,115,34,58,34, +115,99,104,101,100,46,105,110,102,111,44,115,99,104,101,100,46,98,111,111,116,46,106,115,44,115,99,104,101,100,46,106, +115,44,115,99,104,101,100,46,105,109,103,44,115,99,104,101,100,44,115,99,104,101,100,46,115,101,116,116,105,110,103,115, +46,106,115,34,44,34,100,97,116,97,34,58,34,115,99,104,101,100,46,106,115,111,110,44,115,99,104,101,100,46,115,101, +116,116,105,110,103,115,46,106,115,111,110,34,125,255,255,255,9,42,0,0,97,108,97,114,109,46,97,112,112,46,106,115, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101, +100,40,34,116,105,109,101,95,117,116,105,108,115,34,44,170,40,41,123,174,79,78,69,95,83,69,67,79,78,68,61,49, +48,48,48,59,174,79,78,69,95,77,73,78,85,84,69,61,54,48,42,79,78,69,95,83,69,67,79,78,68,59,174,79, +78,69,95,72,79,85,82,61,54,48,42,79,78,69,95,77,73,78,85,84,69,59,174,79,78,69,95,68,65,89,61,50, +52,42,79,78,69,95,72,79,85,82,59,101,120,112,111,114,116,115,46,101,110,99,111,100,101,84,105,109,101,61,40,116, +105,109,101,41,162,123,116,105,109,101,61,115,97,102,101,84,105,109,101,40,116,105,109,101,41,59,171,116,105,109,101,46, +100,42,79,78,69,95,68,65,89,43,116,105,109,101,46,104,42,79,78,69,95,72,79,85,82,43,116,105,109,101,46,109, +42,79,78,69,95,77,73,78,85,84,69,43,116,105,109,101,46,115,42,79,78,69,95,83,69,67,79,78,68,59,125,170, +115,97,102,101,84,105,109,101,40,116,105,109,101,41,123,171,123,100,58,116,105,109,101,46,100,160,48,44,104,58,116,105, +109,101,46,104,160,48,44,109,58,116,105,109,101,46,109,160,48,44,115,58,116,105,109,101,46,115,160,48,125,59,125,101, +120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,61,40,109,105,108,108,105,115,41,162,123,163,40,191,109, +105,108,108,105,115,141,34,110,117,109,98,101,114,34,41,176,34,79,110,108,121,32,97,32,110,117,109,98,101,114,32,99, +97,110,32,98,101,32,100,101,99,111,100,101,100,34,59,172,100,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108, +108,105,115,47,79,78,69,95,68,65,89,41,59,109,105,108,108,105,115,151,100,42,79,78,69,95,68,65,89,59,172,104, +61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,72,79,85,82,41,59,109,105,108, +108,105,115,151,104,42,79,78,69,95,72,79,85,82,59,172,109,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108, +108,105,115,47,79,78,69,95,77,73,78,85,84,69,41,59,109,105,108,108,105,115,151,109,42,79,78,69,95,77,73,78, +85,84,69,59,172,115,61,77,97,116,104,46,102,108,111,111,114,40,109,105,108,108,105,115,47,79,78,69,95,83,69,67, +79,78,68,41,59,171,123,100,58,100,44,104,58,104,44,109,58,109,44,115,58,115,125,59,125,101,120,112,111,114,116,115, +46,102,111,114,109,97,116,84,105,109,101,61,40,118,97,108,117,101,41,162,123,172,116,105,109,101,61,115,97,102,101,84, +105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97,108,117,101,58,101,120,112,111,114,116, +115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163,40,116,105,109,101,46,100,140,48,41, +176,34,100,97,121,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,104,101,114,101,34,59,163,40,116,105,109, +101,46,104,60,48,160,116,105,109,101,46,104,62,50,51,41,176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58, +32,109,117,115,116,32,98,101,32,48,32,60,61,32,104,32,60,61,32,50,51,34,59,163,40,116,105,109,101,46,109,60, +48,160,116,105,109,101,46,109,62,53,57,41,176,34,73,110,118,97,108,105,100,32,118,97,108,117,101,58,32,109,117,115, +116,32,98,101,32,48,32,60,61,32,109,32,60,61,32,53,57,34,59,171,116,105,109,101,46,104,43,34,58,34,43,40, +34,48,34,43,116,105,109,101,46,109,41,46,115,117,98,115,116,114,40,45,50,41,59,125,101,120,112,111,114,116,115,46, +102,111,114,109,97,116,68,117,114,97,116,105,111,110,61,40,118,97,108,117,101,44,99,111,109,112,97,99,116,41,162,123, +99,111,109,112,97,99,116,61,99,111,109,112,97,99,116,160,181,59,172,100,117,114,97,116,105,111,110,61,34,34,59,172, +116,105,109,101,61,115,97,102,101,84,105,109,101,40,191,118,97,108,117,101,139,34,111,98,106,101,99,116,34,63,118,97, +108,117,101,58,101,120,112,111,114,116,115,46,100,101,99,111,100,101,84,105,109,101,40,118,97,108,117,101,41,41,59,163, +40,116,105,109,101,46,100,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,100,43,34,100,32,34,59,163, +40,116,105,109,101,46,104,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,104,43,34,104,32,34,59,163, +40,116,105,109,101,46,109,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,109,43,34,109,32,34,59,163, +40,116,105,109,101,46,115,62,48,41,100,117,114,97,116,105,111,110,150,116,105,109,101,46,115,43,34,115,34,100,117,114, +97,116,105,111,110,61,100,117,114,97,116,105,111,110,46,116,114,105,109,40,41,171,99,111,109,112,97,99,116,63,100,117, +114,97,116,105,111,110,46,114,101,112,108,97,99,101,40,34,32,34,44,34,34,41,58,100,117,114,97,116,105,111,110,59, +125,101,120,112,111,114,116,115,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105,115,61,40,41, +162,123,172,116,105,109,101,61,184,68,97,116,101,40,41,59,171,40,116,105,109,101,46,103,101,116,72,111,117,114,115,40, +41,42,51,54,48,48,43,116,105,109,101,46,103,101,116,77,105,110,117,116,101,115,40,41,42,54,48,43,116,105,109,101, +46,103,101,116,83,101,99,111,110,100,115,40,41,41,42,49,48,48,48,59,125,125,41,59,10,77,111,100,117,108,101,115, +46,97,100,100,67,97,99,104,101,100,40,34,100,97,116,101,95,117,116,105,108,115,34,44,170,40,41,123,101,120,112,111, +114,116,115,46,100,111,119,61,40,105,44,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,61,114,101, +113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,46,100,111,119,40,184,68,97,116,101,40,40,40,105,160,48,41, +43,51,46,53,41,42,56,54,52,48,48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105, +99,101,40,48,44,40,97,98,98,114,101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98, +114,101,118,105,97,116,101,100,138,50,63,100,111,119,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,100,111,119, +59,125,101,120,112,111,114,116,115,46,100,111,119,115,61,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,97, +98,98,114,101,118,105,97,116,101,100,41,162,123,172,100,111,119,115,61,91,93,59,172,108,111,99,97,108,101,61,114,101, +113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167,40,172,105,61,48,59,105,60,55,59,105,152,41,123,100, +111,119,115,46,112,117,115,104,40,101,120,112,111,114,116,115,46,100,111,119,40,105,43,40,102,105,114,115,116,68,97,121, +79,102,87,101,101,107,160,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,41,125,171,97,98,98,114,101,118,105, +97,116,101,100,138,50,63,100,111,119,115,46,109,97,112,40,100,111,119,162,100,111,119,46,116,111,85,112,112,101,114,67, +97,115,101,40,41,41,58,100,111,119,115,59,125,59,101,120,112,111,114,116,115,46,109,111,110,116,104,61,40,105,44,97, +98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104,61,114,101,113,117,105,114,101,40,34,108,111,99, +97,108,101,34,41,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48, +48,48,48,48,41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114, +101,118,105,97,116,101,100,138,50,41,63,49,58,49,48,48,41,59,171,97,98,98,114,101,118,105,97,116,101,100,138,50, +63,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115,101,40,41,58,109,111,110,116,104,59,125,101,120,112,111, +114,116,115,46,109,111,110,116,104,115,61,40,97,98,98,114,101,118,105,97,116,101,100,41,162,123,172,109,111,110,116,104, +115,61,91,93,59,172,108,111,99,97,108,101,61,114,101,113,117,105,114,101,40,34,108,111,99,97,108,101,34,41,59,167, +40,172,105,61,49,59,105,142,49,50,59,105,152,41,123,109,111,110,116,104,115,46,112,117,115,104,40,108,111,99,97,108, +101,46,109,111,110,116,104,40,184,68,97,116,101,40,40,105,45,48,46,53,41,42,50,54,50,56,48,48,48,48,48,48, +41,44,97,98,98,114,101,118,105,97,116,101,100,41,46,115,108,105,99,101,40,48,44,40,97,98,98,114,101,118,105,97, +116,101,100,138,50,41,63,49,58,49,48,48,41,41,59,125,171,97,98,98,114,101,118,105,97,116,101,100,138,50,63,109, +111,110,116,104,115,46,109,97,112,40,109,111,110,116,104,162,109,111,110,116,104,46,116,111,85,112,112,101,114,67,97,115, +101,40,41,41,58,109,111,110,116,104,115,59,125,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99, +104,101,100,40,34,98,117,122,122,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,112, +97,116,116,101,114,110,162,184,80,114,111,109,105,115,101,40,114,101,115,111,108,118,101,162,123,170,100,111,66,117,122,122, +40,41,123,163,40,112,97,116,116,101,114,110,138,34,34,41,114,101,115,111,108,118,101,40,41,59,172,99,61,112,97,116, +116,101,114,110,91,48,93,59,112,97,116,116,101,114,110,61,112,97,116,116,101,114,110,46,115,117,98,115,116,114,40,49, +41,59,174,66,85,90,90,95,87,69,65,75,61,48,46,50,53,44,66,85,90,90,95,83,84,82,79,78,71,61,49,59, +174,83,72,79,82,84,95,77,83,61,49,48,48,44,77,69,68,73,85,77,95,77,83,61,50,48,48,44,76,79,78,71, +95,77,83,61,53,48,48,59,163,40,99,138,34,46,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82, +84,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111, +117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,44,34,41,66,97,110,103,108,101,46, +98,117,122,122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,87,69,65,75,41,46,116,104,101,110,40,40, +41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34, +45,34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,87,69,65,75, +41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41, +41,59,164,163,40,99,138,34,58,34,41,66,97,110,103,108,101,46,98,117,122,122,40,83,72,79,82,84,95,77,83,44, +66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40, +100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,59,34,41,66,97,110,103,108,101,46,98,117,122, +122,40,77,69,68,73,85,77,95,77,83,44,66,85,90,90,95,83,84,82,79,78,71,41,46,116,104,101,110,40,40,41, +162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,41,59,164,163,40,99,138,34,61, +34,41,66,97,110,103,108,101,46,98,117,122,122,40,76,79,78,71,95,77,83,44,66,85,90,90,95,83,84,82,79,78, +71,41,46,116,104,101,110,40,40,41,162,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48, +41,41,59,164,115,101,116,84,105,109,101,111,117,116,40,100,111,66,117,122,122,44,49,48,48,41,59,125,100,111,66,117, +122,122,40,41,59,125,41,59,125,41,59,10,77,111,100,117,108,101,115,46,97,100,100,67,97,99,104,101,100,40,34,98, +117,122,122,95,109,101,110,117,34,44,170,40,41,123,101,120,112,111,114,116,115,46,112,97,116,116,101,114,110,61,170,40, +118,97,108,117,101,44,99,97,108,108,98,97,99,107,41,123,172,112,97,116,116,101,114,110,115,61,91,34,34,44,34,46, +34,44,34,58,34,44,34,46,46,34,44,34,58,58,34,44,34,44,34,44,34,59,34,44,34,44,44,34,44,34,59,59, +34,44,34,45,34,44,34,61,34,44,34,45,45,34,44,34,61,61,34,44,34,46,46,46,34,44,34,58,58,58,34,44, +34,45,45,45,34,44,34,59,59,59,34,44,34,61,61,61,34,93,59,171,123,118,97,108,117,101,58,77,97,116,104,46, +109,97,120,40,48,44,112,97,116,116,101,114,110,115,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,41,44,109, +105,110,58,48,44,109,97,120,58,112,97,116,116,101,114,110,115,46,108,101,110,103,116,104,45,49,44,102,111,114,109,97, +116,58,118,162,112,97,116,116,101,114,110,115,91,118,93,160,34,79,102,102,34,44,111,110,99,104,97,110,103,101,58,118, +162,123,114,101,113,117,105,114,101,40,34,98,117,122,122,34,41,46,112,97,116,116,101,114,110,40,112,97,116,116,101,114, +110,115,91,118,93,41,59,99,97,108,108,98,97,99,107,40,112,97,116,116,101,114,110,115,91,118,93,41,59,125,125,59, +125,125,41,59,10,66,97,110,103,108,101,46,108,111,97,100,87,105,100,103,101,116,115,40,41,59,10,66,97,110,103,108, +101,46,100,114,97,119,87,105,100,103,101,116,115,40,41,59,10,174,102,105,114,115,116,68,97,121,79,102,87,101,101,107, +61,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41,46,114,101,97,100,74,83,79,78,40,34,115, +101,116,116,105,110,103,46,106,115,111,110,34,44,180,41,160,123,125,41,46,102,105,114,115,116,68,97,121,79,102,87,101, +101,107,160,48,59,10,174,87,79,82,75,68,65,89,83,61,54,50,10,174,87,69,69,75,69,78,68,61,102,105,114,115, +116,68,97,121,79,102,87,101,101,107,63,49,57,50,58,54,53,59,10,174,69,86,69,82,89,95,68,65,89,61,102,105, +114,115,116,68,97,121,79,102,87,101,101,107,63,50,53,52,58,49,50,55,59,10,174,105,99,111,110,65,108,97,114,109, +79,110,61,34,92,48,34,43,97,116,111,98,40,34,71,66,105,66,65,65,65,65,65,65,65,65,65,65,89,65,89,65, +52,65,99,66,120,43,79,68,110,47,110,65,80,47,119,65,102,47,52,65,47,110,56,65,47,110,56,66,47,110,43,66, +47,110,43,66,47,110,43,66,47,110,43,66,47,104,43,66,47,52,43,65,47,43,56,65,47,47,56,65,102,47,52,65, +80,47,119,65,72,47,103,65,66,43,65,65,65,65,65,65,65,65,65,65,61,61,34,41,59,10,174,105,99,111,110,65, +108,97,114,109,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40, +34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106,103, +53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119,65, +102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119,77, +65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65, +65,65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43, +65,80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102, +52,80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72, +103,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,110,61,34,92,48,34,43,40,103,46,116,104,101,109, 101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65, -71,65,71,65,79,65,72,65,99,102,106,103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65, -102,53,47,103,102,53,47,103,102,53,119,65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77, -72,56,52,99,68,56,52,99,66,56,119,77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98, -40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,71,65,71,65,79,65,72,65,99,102,106, -103,53,47,53,119,68,47,56,65,72,47,43,65,80,53,47,65,80,53,47,65,102,53,47,103,102,53,47,103,102,53,119, -65,102,53,103,65,102,52,72,103,102,43,102,52,80,43,98,89,80,56,119,77,72,56,52,99,68,56,52,99,66,56,119, -77,65,101,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,110,61, -34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80,47, -47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65, -66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65, -65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65, -65,65,65,65,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65, -65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119, -65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89, -65,66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,41,59,10,174, -105,99,111,110,84,105,109,101,114,79,102,102,61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63, -97,116,111,98,40,34,71,66,106,66,65,80,47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43, -65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65, -65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52, -99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65, -80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103, -89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53, -72,103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65, -102,52,65,65,72,103,61,34,41,41,59,10,172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104, -101,100,34,41,46,103,101,116,65,108,97,114,109,115,40,41,59,10,170,104,97,110,100,108,101,70,105,114,115,116,68,97, -121,79,102,87,101,101,107,40,100,111,119,41,123,163,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,138,49,41, -123,163,40,40,100,111,119,38,49,41,138,49,41,123,100,111,119,150,49,50,55,59,125,164,163,40,40,100,111,119,38,49, -50,56,41,138,49,50,56,41,123,100,111,119,151,49,50,55,59,125,125,171,100,111,119,59,125,10,97,108,97,114,109,115, -46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97, -46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41, -41,59,10,170,115,104,111,119,77,97,105,110,77,101,110,117,40,41,123,174,109,101,110,117,61,123,34,34,58,123,34,116, -105,116,108,101,34,58,34,65,108,97,114,109,115,32,38,32,84,105,109,101,114,115,34,125,44,34,60,32,66,97,99,107, -34,58,40,41,162,108,111,97,100,40,41,44,34,78,101,119,46,46,46,34,58,40,41,162,115,104,111,119,78,101,119,77, -101,110,117,40,41,125,59,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,101,44,105,110,100,101,120,41,162, -123,172,108,97,98,101,108,61,101,46,116,105,109,101,114,63,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, -105,108,115,34,41,46,102,111,114,109,97,116,68,117,114,97,116,105,111,110,40,101,46,116,105,109,101,114,41,58,114,101, -113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116,84,105,109,101,40,101, -46,116,41,43,40,101,46,114,112,63,96,32,36,123,100,101,99,111,100,101,68,79,87,40,101,41,125,96,58,34,34,41, -59,109,101,110,117,91,108,97,98,101,108,93,61,123,118,97,108,117,101,58,101,46,111,110,63,40,101,46,116,105,109,101, -114,63,105,99,111,110,84,105,109,101,114,79,110,58,105,99,111,110,65,108,97,114,109,79,110,41,58,40,101,46,116,105, -109,101,114,63,105,99,111,110,84,105,109,101,114,79,102,102,58,105,99,111,110,65,108,97,114,109,79,102,102,41,44,111, -110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,101,46,116,105,109,101,114,63,115,104, -111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,58,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110, -117,44,49,48,44,101,44,105,110,100,101,120,41,125,59,125,41,59,10,109,101,110,117,91,34,65,100,118,97,110,99,101, -100,34,93,61,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,59,10,69,46,115,104,111, -119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,78,101,119,77,101,110,117,40,41,123,10,69,46, -115,104,111,119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,78,101,119,46,46,46,34,125,44, -34,60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,65,108,97,114, -109,34,58,40,41,162,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,183,44,183,41,44,34,84,105, -109,101,114,34,58,40,41,162,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,183,44,183,41,125,41, -59,10,125,170,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,40,115,101,108,101,99,116,101,100,65,108, -97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,97,108,97,114,109,73,110,100, -101,120,139,183,59,10,172,97,108,97,114,109,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,110,101, -119,68,101,102,97,117,108,116,65,108,97,114,109,40,41,59,10,97,108,97,114,109,46,100,111,119,61,104,97,110,100,108, -101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,108,97,114,109,46,100,111,119,41,59,10,163,40,115,101, -108,101,99,116,101,100,65,108,97,114,109,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,108,97,114,109, -44,115,101,108,101,99,116,101,100,65,108,97,114,109,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40, -34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116, -41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119, -32,65,108,97,114,109,34,58,34,69,100,105,116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40, -41,162,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97, -114,109,73,110,100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104, -111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,34,58,123,118,97,108,117,101,58,116,105,109, -101,46,104,44,102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44, -109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116, -105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,34,58,123,118,97,108,117,101,58,116,105,109,101,46,109,44, -102,111,114,109,97,116,58,118,162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44,109,105,110,58, -48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46, -109,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,111,110,44,111, -110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,111,110,61,118,125,44,34,82,101,112,101,97,116,34,58,123, -118,97,108,117,101,58,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,44,111,110,99,104,97,110,103,101,58, -40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117, -44,49,48,48,44,97,108,97,114,109,46,114,112,44,97,108,97,114,109,46,100,111,119,44,40,114,101,112,101,97,116,44, -100,111,119,41,162,123,97,108,97,114,109,46,114,112,61,114,101,112,101,97,116,59,97,108,97,114,109,46,100,111,119,61, -100,111,119,59,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, -41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104, -111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110, -100,101,120,41,59,125,41,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122, -95,109,101,110,117,34,41,46,112,97,116,116,101,114,110,40,97,108,97,114,109,46,118,105,98,114,97,116,101,44,118,162, -97,108,97,114,109,46,118,105,98,114,97,116,101,61,118,41,44,34,65,117,116,111,32,83,110,111,111,122,101,34,58,123, -118,97,108,117,101,58,97,108,97,114,109,46,97,115,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46, -97,115,61,118,125,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41, -125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,40,41,162,123, -69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105, -116,108,101,58,34,68,101,108,101,116,101,32,65,108,97,114,109,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105, -114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108, -97,114,109,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119, -77,97,105,110,77,101,110,117,40,41,59,125,164,123,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116, -105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116, -84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97, -114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110, -117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97, -108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101,41,123,10,97,108,97,114,109,46,116,61,114, -101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40, -116,105,109,101,41,59,10,97,108,97,114,109,46,108,97,115,116,61,97,108,97,114,109,46,116,60,114,101,113,117,105,114, -101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105, -108,108,105,115,40,41,63,184,68,97,116,101,40,41,46,103,101,116,68,97,116,101,40,41,58,48,59,10,163,40,97,108, -97,114,109,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40,97,108,97,114,109,41,59,125, -164,123,97,108,97,114,109,115,91,97,108,97,114,109,73,110,100,101,120,93,61,97,108,97,114,109,59,125,10,125,170,115, -97,118,101,65,110,100,82,101,108,111,97,100,40,41,123,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162, -101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108, -101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59,10,114,101,113,117,105,114,101, -40,34,115,99,104,101,100,34,41,46,115,101,116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,10,114,101,113, -117,105,114,101,40,34,115,99,104,101,100,34,41,46,114,101,108,111,97,100,40,41,59,10,97,108,97,114,109,115,46,102, -105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100, -111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59, -10,125,170,100,101,99,111,100,101,68,79,87,40,97,108,97,114,109,41,123,10,171,97,108,97,114,109,46,114,112,10,63, -114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,10,46,100,111,119,115,40,102,105,114,115, -116,68,97,121,79,102,87,101,101,107,44,50,41,10,46,109,97,112,40,40,100,97,121,44,105,110,100,101,120,41,162,97, -108,97,114,109,46,100,111,119,38,40,49,143,40,105,110,100,101,120,43,102,105,114,115,116,68,97,121,79,102,87,101,101, -107,41,41,63,100,97,121,58,34,95,34,41,10,46,106,111,105,110,40,34,34,41,10,46,116,111,76,111,119,101,114,67, -97,115,101,40,41,10,58,34,79,110,99,101,34,10,125,170,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101, -110,117,40,114,101,112,101,97,116,44,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41, -123,10,172,111,114,105,103,105,110,97,108,82,101,112,101,97,116,61,114,101,112,101,97,116,59,10,172,111,114,105,103,105, -110,97,108,68,111,119,61,100,111,119,59,10,172,105,115,67,117,115,116,111,109,61,114,101,112,101,97,116,158,100,111,119, -140,87,79,82,75,68,65,89,83,158,100,111,119,140,87,69,69,75,69,78,68,158,100,111,119,140,69,86,69,82,89,95, -68,65,89,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,82,101,112,101,97,116,32, -65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, -108,98,97,99,107,40,114,101,112,101,97,116,44,100,111,119,41,44,34,79,110,99,101,34,58,123,118,97,108,117,101,58, -33,114,101,112,101,97,116,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108, -108,98,97,99,107,40,181,44,69,86,69,82,89,95,68,65,89,41,125,44,34,87,111,114,107,100,97,121,115,34,58,123, -118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,79,82,75,68,65,89,83,44,111,110,99,104,97,110, -103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,79,82,75,68,65, -89,83,41,125,44,34,87,101,101,107,101,110,100,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111, -119,138,87,69,69,75,69,78,68,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67, -97,108,108,98,97,99,107,40,180,44,87,69,69,75,69,78,68,41,125,44,34,69,118,101,114,121,32,68,97,121,34,58, -123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,69,86,69,82,89,95,68,65,89,44,111,110,99,104, -97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,69,86,69,82, -89,95,68,65,89,41,125,44,34,67,117,115,116,111,109,34,58,123,118,97,108,117,101,58,105,115,67,117,115,116,111,109, -63,100,101,99,111,100,101,68,79,87,40,123,114,112,58,180,44,100,111,119,58,100,111,119,125,41,58,181,44,111,110,99, -104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,67,117,115,116,111,109,68,97, -121,115,77,101,110,117,44,49,48,44,105,115,67,117,115,116,111,109,63,100,111,119,58,69,86,69,82,89,95,68,65,89, -44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97, -116,44,111,114,105,103,105,110,97,108,68,111,119,41,125,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110, -117,41,59,10,125,170,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117,40,100,111,119,44,100,111,119, -67,104,97,110,103,101,67,97,108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114, -105,103,105,110,97,108,68,111,119,41,123,10,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34, -67,117,115,116,111,109,32,68,97,121,115,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,172,114,101,112,101, -97,116,61,100,111,119,62,48,59,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97, -116,44,114,101,112,101,97,116,63,100,111,119,58,69,86,69,82,89,95,68,65,89,41,125,125,59,10,114,101,113,117,105, -114,101,40,34,100,97,116,101,95,117,116,105,108,115,34,41,46,100,111,119,115,40,102,105,114,115,116,68,97,121,79,102, -87,101,101,107,41,46,102,111,114,69,97,99,104,40,40,100,97,121,44,105,41,162,123,109,101,110,117,91,100,97,121,93, -61,123,118,97,108,117,101,58,33,33,40,100,111,119,38,40,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87, -101,101,107,41,41,41,44,111,110,99,104,97,110,103,101,58,118,162,118,63,40,100,111,119,159,49,143,40,105,43,102,105, -114,115,116,68,97,121,79,102,87,101,101,107,41,41,58,40,100,111,119,157,126,40,49,143,40,105,43,102,105,114,115,116, -68,97,121,79,102,87,101,101,107,41,41,41,125,59,125,41,59,10,109,101,110,117,91,34,67,97,110,99,101,108,34,93, -61,40,41,162,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110, -117,44,49,48,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,44, -100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,10,69,46,115,104,111,119,77,101,110,117,40,109,101, -110,117,41,59,10,125,170,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,40,115,101,108,101,99,116,101, -100,84,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,116,105,109,101,114, -73,110,100,101,120,139,183,59,10,172,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41, -46,110,101,119,68,101,102,97,117,108,116,84,105,109,101,114,40,41,59,10,163,40,115,101,108,101,99,116,101,100,84,105, -109,101,114,41,123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,116,105,109,101,114,44,115,101,108,101,99,116,101, -100,84,105,109,101,114,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, -105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,116,105,109,101,114,46,116,105,109,101,114,41,59,10,174, -109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119,32,84,105,109, -101,114,34,58,34,69,100,105,116,32,84,105,109,101,114,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,112, -114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110, -100,101,120,44,116,105,109,101,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97, -105,110,77,101,110,117,40,41,59,125,44,34,72,111,117,114,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,104, -44,109,105,110,58,48,44,109,97,120,58,50,51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162, -116,105,109,101,46,104,61,118,125,44,34,77,105,110,117,116,101,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46, -109,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118, -162,116,105,109,101,46,109,61,118,125,44,34,83,101,99,111,110,100,115,34,58,123,118,97,108,117,101,58,116,105,109,101, -46,115,44,109,105,110,58,48,44,109,97,120,58,53,57,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110, -99,104,97,110,103,101,58,118,162,116,105,109,101,46,115,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97, -108,117,101,58,116,105,109,101,114,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46,111,110, -61,118,125,44,34,86,105,98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117, -34,41,46,112,97,116,116,101,114,110,40,116,105,109,101,114,46,118,105,98,114,97,116,101,44,118,162,116,105,109,101,114, -46,118,105,98,114,97,116,101,61,118,41,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110, -77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34, -93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101, -63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32,84,105,109,101,114,34,125,41,46,116,104,101,110,40, -40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108, -105,99,101,40,116,105,109,101,114,73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40, -41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,116,105,109,101,114,46,116,105,109,101,114,61, +65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65, +65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89,65, +66,103,89,65,72,47,43,65,72,47,43,65,65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,58,97,116,111,98, +40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43, +65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65, +65,65,102,103,65,65,53,119,65,65,119,119,65,66,103,89,65,66,103,89,65,66,103,89,65,72,47,43,65,72,47,43, +65,65,65,65,65,65,65,65,65,65,65,65,65,61,34,41,41,59,10,174,105,99,111,110,84,105,109,101,114,79,102,102, +61,34,92,48,34,43,40,103,46,116,104,101,109,101,46,100,97,114,107,63,97,116,111,98,40,34,71,66,106,66,65,80, +47,47,47,47,56,65,65,65,65,65,65,65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89, +65,66,103,89,65,65,47,119,65,65,47,119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,72, +103,65,119,102,52,66,103,98,89,66,103,119,77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65,102, +52,65,65,72,103,61,34,41,58,97,116,111,98,40,34,71,66,106,66,65,80,47,47,65,65,65,65,65,65,65,65,65, +65,65,65,65,65,65,72,47,43,65,72,47,43,65,66,103,89,65,66,103,89,65,66,103,89,65,65,47,119,65,65,47, +119,65,65,102,103,65,65,80,65,65,65,80,65,65,65,102,103,65,65,53,72,103,65,119,102,52,66,103,98,89,66,103, +119,77,66,103,52,99,72,56,52,99,72,56,119,77,65,65,98,89,65,65,102,52,65,65,72,103,61,34,41,41,59,10, +172,97,108,97,114,109,115,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,103,101,116,65,108,97,114, +109,115,40,41,59,10,170,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87,101,101,107,40,100,111,119,41, +123,163,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,138,49,41,123,163,40,40,100,111,119,38,49,41,138,49, +41,123,100,111,119,150,49,50,55,59,125,164,163,40,40,100,111,119,38,49,50,56,41,138,49,50,56,41,123,100,111,119, +151,49,50,55,59,125,125,171,100,111,119,59,125,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46, +116,105,109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70, +105,114,115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59,10,170,115,104,111,119,77,97,105,110, +77,101,110,117,40,41,123,174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,108,97,114,109, +115,32,38,32,84,105,109,101,114,115,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,108,111,97,100,40,41,44, +34,78,101,119,46,46,46,34,58,40,41,162,115,104,111,119,78,101,119,77,101,110,117,40,41,125,59,97,108,97,114,109, +115,46,102,111,114,69,97,99,104,40,40,101,44,105,110,100,101,120,41,162,123,172,108,97,98,101,108,61,101,46,116,105, +109,101,114,63,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,102,111,114,109,97,116, +68,117,114,97,116,105,111,110,40,101,46,116,105,109,101,114,41,58,114,101,113,117,105,114,101,40,34,116,105,109,101,95, +117,116,105,108,115,34,41,46,102,111,114,109,97,116,84,105,109,101,40,101,46,116,41,43,40,101,46,114,112,63,96,32, +36,123,100,101,99,111,100,101,68,79,87,40,101,41,125,96,58,34,34,41,59,109,101,110,117,91,108,97,98,101,108,93, +61,123,118,97,108,117,101,58,101,46,111,110,63,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101,114,79, +110,58,105,99,111,110,65,108,97,114,109,79,110,41,58,40,101,46,116,105,109,101,114,63,105,99,111,110,84,105,109,101, +114,79,102,102,58,105,99,111,110,65,108,97,114,109,79,102,102,41,44,111,110,99,104,97,110,103,101,58,40,41,162,115, +101,116,84,105,109,101,111,117,116,40,101,46,116,105,109,101,114,63,115,104,111,119,69,100,105,116,84,105,109,101,114,77, +101,110,117,58,115,104,111,119,69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,101,44,105,110,100,101,120, +41,125,59,125,41,59,10,109,101,110,117,91,34,65,100,118,97,110,99,101,100,34,93,61,40,41,162,115,104,111,119,65, +100,118,97,110,99,101,100,77,101,110,117,40,41,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59, +10,125,170,115,104,111,119,78,101,119,77,101,110,117,40,41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34, +58,123,34,116,105,116,108,101,34,58,34,78,101,119,46,46,46,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162, +115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,65,108,97,114,109,34,58,40,41,162,115,104,111,119,69,100, +105,116,65,108,97,114,109,77,101,110,117,40,183,44,183,41,44,34,84,105,109,101,114,34,58,40,41,162,115,104,111,119, +69,100,105,116,84,105,109,101,114,77,101,110,117,40,183,44,183,41,125,41,59,10,125,170,115,104,111,119,69,100,105,116, +65,108,97,114,109,77,101,110,117,40,115,101,108,101,99,116,101,100,65,108,97,114,109,44,97,108,97,114,109,73,110,100, +101,120,41,123,10,172,105,115,78,101,119,61,97,108,97,114,109,73,110,100,101,120,139,183,59,10,172,97,108,97,114,109, +61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,65,108,97,114, +109,40,41,59,10,97,108,97,114,109,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87, +101,101,107,40,97,108,97,114,109,46,100,111,119,41,59,10,163,40,115,101,108,101,99,116,101,100,65,108,97,114,109,41, +123,79,98,106,101,99,116,46,97,115,115,105,103,110,40,97,108,97,114,109,44,115,101,108,101,99,116,101,100,65,108,97, +114,109,41,59,125,10,172,116,105,109,101,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, +41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,59,10,174,109,101,110,117,61,123,34,34, +58,123,34,116,105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119,32,65,108,97,114,109,34,58,34,69,100,105, +116,32,65,108,97,114,109,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,112,114,101,112,97,114,101,65,108, +97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,44,116,105,109,101, +41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41, +59,125,44,34,72,111,117,114,34,58,123,118,97,108,117,101,58,116,105,109,101,46,104,44,102,111,114,109,97,116,58,118, +162,40,34,48,34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44,109,105,110,58,48,44,109,97,120,58,50,51, +44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77,105, +110,117,116,101,34,58,123,118,97,108,117,101,58,116,105,109,101,46,109,44,102,111,114,109,97,116,58,118,162,40,34,48, +34,43,118,41,46,115,117,98,115,116,114,40,45,50,41,44,109,105,110,58,48,44,109,97,120,58,53,57,44,119,114,97, +112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,109,61,118,125,44,34,69,110,97,98,108,101, +100,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46,111,110,44,111,110,99,104,97,110,103,101,58,118,162,97,108, +97,114,109,46,111,110,61,118,125,44,34,82,101,112,101,97,116,34,58,123,118,97,108,117,101,58,100,101,99,111,100,101, +68,79,87,40,97,108,97,114,109,41,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116,84,105,109,101,111,117, +116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117,44,49,48,48,44,97,108,97,114,109,46,114, +112,44,97,108,97,114,109,46,100,111,119,44,40,114,101,112,101,97,116,44,100,111,119,41,162,123,97,108,97,114,109,46, +114,112,61,114,101,112,101,97,116,59,97,108,97,114,109,46,100,111,119,61,100,111,119,59,97,108,97,114,109,46,116,61, 114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101, -40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,84,105,109,101,114,77, -101,110,117,44,49,48,44,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,125,125,41,59,125,59,125,10, -69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,84,105,109,101,114, -70,111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,123,10, -116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34, -41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,116,105,109,101,114,46,116,61,114,101,113,117, -105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101, -77,105,108,108,105,115,40,41,43,116,105,109,101,114,46,116,105,109,101,114,59,10,116,105,109,101,114,46,108,97,115,116, -61,48,59,10,163,40,116,105,109,101,114,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40, -116,105,109,101,114,41,59,125,164,123,97,108,97,114,109,115,91,116,105,109,101,114,73,110,100,101,120,93,61,116,105,109, -101,114,59,125,10,125,170,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,123,10,69,46,115,104,111, -119,77,101,110,117,40,123,34,34,58,123,34,116,105,116,108,101,34,58,34,65,100,118,97,110,99,101,100,34,125,44,34, -60,32,66,97,99,107,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,83,99,104,101,100, -117,108,101,114,32,83,101,116,116,105,110,103,115,34,58,40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40,34, -83,116,111,114,97,103,101,34,41,46,114,101,97,100,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106, -115,34,41,41,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,44,34,69,110,97, -98,108,101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,180,41,44,34,68,105,115,97,98,108, -101,32,65,108,108,34,58,40,41,162,101,110,97,98,108,101,65,108,108,40,181,41,44,34,68,101,108,101,116,101,32,65, -108,108,34,58,40,41,162,100,101,108,101,116,101,65,108,108,40,41,125,41,59,10,125,170,101,110,97,98,108,101,65,108, -108,40,111,110,41,123,10,163,40,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,111,110,138,33,111, -110,41,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,111,110,63,34,78,111,116, -104,105,110,103,32,116,111,32,69,110,97,98,108,101,34,58,34,78,111,116,104,105,110,103,32,116,111,32,68,105,115,97, -98,108,101,34,44,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32,65,108, -108,34,41,46,116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59, -125,164,123,69,46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44, -123,116,105,116,108,101,58,111,110,63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32, -65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109, -41,123,97,108,97,114,109,115,46,102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,41,162,123,97,108,97,114, -109,46,111,110,61,111,110,59,163,40,111,110,41,123,163,40,97,108,97,114,109,46,116,105,109,101,114,41,123,112,114,101, -112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101, -40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46, -116,105,109,101,114,41,41,125,164,123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108, -97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111, -100,101,84,105,109,101,40,97,108,97,114,109,46,116,41,41,125,125,125,41,59,115,97,118,101,65,110,100,82,101,108,111, -97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118,97,110, -99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,170,100,101,108,101,116,101,65,108,108,40,41,123,10,163, -40,97,108,97,114,109,115,46,108,101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,78, -111,116,104,105,110,103,32,116,111,32,100,101,108,101,116,101,34,44,34,68,101,108,101,116,101,32,65,108,108,34,41,46, -116,104,101,110,40,40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59,125,164,123,69, -46,115,104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116, -108,101,58,34,68,101,108,101,116,101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41, -162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,61,91,93,59,115,97,118,101,65,110,100,82,101, -108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118, -97,110,99,101,100,77,101,110,117,40,41,59,125,125,41,59,125,10,125,115,104,111,119,77,97,105,110,77,101,110,117,40, -41,59,255,255,132,4,0,0,97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,48,48,132,6,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,102,102,102,102,102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,17,102, -102,102,102,17,17,102,102,102,102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17,17,102,102,102, -17,17,17,17,17,102,102,102,102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17,17,22,102,102, -102,102,17,17,17,17,17,102,204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17,17,17,22,204, -204,204,204,204,204,204,204,204,204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204,204,204,204,204, -204,193,17,17,17,17,22,102,102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17,17,17,17,102, -102,17,17,17,17,76,204,204,67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17,20,204,204,195, -255,255,255,255,255,255,255,255,60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240,15,255,255,255, -243,76,204,196,17,17,17,102,102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204,17,17,17,102, -102,17,17,108,204,196,255,255,255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204,204,195,255,255, -255,255,255,240,15,255,255,255,255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240,15,255,255,255, -255,255,243,204,204,102,22,102,102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76,204,198,102,102, -102,102,108,204,195,255,255,255,255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204,79,255,255,255, -255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255, -255,255,255,244,204,198,102,102,102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102, -102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,255,255,255,255, -255,255,255,48,3,255,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,255,255,255, -255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255,204,204,102,102, -102,102,204,204,255,255,255,255,255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204,63,255,255,255, -255,255,52,63,48,0,63,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255,243,0,3,255, -255,255,255,243,204,204,102,102,102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244,204,198,102,102, -102,102,108,204,79,255,255,255,243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204,195,255,255,255, -52,63,255,255,255,255,48,47,255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255,255,255,243,255, -255,255,255,76,204,198,102,102,102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204,204,102,102,102, -102,102,102,204,204,195,255,243,255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108,204,196,255,255, -255,255,255,255,255,255,255,255,255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255,255,255,255,255, -255,244,204,204,102,102,102,102,102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204,102,102,102,102, -102,102,102,102,108,204,204,195,255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102,102,204,204,204, -67,255,255,255,255,255,255,52,204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255,255,51,68,204, -204,204,65,102,102,102,102,102,102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22,102,102,102,102, -102,102,102,102,17,17,22,204,204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97,17,17,102,102, -204,204,204,204,204,204,204,204,102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204,204,204,102,102, -102,102,97,17,22,102,102,102,102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,22,102,102,102, +40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,65,108,97,114,109,77, +101,110,117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101,120,41,59,125,41,125,44,34,86,105, +98,114,97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116, +101,114,110,40,97,108,97,114,109,46,118,105,98,114,97,116,101,44,118,162,97,108,97,114,109,46,118,105,98,114,97,116, +101,61,118,41,44,34,65,117,116,111,32,83,110,111,111,122,101,34,58,123,118,97,108,117,101,58,97,108,97,114,109,46, +97,115,44,111,110,99,104,97,110,103,101,58,118,162,97,108,97,114,109,46,97,115,61,118,125,44,34,67,97,110,99,101, +108,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,125,59,10,163,40,33,105,115,78,101,119,41, +123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,40,41,162,123,69,46,115,104,111,119,80,114,111,109,112,116, +40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116,101,32, +65,108,97,114,109,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105, +114,109,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,97,108,97,114,109,73,110,100,101,120,44,49,41,59, +115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125, +164,123,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46, +101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101,116,84,105,109,101,111,117,116,40,115,104,111,119, +69,100,105,116,65,108,97,114,109,77,101,110,117,44,49,48,44,97,108,97,114,109,44,97,108,97,114,109,73,110,100,101, +120,41,59,125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,112, +114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,97,108,97,114,109,73,110, +100,101,120,44,116,105,109,101,41,123,10,97,108,97,114,109,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101, +95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,10,97,108,97,114,109, +46,108,97,115,116,61,97,108,97,114,109,46,116,60,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108, +115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105,115,40,41,63,184,68,97,116,101, +40,41,46,103,101,116,68,97,116,101,40,41,58,48,59,10,163,40,97,108,97,114,109,73,110,100,101,120,139,183,41,123, +97,108,97,114,109,115,46,112,117,115,104,40,97,108,97,114,109,41,59,125,164,123,97,108,97,114,109,115,91,97,108,97, +114,109,73,110,100,101,120,93,61,97,108,97,114,109,59,125,10,125,170,115,97,118,101,65,110,100,82,101,108,111,97,100, +40,41,123,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105,109,101,114,139,183,41,46,102, +111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114,115,116,68,97,121,79,102,87, +101,101,107,40,97,46,100,111,119,41,41,59,10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,115,101, +116,65,108,97,114,109,115,40,97,108,97,114,109,115,41,59,10,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34, +41,46,114,101,108,111,97,100,40,41,59,10,97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,116,105, +109,101,114,139,183,41,46,102,111,114,69,97,99,104,40,97,162,97,46,100,111,119,61,104,97,110,100,108,101,70,105,114, +115,116,68,97,121,79,102,87,101,101,107,40,97,46,100,111,119,41,41,59,10,125,170,100,101,99,111,100,101,68,79,87, +40,97,108,97,114,109,41,123,10,171,97,108,97,114,109,46,114,112,10,63,114,101,113,117,105,114,101,40,34,100,97,116, +101,95,117,116,105,108,115,34,41,10,46,100,111,119,115,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,44,50, +41,10,46,109,97,112,40,40,100,97,121,44,105,110,100,101,120,41,162,97,108,97,114,109,46,100,111,119,38,40,49,143, +40,105,110,100,101,120,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,63,100,97,121,58,34,95,34,41, +10,46,106,111,105,110,40,34,34,41,10,46,116,111,76,111,119,101,114,67,97,115,101,40,41,10,58,34,79,110,99,101, +34,10,125,170,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117,40,114,101,112,101,97,116,44,100,111, +119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,41,123,10,172,111,114,105,103,105,110,97,108,82, +101,112,101,97,116,61,114,101,112,101,97,116,59,10,172,111,114,105,103,105,110,97,108,68,111,119,61,100,111,119,59,10, +172,105,115,67,117,115,116,111,109,61,114,101,112,101,97,116,158,100,111,119,140,87,79,82,75,68,65,89,83,158,100,111, +119,140,87,69,69,75,69,78,68,158,100,111,119,140,69,86,69,82,89,95,68,65,89,59,10,174,109,101,110,117,61,123, +34,34,58,123,34,116,105,116,108,101,34,58,34,82,101,112,101,97,116,32,65,108,97,114,109,34,125,44,34,60,32,66, +97,99,107,34,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97,116, +44,100,111,119,41,44,34,79,110,99,101,34,58,123,118,97,108,117,101,58,33,114,101,112,101,97,116,44,111,110,99,104, +97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,181,44,69,86,69,82, +89,95,68,65,89,41,125,44,34,87,111,114,107,100,97,121,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116, +158,100,111,119,138,87,79,82,75,68,65,89,83,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97, +110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,79,82,75,68,65,89,83,41,125,44,34,87,101,101,107,101,110, +100,115,34,58,123,118,97,108,117,101,58,114,101,112,101,97,116,158,100,111,119,138,87,69,69,75,69,78,68,44,111,110, +99,104,97,110,103,101,58,40,41,162,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,87,69, +69,75,69,78,68,41,125,44,34,69,118,101,114,121,32,68,97,121,34,58,123,118,97,108,117,101,58,114,101,112,101,97, +116,158,100,111,119,138,69,86,69,82,89,95,68,65,89,44,111,110,99,104,97,110,103,101,58,40,41,162,100,111,119,67, +104,97,110,103,101,67,97,108,108,98,97,99,107,40,180,44,69,86,69,82,89,95,68,65,89,41,125,44,34,67,117,115, +116,111,109,34,58,123,118,97,108,117,101,58,105,115,67,117,115,116,111,109,63,100,101,99,111,100,101,68,79,87,40,123, +114,112,58,180,44,100,111,119,58,100,111,119,125,41,58,181,44,111,110,99,104,97,110,103,101,58,40,41,162,115,101,116, +84,105,109,101,111,117,116,40,115,104,111,119,67,117,115,116,111,109,68,97,121,115,77,101,110,117,44,49,48,44,105,115, +67,117,115,116,111,109,63,100,111,119,58,69,86,69,82,89,95,68,65,89,44,100,111,119,67,104,97,110,103,101,67,97, +108,108,98,97,99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111, +119,41,125,125,59,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,67,117, +115,116,111,109,68,97,121,115,77,101,110,117,40,100,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108,108,98,97, +99,107,44,111,114,105,103,105,110,97,108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,41,123,10, +174,109,101,110,117,61,123,34,34,58,123,34,116,105,116,108,101,34,58,34,67,117,115,116,111,109,32,68,97,121,115,34, +125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,172,114,101,112,101,97,116,61,100,111,119,62,48,59,100,111,119, +67,104,97,110,103,101,67,97,108,108,98,97,99,107,40,114,101,112,101,97,116,44,114,101,112,101,97,116,63,100,111,119, +58,69,86,69,82,89,95,68,65,89,41,125,125,59,10,114,101,113,117,105,114,101,40,34,100,97,116,101,95,117,116,105, +108,115,34,41,46,100,111,119,115,40,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,46,102,111,114,69,97,99, +104,40,40,100,97,121,44,105,41,162,123,109,101,110,117,91,100,97,121,93,61,123,118,97,108,117,101,58,33,33,40,100, +111,119,38,40,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,41,44,111,110,99,104,97, +110,103,101,58,118,162,118,63,40,100,111,119,159,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107, +41,41,58,40,100,111,119,157,126,40,49,143,40,105,43,102,105,114,115,116,68,97,121,79,102,87,101,101,107,41,41,41, +125,59,125,41,59,10,109,101,110,117,91,34,67,97,110,99,101,108,34,93,61,40,41,162,115,101,116,84,105,109,101,111, +117,116,40,115,104,111,119,69,100,105,116,82,101,112,101,97,116,77,101,110,117,44,49,48,44,111,114,105,103,105,110,97, +108,82,101,112,101,97,116,44,111,114,105,103,105,110,97,108,68,111,119,44,100,111,119,67,104,97,110,103,101,67,97,108, +108,98,97,99,107,41,10,69,46,115,104,111,119,77,101,110,117,40,109,101,110,117,41,59,10,125,170,115,104,111,119,69, +100,105,116,84,105,109,101,114,77,101,110,117,40,115,101,108,101,99,116,101,100,84,105,109,101,114,44,116,105,109,101,114, +73,110,100,101,120,41,123,10,172,105,115,78,101,119,61,116,105,109,101,114,73,110,100,101,120,139,183,59,10,172,116,105, +109,101,114,61,114,101,113,117,105,114,101,40,34,115,99,104,101,100,34,41,46,110,101,119,68,101,102,97,117,108,116,84, +105,109,101,114,40,41,59,10,163,40,115,101,108,101,99,116,101,100,84,105,109,101,114,41,123,79,98,106,101,99,116,46, +97,115,115,105,103,110,40,116,105,109,101,114,44,115,101,108,101,99,116,101,100,84,105,109,101,114,41,59,125,10,172,116, +105,109,101,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101, +84,105,109,101,40,116,105,109,101,114,46,116,105,109,101,114,41,59,10,174,109,101,110,117,61,123,34,34,58,123,34,116, +105,116,108,101,34,58,105,115,78,101,119,63,34,78,101,119,32,84,105,109,101,114,34,58,34,69,100,105,116,32,84,105, +109,101,114,34,125,44,34,60,32,66,97,99,107,34,58,40,41,162,123,112,114,101,112,97,114,101,84,105,109,101,114,70, +111,114,83,97,118,101,40,116,105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,59,115,97, +118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,125,44,34, +72,111,117,114,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,104,44,109,105,110,58,48,44,109,97,120,58,50, +51,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,104,61,118,125,44,34,77, +105,110,117,116,101,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,109,44,109,105,110,58,48,44,109,97,120,58, +53,57,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,46,109,61,118,125,44,34, +83,101,99,111,110,100,115,34,58,123,118,97,108,117,101,58,116,105,109,101,46,115,44,109,105,110,58,48,44,109,97,120, +58,53,57,44,115,116,101,112,58,49,44,119,114,97,112,58,180,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109, +101,46,115,61,118,125,44,34,69,110,97,98,108,101,100,34,58,123,118,97,108,117,101,58,116,105,109,101,114,46,111,110, +44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46,111,110,61,118,125,44,34,68,101,108,101,116,101,32, +65,102,116,101,114,32,69,120,112,105,114,97,116,105,111,110,34,58,123,118,97,108,117,101,58,116,105,109,101,114,46,100, +101,108,44,111,110,99,104,97,110,103,101,58,118,162,116,105,109,101,114,46,100,101,108,61,118,125,44,34,86,105,98,114, +97,116,101,34,58,114,101,113,117,105,114,101,40,34,98,117,122,122,95,109,101,110,117,34,41,46,112,97,116,116,101,114, +110,40,116,105,109,101,114,46,118,105,98,114,97,116,101,44,118,162,116,105,109,101,114,46,118,105,98,114,97,116,101,61, +118,41,44,34,67,97,110,99,101,108,34,58,40,41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,125,59,10, +163,40,33,105,115,78,101,119,41,123,109,101,110,117,91,34,68,101,108,101,116,101,34,93,61,40,41,162,123,69,46,115, +104,111,119,80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101, +58,34,68,101,108,101,116,101,32,84,105,109,101,114,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41, +162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46,115,112,108,105,99,101,40,116,105,109,101,114, +73,110,100,101,120,44,49,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119,77,97,105, +110,77,101,110,117,40,41,59,125,164,123,116,105,109,101,114,46,116,105,109,101,114,61,114,101,113,117,105,114,101,40,34, +116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84,105,109,101,40,116,105,109,101,41,59,115,101, +116,84,105,109,101,111,117,116,40,115,104,111,119,69,100,105,116,84,105,109,101,114,77,101,110,117,44,49,48,44,116,105, +109,101,114,44,116,105,109,101,114,73,110,100,101,120,41,125,125,41,59,125,59,125,10,69,46,115,104,111,119,77,101,110, +117,40,109,101,110,117,41,59,10,125,170,112,114,101,112,97,114,101,84,105,109,101,114,70,111,114,83,97,118,101,40,116, +105,109,101,114,44,116,105,109,101,114,73,110,100,101,120,44,116,105,109,101,41,123,10,116,105,109,101,114,46,116,105,109, +101,114,61,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,101,110,99,111,100,101,84, +105,109,101,40,116,105,109,101,41,59,10,116,105,109,101,114,46,116,61,114,101,113,117,105,114,101,40,34,116,105,109,101, +95,117,116,105,108,115,34,41,46,103,101,116,67,117,114,114,101,110,116,84,105,109,101,77,105,108,108,105,115,40,41,43, +116,105,109,101,114,46,116,105,109,101,114,59,10,116,105,109,101,114,46,108,97,115,116,61,48,59,10,163,40,116,105,109, +101,114,73,110,100,101,120,139,183,41,123,97,108,97,114,109,115,46,112,117,115,104,40,116,105,109,101,114,41,59,125,164, +123,97,108,97,114,109,115,91,116,105,109,101,114,73,110,100,101,120,93,61,116,105,109,101,114,59,125,10,125,170,115,104, +111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,123,10,69,46,115,104,111,119,77,101,110,117,40,123,34,34, +58,123,34,116,105,116,108,101,34,58,34,65,100,118,97,110,99,101,100,34,125,44,34,60,32,66,97,99,107,34,58,40, +41,162,115,104,111,119,77,97,105,110,77,101,110,117,40,41,44,34,83,99,104,101,100,117,108,101,114,32,83,101,116,116, +105,110,103,115,34,58,40,41,162,101,118,97,108,40,114,101,113,117,105,114,101,40,34,83,116,111,114,97,103,101,34,41, +46,114,101,97,100,40,34,115,99,104,101,100,46,115,101,116,116,105,110,103,115,46,106,115,34,41,41,40,40,41,162,115, +104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,44,34,69,110,97,98,108,101,32,65,108,108,34,58, +40,41,162,101,110,97,98,108,101,65,108,108,40,180,41,44,34,68,105,115,97,98,108,101,32,65,108,108,34,58,40,41, +162,101,110,97,98,108,101,65,108,108,40,181,41,44,34,68,101,108,101,116,101,32,65,108,108,34,58,40,41,162,100,101, +108,101,116,101,65,108,108,40,41,125,41,59,10,125,170,101,110,97,98,108,101,65,108,108,40,111,110,41,123,10,163,40, +97,108,97,114,109,115,46,102,105,108,116,101,114,40,101,162,101,46,111,110,138,33,111,110,41,46,108,101,110,103,116,104, +138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,111,110,63,34,78,111,116,104,105,110,103,32,116,111,32,69, +110,97,98,108,101,34,58,34,78,111,116,104,105,110,103,32,116,111,32,68,105,115,97,98,108,101,34,44,111,110,63,34, +69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32,65,108,108,34,41,46,116,104,101,110,40, +40,41,162,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59,125,164,123,69,46,115,104,111,119, +80,114,111,109,112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,111,110, +63,34,69,110,97,98,108,101,32,65,108,108,34,58,34,68,105,115,97,98,108,101,32,65,108,108,34,125,41,46,116,104, +101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105,114,109,41,123,97,108,97,114,109,115,46, +102,111,114,69,97,99,104,40,40,97,108,97,114,109,44,105,41,162,123,97,108,97,114,109,46,111,110,61,111,110,59,163, +40,111,110,41,123,163,40,97,108,97,114,109,46,116,105,109,101,114,41,123,112,114,101,112,97,114,101,84,105,109,101,114, +70,111,114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113,117,105,114,101,40,34,116,105,109,101,95,117,116, +105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108,97,114,109,46,116,105,109,101,114,41,41,125,164, +123,112,114,101,112,97,114,101,65,108,97,114,109,70,111,114,83,97,118,101,40,97,108,97,114,109,44,105,44,114,101,113, +117,105,114,101,40,34,116,105,109,101,95,117,116,105,108,115,34,41,46,100,101,99,111,100,101,84,105,109,101,40,97,108, +97,114,109,46,116,41,41,125,125,125,41,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104,111,119, +77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41, +59,125,125,41,59,125,10,125,170,100,101,108,101,116,101,65,108,108,40,41,123,10,163,40,97,108,97,114,109,115,46,108, +101,110,103,116,104,138,48,41,123,69,46,115,104,111,119,65,108,101,114,116,40,34,78,111,116,104,105,110,103,32,116,111, +32,100,101,108,101,116,101,34,44,34,68,101,108,101,116,101,32,65,108,108,34,41,46,116,104,101,110,40,40,41,162,115, +104,111,119,65,100,118,97,110,99,101,100,77,101,110,117,40,41,41,59,125,164,123,69,46,115,104,111,119,80,114,111,109, +112,116,40,34,65,114,101,32,121,111,117,32,115,117,114,101,63,34,44,123,116,105,116,108,101,58,34,68,101,108,101,116, +101,32,65,108,108,34,125,41,46,116,104,101,110,40,40,99,111,110,102,105,114,109,41,162,123,163,40,99,111,110,102,105, +114,109,41,123,97,108,97,114,109,115,61,91,93,59,115,97,118,101,65,110,100,82,101,108,111,97,100,40,41,59,115,104, +111,119,77,97,105,110,77,101,110,117,40,41,59,125,164,123,115,104,111,119,65,100,118,97,110,99,101,100,77,101,110,117, +40,41,59,125,125,41,59,125,10,125,115,104,111,119,77,97,105,110,77,101,110,117,40,41,59,255,255,255,132,4,0,0, +97,108,97,114,109,46,105,109,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,132,6, +102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +102,102,102,17,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,17,17,102,102,102,102,17,17,102,102,102, +102,17,17,17,102,102,102,102,102,102,102,17,17,17,17,17,102,102,102,17,17,102,102,102,17,17,17,17,17,102,102,102, +102,102,97,17,17,17,17,22,102,102,204,204,204,204,102,102,97,17,17,17,17,22,102,102,102,102,17,17,17,17,17,102, +204,204,204,204,204,204,204,204,102,17,17,17,17,17,102,102,102,97,17,17,17,17,22,204,204,204,204,204,204,204,204,204, +204,97,17,17,17,17,22,102,102,97,17,17,17,17,28,204,204,204,204,204,204,204,204,204,204,193,17,17,17,17,22,102, +102,17,17,17,17,20,204,204,204,68,51,255,255,51,68,204,204,204,65,17,17,17,17,102,102,17,17,17,17,76,204,204, +67,255,255,255,255,255,255,52,204,204,196,17,17,17,17,102,102,17,17,17,20,204,204,195,255,255,255,255,255,255,255,255, +60,204,204,65,17,17,17,102,102,17,17,17,76,204,196,63,255,255,255,240,15,255,255,255,243,76,204,196,17,17,17,102, +102,17,17,17,204,204,79,255,255,255,255,240,15,255,255,255,255,244,204,204,17,17,17,102,102,17,17,108,204,196,255,255, +255,255,255,240,15,255,255,255,255,255,76,204,198,17,17,102,102,97,22,204,204,195,255,255,255,255,255,240,15,255,255,255, +255,255,60,204,204,97,22,102,102,97,102,204,204,63,255,255,255,255,255,240,15,255,255,255,255,255,243,204,204,102,22,102, +102,102,108,204,196,255,255,255,255,255,255,240,15,255,255,255,255,255,255,76,204,198,102,102,102,102,108,204,195,255,255,255, +255,255,255,240,15,255,255,255,255,255,255,60,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255, +255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255,255,255,255,240,15,255,255,255,255,255,255,244,204,198,102,102, +102,102,204,204,63,255,255,255,255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255, +255,255,255,240,15,255,255,255,255,255,255,243,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,48,3,255,255,255, +255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255,255,255,255,5,80,255,255,255,255,255,255,255,204,204,102,102, +102,102,204,204,255,255,255,255,255,255,255,5,80,63,255,255,255,255,255,255,204,204,102,102,102,102,204,204,255,255,255,255, +255,255,243,64,0,3,255,255,255,255,255,255,204,204,102,102,102,102,204,204,63,255,255,255,255,255,52,63,48,0,63,255, +255,255,255,243,204,204,102,102,102,102,204,204,63,255,255,255,255,243,67,255,243,0,3,255,255,255,255,243,204,204,102,102, +102,102,108,204,79,255,255,255,255,52,63,255,255,48,0,63,255,255,255,244,204,198,102,102,102,102,108,204,79,255,255,255, +243,67,255,255,255,243,0,3,255,255,255,244,204,198,102,102,102,102,108,204,195,255,255,255,52,63,255,255,255,255,48,47, +255,255,255,60,204,198,102,102,102,102,108,204,196,255,255,243,67,255,255,255,255,255,243,255,255,255,255,76,204,198,102,102, +102,102,102,204,204,63,255,52,63,255,255,255,255,255,255,255,255,255,243,204,204,102,102,102,102,102,102,204,204,195,255,243, +255,255,255,255,255,255,255,255,255,255,60,204,204,102,102,102,102,102,102,108,204,196,255,255,255,255,255,255,255,255,255,255, +255,255,76,204,198,102,102,102,102,102,102,102,204,204,79,255,255,255,255,255,255,255,255,255,255,244,204,204,102,102,102,102, +102,102,102,102,204,204,196,63,255,255,255,255,255,255,255,255,243,76,204,204,102,102,102,102,102,102,102,102,108,204,204,195, +255,255,255,255,255,255,255,255,60,204,204,198,102,102,102,102,102,102,102,102,102,204,204,204,67,255,255,255,255,255,255,52, +204,204,204,102,102,102,102,102,102,102,102,102,102,20,204,204,204,68,51,255,255,51,68,204,204,204,65,102,102,102,102,102, +102,102,102,102,97,17,28,204,204,204,204,204,204,204,204,204,204,193,17,22,102,102,102,102,102,102,102,102,17,17,22,204, +204,204,204,204,204,204,204,204,204,97,17,17,102,102,102,102,102,102,102,97,17,17,102,102,204,204,204,204,204,204,204,204, +102,102,17,17,22,102,102,102,102,102,102,97,17,22,102,102,102,102,204,204,204,204,102,102,102,102,97,17,22,102,102,102, +102,102,102,97,17,102,102,102,102,102,102,102,102,102,102,102,102,102,102,17,22,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, -102,102,102,102,102,102,102,102,95,1,0,0,97,108,97,114,109,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,61,123,97,114,101,97,58,34, -116,108,34,44,119,105,100,116,104,58,48,44,100,114,97,119,58,170,40,41,123,163,40,175,46,119,105,100,116,104,41,103, -46,114,101,115,101,116,40,41,46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,71,66,103,66,65,65,65, -65,65,65,65,65,65,66,103,65,68,104,104,119,68,68,119,119,71,80,56,89,71,102,43,89,77,102,43,77,77,47,47, -77,77,47,47,77,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,66,47,47, -103,68,47,47,119,68,47,47,119,65,65,65,65,65,68,119,65,65,66,103,65,65,65,65,65,65,65,65,65,34,41,44, -175,46,120,44,175,46,121,41,59,125,44,114,101,108,111,97,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,97, -108,97,114,109,34,93,46,119,105,100,116,104,61,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41, -46,114,101,97,100,74,83,79,78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49,41,160,91,93,41,46,115,111, -109,101,40,97,108,97,114,109,162,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109,46,104,105,100,100,101,110,141, -181,41,41,63,50,52,58,48,59,125,125,59,10,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101, -108,111,97,100,40,41,59,255,171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110,97,109,101,34,58,34,65,108, -97,114,109,115,34,44,34,115,114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106,115,34,44,34,105,99,111,110, -34,58,34,97,108,97,114,109,46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,51,49,34,44,34, -116,97,103,115,34,58,34,116,111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116,34,44,34,102,105,108,101,115, -34,58,34,97,108,97,114,109,46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46,106,115,44,97,108,97,114,109, -46,105,109,103,44,97,108,97,114,109,46,119,105,100,46,106,115,34,125,255, +95,1,0,0,97,108,97,114,109,46,119,105,100,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,61,123,97,114,101,97,58,34,116,108,34,44,119,105,100,116, +104,58,48,44,100,114,97,119,58,170,40,41,123,163,40,175,46,119,105,100,116,104,41,103,46,114,101,115,101,116,40,41, +46,100,114,97,119,73,109,97,103,101,40,97,116,111,98,40,34,71,66,103,66,65,65,65,65,65,65,65,65,65,66,103, +65,68,104,104,119,68,68,119,119,71,80,56,89,71,102,43,89,77,102,43,77,77,47,47,77,77,47,47,77,65,47,47, +65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,65,47,47,65,66,47,47,103,68,47,47,119,68,47,47, +119,65,65,65,65,65,68,119,65,65,66,103,65,65,65,65,65,65,65,65,65,34,41,44,175,46,120,44,175,46,121,41, +59,125,44,114,101,108,111,97,100,58,170,40,41,123,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,119, +105,100,116,104,61,40,114,101,113,117,105,114,101,40,39,83,116,111,114,97,103,101,39,41,46,114,101,97,100,74,83,79, +78,40,39,115,99,104,101,100,46,106,115,111,110,39,44,49,41,160,91,93,41,46,115,111,109,101,40,97,108,97,114,109, +162,97,108,97,114,109,46,111,110,158,40,97,108,97,114,109,46,104,105,100,100,101,110,141,180,41,41,63,50,52,58,48, +59,125,125,59,10,87,73,68,71,69,84,83,91,34,97,108,97,114,109,34,93,46,114,101,108,111,97,100,40,41,59,255, +171,0,0,0,97,108,97,114,109,46,105,110,102,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +123,34,105,100,34,58,34,97,108,97,114,109,34,44,34,110,97,109,101,34,58,34,65,108,97,114,109,115,34,44,34,115, +114,99,34,58,34,97,108,97,114,109,46,97,112,112,46,106,115,34,44,34,105,99,111,110,34,58,34,97,108,97,114,109, +46,105,109,103,34,44,34,118,101,114,115,105,111,110,34,58,34,48,46,51,50,34,44,34,116,97,103,115,34,58,34,116, +111,111,108,44,97,108,97,114,109,44,119,105,100,103,101,116,34,44,34,102,105,108,101,115,34,58,34,97,108,97,114,109, +46,105,110,102,111,44,97,108,97,114,109,46,97,112,112,46,106,115,44,97,108,97,114,109,46,105,109,103,44,97,108,97, +114,109,46,119,105,100,46,106,115,34,125,255, }; From 8458dfde3ce9cad0b35173f29635fdb44bbb5731 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 1 Jul 2022 12:03:11 +0100 Subject: [PATCH 0149/1183] Bangle.js2: Fix text size on buttons when they are tapped in E.showPrompt --- ChangeLog | 1 + libs/js/banglejs/E_showPrompt_Q3.js | 13 ++++++++----- libs/js/banglejs/E_showPrompt_Q3.min.js | 7 +++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index b55bdbdf39..586e25b912 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,7 @@ Puck.js: Immediately after flashing new firmware, Puck.js now does a self-test and sets its BLE to PASS or FAIL nRF52: Fix recent regression which stopped reconnection after a bluetooth disconnect (fix #2226) Bangle.js: Include the 'sched' library in installed apps (needed for alarm) (fix #2229) + Bangle.js2: Fix text size on buttons when they are tapped in E.showPrompt 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/js/banglejs/E_showPrompt_Q3.js b/libs/js/banglejs/E_showPrompt_Q3.js index 308d59af1e..4069da3c21 100644 --- a/libs/js/banglejs/E_showPrompt_Q3.js +++ b/libs/js/banglejs/E_showPrompt_Q3.js @@ -4,9 +4,9 @@ options.buttons = {"Yes":true,"No":false}; var loc = require("locale"); var btns = Object.keys(options.buttons); - var btnPos = []; - function draw() { - g.reset().setFont("6x8",2).setFontAlign(0,-1); + var btnPos; + function draw(highlightedButton) { + g.reset().setFont("6x8:2").setFontAlign(0,-1); var Y = Bangle.appRect.y; var W = g.getWidth(), H = g.getHeight()-Y, FH=g.getFontHeight(); var titleLines = g.wrapString(options.title, W-2); @@ -35,6 +35,7 @@ btns.forEach(btn=>buttonWidths += buttonPadding+g.stringWidth(loc.translate(btn))); } var x = (W-buttonWidths)/2; + btnPos = []; btns.forEach((btn,idx)=>{ btn = loc.translate(btn); var w = g.stringWidth(btn); @@ -52,7 +53,8 @@ btnPos.push({x1:x-bw-buttonPadding/2, x2:x+bw+buttonPadding/2, y1:y-30, y2:y+30, poly: poly}); - g.setColor(g.theme.bg2).fillPoly(poly).setColor(g.theme.fg2).drawPoly(poly).drawString(btn,x,y+1); + g.setColor(idx===highlightedButton ? g.theme.bgH : g.theme.bg2).fillPoly(poly). + setColor(idx===highlightedButton ? g.theme.fgH : g.theme.fg2).drawPoly(poly).drawString(btn,x,y+1); x += (buttonPadding+w)/2; }); Bangle.setLCDPower(1); // ensure screen is on @@ -68,7 +70,8 @@ btnPos.forEach((b,i)=>{ if (e.x > b.x1 && e.x < b.x2 && e.y > b.y1 && e.y < b.y2) { - g.setColor(g.theme.bgH).fillPoly(b.poly).setColor(g.theme.fgH).drawPoly(b.poly).drawString(btns[i],(b.x1+b.x2)/2,((b.y1+b.y2)/2)+1).flip(); + draw(i); // highlighted button + g.flip(); // write to screen E.showPrompt(); // remove resolve(options.buttons[btns[i]]); } diff --git a/libs/js/banglejs/E_showPrompt_Q3.min.js b/libs/js/banglejs/E_showPrompt_Q3.min.js index d6a523bfc0..7b603fc45c 100644 --- a/libs/js/banglejs/E_showPrompt_Q3.min.js +++ b/libs/js/banglejs/E_showPrompt_Q3.min.js @@ -1,4 +1,3 @@ -(function(v,f){f||(f={});f.buttons||(f.buttons={Yes:!0,No:!1});var r=require("locale"),m=Object.keys(f.buttons),w=[];g.clearRect(Bangle.appRect);if(!v)return Bangle.setUI(),Promise.resolve();(function(){g.reset().setFont("6x8",2).setFontAlign(0,-1);var k=Bangle.appRect.y,d=g.getWidth(),a=g.getHeight()-k,l=g.getFontHeight(),p=g.wrapString(f.title,d-2),t=g.wrapString(v||"",d-2),b=k+(a+(p.length-t.length)*l)/2-24;f.img&&(a=g.imageMetrics(f.img),g.drawImage(f.img,(d-a.width)/ -2,b-a.height/2),b+=4+a.height/2);p&&g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,k,d-1,k+4+p.length*l).drawString(p.join("\n"),d/2,k+2);g.setColor(g.theme.fg).setBgColor(g.theme.bg).drawString(t.join("\n"),d/2,b);b+=t.length*l+32;var n=0;g.setFontAlign(0,0);m.forEach(h=>n+=24+g.stringWidth(r.translate(h)));n>d&&(g.setFont("6x8"),n=0,m.forEach(h=>n+=24+g.stringWidth(r.translate(h))));var c=(d-n)/2;m.forEach((h,q)=>{h=r.translate(h);q=g.stringWidth(h);c+=(24+q)/2;var e=6+q/2,u=[c-e,b- -16,c+e,b-16,c+e+4,b-12,c+e+4,b+12,c+e,b+16,c-e,b+16,c-e-4,b+12,c-e-4,b-12,c-e,b-16];w.push({x1:c-e-12,x2:c+e+12,y1:b-30,y2:b+30,poly:u});g.setColor(g.theme.bg2).fillPoly(u).setColor(g.theme.fg2).drawPoly(u).drawString(h,c,b+1);c+=(24+q)/2});Bangle.setLCDPower(1)})();return new Promise(k=>{Bangle.setUI("touch",d=>{w.forEach((a,l)=>{d.x>a.x1&&d.xa.y1&&d.yl+=24+g.stringWidth(t.translate(k)));l>c&&(g.setFont("6x8"),l=0,p.forEach(k=>l+=24+g.stringWidth(t.translate(k))));var b=(c-l)/2;u=[];p.forEach((k,z)=>{k=t.translate(k);var v=g.stringWidth(k);b+=(24+v)/2;var d=6+v/2,w=[b-d,a-16,b+d,a-16,b+d+4,a-12,b+d+4,a+12,b+d,a+16,b-d,a+16,b-d-4,a+12,b-d-4,a-12,b-d,a-16];u.push({x1:b-d-12,x2:b+d+12,y1:a-30,y2:a+30,poly:w});g.setColor(z===m?g.theme.bgH:g.theme.bg2).fillPoly(w).setColor(z===m?g.theme.fgH: +g.theme.fg2).drawPoly(w).drawString(k,b,a+1);b+=(24+v)/2});Bangle.setLCDPower(1)}e||(e={});e.buttons||(e.buttons={Yes:!0,No:!1});var t=require("locale"),p=Object.keys(e.buttons),u;g.clearRect(Bangle.appRect);if(!x)return Bangle.setUI(),Promise.resolve();y();return new Promise(m=>{Bangle.setUI("touch",f=>{u.forEach((c,h)=>{f.x>c.x1&&f.xc.y1&&f.y Date: Sat, 2 Jul 2022 14:47:09 +0100 Subject: [PATCH 0150/1183] Outline of the challenge. --- src/jsutils.h | 1 + src/jswrap_date.c | 2 ++ src/jswrap_espruino.c | 44 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/jsutils.h b/src/jsutils.h index 5bb4b09815..18ec12e40e 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -320,6 +320,7 @@ typedef int64_t JsSysTime; #define JSPARSE_FUNCTION_LINENUMBER_NAME JS_HIDDEN_CHAR_STR"lin" // The line number offset of the function #define JS_EVENT_PREFIX "#on" #define JS_TIMEZONE_VAR "tz" +#define JS_DST_SETTINGS_VAR "dst" #define JS_GRAPHICS_VAR "gfx" #define JSPARSE_EXCEPTION_VAR "except" // when exceptions are thrown, they're stored in the root scope diff --git a/src/jswrap_date.c b/src/jswrap_date.c index af5b4fba5e..140572c55b 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -29,6 +29,8 @@ const short YDAYS[4] = {0,365,365*2,365*3+1}; const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; +// TODO DST + /// return time zone in minutes int jsdGetTimeZone() { return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index d6ce65266c..5b19f8ea0a 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1698,13 +1698,57 @@ Set the time zone to be used with `Date` objects. For example `E.setTimeZone(1)` will be GMT+0100 +Note that E.setTimeZone() will have no effect when daylight savings time rules have been set with E.setDST() + Time can be set with `setTime`. */ void jswrap_espruino_setTimeZone(JsVarFloat zone) { +// TODO Should have no effect when DST parameters are set jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_TIMEZONE_VAR, jsvNewFromInteger((int)(zone*60))); } +/*JSON{ + "type" : "staticmethod", + "class" : "E", + "name" : "setDST", + "generate" : "jswrap_espruino_setDST", + "params" : [ + ["dstOffset","int","The number of minutes daylight savings time adds to the clock (usually 60) - set to 0 to disable DST"], + ["timezone","int","The time zone, in minutes, when DST is not in effect - positive east of Greenwich"], + ["startDowNumber","int","The index of the day-of-week in the month when DST starts - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last"], + ["startDow","int","The day-of-week for the DST start calculation - 0 for Sunday, 6 for Saturday"], + ["startMonth","int","The number of the month that DST starts - 0 for January, 11 for December"], + ["startDayOffset","int","The number of days between the selected day-of-week and the actual day that DST starts - usually 0"], + ["startTimeOfDay","int","The number of minutes elapsed in the day before DST starts"], + ["endDowNumber","int","The index of the day-of-week in the month when DST ends - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last"], + ["endDow","int","The day-of-week for the DST end calculation - 0 for Sunday, 6 for Saturday"], + ["endMonth","int","The number of the month that DST ends - 0 for January, 11 for December"], + ["endDayOffset","int","The number of days between the selected day-of-week and the actual day that DST ends - usually 0"], + ["endTimeOfDay","int","The number of minutes elapsed in the day before DST ends"] + ] +} +Set the daylight savings time parameters to be used with `Date` objects. + +To determine what the dowNumber, dow, month, dayOffset and timeOfDay parameters should be, start with a sentence of the form +"DST starts on the last Sunday of March (plus 0 days) at 03:00". Since it's the last Sunday, we have startDowNumber = 4, and since +it's Sunday, we have startDow = 0. That it is March gives us startMonth = 2, and that the offset is zero days, we have +startDayOffset = 0. The time that DST starts gives us startTimeOfDay = 3*60. + +"DST ends on the Friday before the second Sunday in November at 02:00" would give us endDowNumber=1, endDow=0, endMonth=10, endDayOffset=-2 and endTimeOfDay=120. + +Using Ukraine as an example, we have a time which is 2 hours ahead of GMT in winter (EET) and 3 hours in summer (EEST). DST starts at 03:00 EET on the last Sunday in March, +and ends at 04:00 EEST on the last Sunday in October. So someone in Ukraine might call E.setDST(60,120,4,0,2,0,180,4,0,9,0,240) + +Note that when DST parameters are set (i.e. when dstOffset is not zero), E.setTimeZone() has no effect. +*/ +void jswrap_espruino_setDST(JsVarInt dstOffset, JsVarInt timezone, JsVarInt startDowNumber, JsVarInt startDow, jsVarInt startMonth, jsVarInt startDayOffset, + jsVarInt startTimeOfDay, jsVarInt endDowNumber, jsVarInt endDow, jsVarInt endMonth, jsVarInt endDayOffset, jsVarInt endTimeOfDay) { +// TODO implement this +} + + + /*JSON{ "type" : "staticmethod", "ifndef" : "SAVE_ON_FLASH", From 5493f1d09ba5c32f33023c8e57d7b81ecfe43030 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sat, 2 Jul 2022 16:49:25 +0100 Subject: [PATCH 0151/1183] E.setDST and E.setTimeZone --- src/jswrap_espruino.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 5b19f8ea0a..0b4c4c96eb 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1698,12 +1698,21 @@ Set the time zone to be used with `Date` objects. For example `E.setTimeZone(1)` will be GMT+0100 -Note that E.setTimeZone() will have no effect when daylight savings time rules have been set with E.setDST() +Note that `E.setTimeZone()` will have no effect when daylight savings time rules have been set with `E.setDST()` Time can be set with `setTime`. */ void jswrap_espruino_setTimeZone(JsVarFloat zone) { -// TODO Should have no effect when DST parameters are set + JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); + if ((dst) && (jsvIsArrayBuffer(dst)) (jsvGetLength(dst) == 12)) { + JsVar *offset = jsvArrayBufferGet(dst,0); + if ((jsvIsInt(offset)) && (!offset->varData)) { + jsvUnLock2(dst,offset); + return; + } + jsvUnLock(offset); + } + jsvUnlock(dst); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_TIMEZONE_VAR, jsvNewFromInteger((int)(zone*60))); } @@ -1730,7 +1739,7 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { } Set the daylight savings time parameters to be used with `Date` objects. -To determine what the dowNumber, dow, month, dayOffset and timeOfDay parameters should be, start with a sentence of the form +To determine what the `dowNumber, dow, month, dayOffset, timeOfDay` parameters should be, start with a sentence of the form "DST starts on the last Sunday of March (plus 0 days) at 03:00". Since it's the last Sunday, we have startDowNumber = 4, and since it's Sunday, we have startDow = 0. That it is March gives us startMonth = 2, and that the offset is zero days, we have startDayOffset = 0. The time that DST starts gives us startTimeOfDay = 3*60. @@ -1738,13 +1747,26 @@ startDayOffset = 0. The time that DST starts gives us startTimeOfDay = 3*60. "DST ends on the Friday before the second Sunday in November at 02:00" would give us endDowNumber=1, endDow=0, endMonth=10, endDayOffset=-2 and endTimeOfDay=120. Using Ukraine as an example, we have a time which is 2 hours ahead of GMT in winter (EET) and 3 hours in summer (EEST). DST starts at 03:00 EET on the last Sunday in March, -and ends at 04:00 EEST on the last Sunday in October. So someone in Ukraine might call E.setDST(60,120,4,0,2,0,180,4,0,9,0,240) +and ends at 04:00 EEST on the last Sunday in October. So someone in Ukraine might call `E.setDST(60,120,4,0,2,0,180,4,0,9,0,240);` -Note that when DST parameters are set (i.e. when dstOffset is not zero), E.setTimeZone() has no effect. +Note that when DST parameters are set (i.e. when `dstOffset` is not zero), `E.setTimeZone()` has no effect. */ void jswrap_espruino_setDST(JsVarInt dstOffset, JsVarInt timezone, JsVarInt startDowNumber, JsVarInt startDow, jsVarInt startMonth, jsVarInt startDayOffset, jsVarInt startTimeOfDay, jsVarInt endDowNumber, jsVarInt endDow, jsVarInt endMonth, jsVarInt endDayOffset, jsVarInt endTimeOfDay) { -// TODO implement this + JsVar dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT32, 12); + jsvArrayBufferSet(dst, 0, jsvNewFromInteger(dstOffset)); + jsvArrayBufferSet(dst, 1, jsvNewFromInteger(timezone)); + jsvArrayBufferSet(dst, 2, jsvNewFromInteger(startDowNumber)); + jsvArrayBufferSet(dst, 3, jsvNewFromInteger(startDow)); + jsvArrayBufferSet(dst, 4, jsvNewFromInteger(startMonth)); + jsvArrayBufferSet(dst, 5, jsvNewFromInteger(startDayOffset)); + jsvArrayBufferSet(dst, 6, jsvNewFromInteger(startTimeOfDay)); + jsvArrayBufferSet(dst, 7, jsvNewFromInteger(endDowNumber)); + jsvArrayBufferSet(dst, 8, jsvNewFromInteger(endDow)); + jsvArrayBufferSet(dst, 9, jsvNewFromInteger(endMonth)); + jsvArrayBufferSet(dst, 10,jsvNewFromInteger(endDayOffset)); + jsvArrayBufferSet(dst, 11,jsvNewFromInteger(endTimeOfDay)); + jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, dst); } From 4ff86bdf37929ad22c1f76382b85fab1521fd878 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sat, 2 Jul 2022 19:06:17 +0100 Subject: [PATCH 0152/1183] Start of date handling code --- src/TMP-dst.c | 72 ----------------------------------------------- src/jswrap_date.c | 56 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 72 deletions(-) delete mode 100644 src/TMP-dst.c diff --git a/src/TMP-dst.c b/src/TMP-dst.c deleted file mode 100644 index 02c68084fd..0000000000 --- a/src/TMP-dst.c +++ /dev/null @@ -1,72 +0,0 @@ -/** - -Temporary file by Deirdre O'Byrne for Daylight Savings Calculations - -*/ - -#include -#include - -int dayNumber(int y, int m, int d) { - int ans; - - if (m < 2) { - y--; - m+=12; - } - ans = (y/100); - ans = 365*y + (y>>2) - ans + (ans>>2) + 30*m + ((3*m+6)/5) + d - 719531; - return ans; -} - -int dstChangeDay(int y, int dow_number, int month, int dow, int day_offset) { - int m = month; - int ans; - if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. - if (++m > 11) { - y++; - m-=12; - } - } - ans = dayNumber(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN - if (dow_number == 4) { - ans -= 7 - (7 - ((ans + 4) % 7) + dow) % 7; - } else { - ans += 7 * dow_number + (14 + dow - ((ans + 4) % 7)) % 7; - } - ans -= day_offset; - return ans; -} - -void getDate(int day, int *y, int *m, int *date) { - int a = day + 135081; - int b,c,d,e; - a = (a-(a/146097)+146095)/36524; - a = day + a - (a>>2); - c = ((a<<2)+2877911)/1461; - d = 365*c + (c>>2); - b = a + 719600 - d; - e = (5*b-1)/153; - *date=b-30*e-((3*e)/5); - if (e<14) - *m=e-1; - else - *m=e-13; - if (e>13) - *y=c+1; - else - *y=c; -} - -int main(int argc, char *argv[]) { - int yr,y,m,d,day; - yr=atoi(argv[1]); - day=dstChangeDay(yr,4,2,0,0); - getDate(day,&y,&m,&d); - printf("Start : %04d/%02d/%02d ",y,m,d); - day=dstChangeDay(yr,4,9,0,0); - getDate(day,&y,&m,&d); - printf("End : %04d/%02d/%02d\n",y,m,d); -} - - diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 140572c55b..beab7d9f0f 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -29,6 +29,62 @@ const short YDAYS[4] = {0,365,365*2,365*3+1}; const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; +// Convert a y,m,d into a number of days since 1970. 0<=m<=11 +int dayNumber(int y, int m, int d) { + int ans; + + if (m < 2) { + y--; + m+=12; + } + ans = (y/100); + ans = 365*y + (y>>2) - ans + (ans>>2) + 30*m + ((3*m+6)/5) + d - 719531; + return ans; +} + +// Convert a number of days since 1970 into y,m,d. 0<=m<=11 +void getDate(int day, int *y, int *m, int *date) { + int a = day + 135081; + int b,c,d,e; + a = (a-(a/146097)+146095)/36524; + a = day + a - (a>>2); + c = ((a<<2)+2877911)/1461; + d = 365*c + (c>>2); + b = a + 719600 - d; + e = (5*b-1)/153; + *date=b-30*e-((3*e)/5); + if (e<14) + *m=e-2; + else + *m=e-14; + if (e>13) + *y=c+1; + else + *y=c; +} + +// Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y +int dstChangeDay(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, int is_start, int dst_offset, int timezone) { + int m = month; + int ans; + if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. + if (++m > 11) { + y++; + m-=12; + } + } + ans = dayNumber(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN + if (dow_number == 4) { + ans -= 7 - (7 - ((ans + 4) % 7) + dow) % 7; + } else { + ans += 7 * dow_number + (14 + dow - ((ans + 4) % 7)) % 7; + } + ans = (ans - day_offset) * 1440 + timeOfDay - timezone; + if (!is_start) ans -= dst_offset; + return ans*60; +} + + // TODO DST /// return time zone in minutes From 67ce31c93c481d5cfbf0a247ff159ecec4184ecf Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sat, 2 Jul 2022 21:09:21 +0100 Subject: [PATCH 0153/1183] Should now be able to determine whether DST active --- src/jswrap_date.c | 81 +++++++++++++++++++++++++++++++++++-------- src/jswrap_espruino.c | 4 +-- 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index beab7d9f0f..264778745c 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -30,7 +30,7 @@ const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\ const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; // Convert a y,m,d into a number of days since 1970. 0<=m<=11 -int dayNumber(int y, int m, int d) { +int getDayNumberFromDate(int y, int m, int d) { int ans; if (m < 2) { @@ -43,7 +43,7 @@ int dayNumber(int y, int m, int d) { } // Convert a number of days since 1970 into y,m,d. 0<=m<=11 -void getDate(int day, int *y, int *m, int *date) { +void getDateFromDayNumber(int day, int *y, int *m, int *date) { int a = day + 135081; int b,c,d,e; a = (a-(a/146097)+146095)/36524; @@ -52,28 +52,32 @@ void getDate(int day, int *y, int *m, int *date) { d = 365*c + (c>>2); b = a + 719600 - d; e = (5*b-1)/153; - *date=b-30*e-((3*e)/5); - if (e<14) - *m=e-2; - else - *m=e-14; - if (e>13) - *y=c+1; - else - *y=c; + if (date) *date=b-30*e-((3*e)/5); + if (m) { + if (e<14) + *m=e-2; + else + *m=e-14; + } + if (y) { + if (e>13) + *y=c+1; + else + *y=c; + } } // Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y -int dstChangeDay(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, int is_start, int dst_offset, int timezone) { +unsigned int getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, int is_start, int dst_offset, int timezone) { int m = month; - int ans; + unsigned int ans; if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. if (++m > 11) { y++; m-=12; } } - ans = dayNumber(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN + ans = getDayNumberFromDate(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN if (dow_number == 4) { ans -= 7 - (7 - ((ans + 4) % 7) + dow) % 7; } else { @@ -84,6 +88,55 @@ int dstChangeDay(int y, int dow_number, int month, int dow, int day_offset, int return ans*60; } +int jsdGetEffectiveTimeZone(JsVarFloat ms) { + JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); + if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { + unsigned int sec = ms/1000; + int y; + unsigned int dstStart,dstEnd; + JsVarInt dstSettings[12]; + JsvArrayBufferIterator it; + + jsvArrayBufferIteratorNew(&it, dst, 0); + y = 0; + while (y < 12) { + JsVar *setting = jsvArrayBufferIteratorGetValue(&it); + dstSettings[y++]=(JsVarInt)(setting->varData); + jsvUnlock(setting); + } + jsvArrayBufferIteratorFree(&it); + jsvUnLock(dst); + if (dstSetting[0]) { + getDateFromDayNumber(sec/86400,&y,0,0); + dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1]); + dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1]); + if (sec < dstStart) { + if (sec < dstEnd) { + if (dstStart < dstEnd) { + return dstSetting[1]; + } else { + return dstSetting[0] + dstSetting[1]; + } + } else { // dstEnd <= sec < dstStart + return dstSetting[0]; + } + } else { // sec >= dstStart + if (sec >= dstEnd) { + if (dstStart < dstEnd) { + return dstSetting[1]; + } else { + return dstSetting[0] + dstSetting[1]; + } + } else { // sec >= dstStart, sec < dstEnd + return dstSetting[0] + dstSetting[1]; + } + } + } + } else { + jsvUnLock(dst); + } + return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); +} // TODO DST diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 0b4c4c96eb..69badf4289 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1704,7 +1704,7 @@ Time can be set with `setTime`. */ void jswrap_espruino_setTimeZone(JsVarFloat zone) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); - if ((dst) && (jsvIsArrayBuffer(dst)) (jsvGetLength(dst) == 12)) { + if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12)) { JsVar *offset = jsvArrayBufferGet(dst,0); if ((jsvIsInt(offset)) && (!offset->varData)) { jsvUnLock2(dst,offset); @@ -1753,7 +1753,7 @@ Note that when DST parameters are set (i.e. when `dstOffset` is not zero), `E.se */ void jswrap_espruino_setDST(JsVarInt dstOffset, JsVarInt timezone, JsVarInt startDowNumber, JsVarInt startDow, jsVarInt startMonth, jsVarInt startDayOffset, jsVarInt startTimeOfDay, jsVarInt endDowNumber, jsVarInt endDow, jsVarInt endMonth, jsVarInt endDayOffset, jsVarInt endTimeOfDay) { - JsVar dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT32, 12); + JsVar dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT16, 12); jsvArrayBufferSet(dst, 0, jsvNewFromInteger(dstOffset)); jsvArrayBufferSet(dst, 1, jsvNewFromInteger(timezone)); jsvArrayBufferSet(dst, 2, jsvNewFromInteger(startDowNumber)); From f4ffcead0b9dd9d81063c2df71a450b27dcd5441 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sun, 3 Jul 2022 00:22:30 +0100 Subject: [PATCH 0154/1183] Much of the code written --- src/jswrap_date.c | 182 +++++++++++++++++++++++----------------------- src/jswrap_date.h | 1 + 2 files changed, 93 insertions(+), 90 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 264778745c..8ddc9e4ab9 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -19,13 +19,7 @@ #include "jslex.h" const int MSDAY = 24*60*60*1000; -const int YDAY = 365; -const int LDAY = 366; -const int FDAY = 4*365+1; const int BASE_DOW = 4; -const short DAYS[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365}; -const short LPDAYS[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366}; -const short YDAYS[4] = {0,365,365*2,365*3+1}; const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; @@ -68,7 +62,8 @@ void getDateFromDayNumber(int day, int *y, int *m, int *date) { } // Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y -unsigned int getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, int is_start, int dst_offset, int timezone) { +// If as_local_time is true, then returns the number of seconds in the timezone in effect, as opposed to GMT +JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time) { int m = month; unsigned int ans; if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. @@ -83,17 +78,20 @@ unsigned int getDstChangeTime(int y, int dow_number, int month, int dow, int day } else { ans += 7 * dow_number + (14 + dow - ((ans + 4) % 7)) % 7; } - ans = (ans - day_offset) * 1440 + timeOfDay - timezone; - if (!is_start) ans -= dst_offset; - return ans*60; + ans = (ans - day_offset) * 1440 + timeOfDay; + if (!as_local_time) { + ans -= timezone; + if (!is_start) ans -= dst_offset; + } + return ans*60.0; } -int jsdGetEffectiveTimeZone(JsVarFloat ms) { +// Returns the effective timezone in minutes east +// is_local_time is true if ms is referenced to local time, false if it's referenced to GMT +int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { - unsigned int sec = ms/1000; int y; - unsigned int dstStart,dstEnd; JsVarInt dstSettings[12]; JsvArrayBufferIterator it; @@ -107,27 +105,36 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms) { jsvArrayBufferIteratorFree(&it); jsvUnLock(dst); if (dstSetting[0]) { - getDateFromDayNumber(sec/86400,&y,0,0); - dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1]); - dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1]); + JsVarFloat sec = ms/1000; + JsVarFloat dstStart,dstEnd; + + getDateFromDayNumber(sec/86400,&y,0,0); + dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); + dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); if (sec < dstStart) { if (sec < dstEnd) { if (dstStart < dstEnd) { + if (is_dst) *is_dst = false; return dstSetting[1]; } else { + if (is_dst) *is_dst = true; return dstSetting[0] + dstSetting[1]; } } else { // dstEnd <= sec < dstStart + if (is_dst) *is_dst = false; return dstSetting[0]; } } else { // sec >= dstStart if (sec >= dstEnd) { if (dstStart < dstEnd) { + if (is_dst) *is_dst = false; return dstSetting[1]; } else { + if (is_dst) *is_dst = true; return dstSetting[0] + dstSetting[1]; } } else { // sec >= dstStart, sec < dstEnd + if (is_dst) *is_dst = true; return dstSetting[0] + dstSetting[1]; } } @@ -135,24 +142,30 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms) { } else { jsvUnLock(dst); } + if (is_dst) *is_dst = false; return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); } -// TODO DST +// TODO FIXME this needs to be called every time a TimeInDay is created or mangled. +void setCorrectTimeZone(TimeInDay *td) { + td->zone = 0; + td->zone = jsdGetEffectiveTimeZone(fromTimeInDay(td),true,&(td->is_dst)); +} /// return time zone in minutes -int jsdGetTimeZone() { - return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); -} +//int jsdGetTimeZone() { +// return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); +//} /* NOTE: we use / and % here because the compiler is smart enough to * condense them into one op. */ TimeInDay getTimeFromMilliSeconds(JsVarFloat ms_in, bool forceGMT) { TimeInDay t; - t.zone = forceGMT ? 0 : jsdGetTimeZone(); + t.zone = forceGMT ? 0 : jsdGetEffectiveTimeZone(ms_in, false, &(t.is_dst)); ms_in += t.zone*60000; t.daysSinceEpoch = (int)(ms_in / MSDAY); + if (forceGMT) t.is_dst = false; int ms = (int)(ms_in - ((JsVarFloat)t.daysSinceEpoch * MSDAY)); if (ms<0) { ms += MSDAY; @@ -177,43 +190,10 @@ JsVarFloat fromTimeInDay(TimeInDay *td) { // 2100 is out of range, the formlua is simplified // dow,date/day/month/year will always be in range CalendarDate getCalendarDate(int d) { - int y,m; - const short *mdays=DAYS; - CalendarDate date; - date.daysSinceEpoch = d; - - y=d / FDAY; - d=d - (y * FDAY); - if (d<0) { - d += FDAY; - y--; - } - y=y*4 + 1970; - - if (d>=YDAY) { - y=y+1; // Second year in four - 1971 - d=d-YDAY; - if (d>=YDAY) { - y=y+1; // Could be third or fourth year - d=d-YDAY; - if (d>=LDAY) { - y=y+1; // Definitly fourth - d=d-LDAY; - } else { // Third - leap year - mdays=LPDAYS; - } - } - } - - date.year=y; - - // Find the month - m=0; - while (mdays[m]year - 1970; - int f=y>>2; - int yf=y&3; - const short *mdays; - - int ydays=yf*YDAY; - - if (yf==2) { - mdays=LPDAYS; - } else { - mdays=DAYS; + while (date->month < 0) { + date->year--; + date->month += 12; } - - if (yf>=2) - ydays=ydays+1; - - int m = date->month%12; - if (m<0) m+=12; - - return f*FDAY+YDAYS[yf]+mdays[m]+date->day-1; + while (date->month > 11) { + date->year++; + date->month -= 12; + } + return getDayNumberFromDate(date->year, date->month, date->day); }; @@ -342,7 +311,7 @@ JsVar *jswrap_date_constructor(JsVar *args) { td.min = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 4))); td.sec = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 5))); td.ms = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 6))); - td.zone = jsdGetTimeZone(); + setCorrectTimeZone(&td); time = fromTimeInDay(&td); } @@ -357,16 +326,28 @@ JsVar *jswrap_date_constructor(JsVar *args) { "generate" : "jswrap_date_getTimezoneOffset", "return" : ["int32","The difference, in minutes, between UTC and local time"] } -This returns Espruino's time-zone offset from UTC, in minutes. - -This is set with `E.setTimeZone` and is System-wide. The value returned -has nothing to do with the instance of `Date` that it is called on. +This returns the time-zone offset from UTC, in minutes. */ int jswrap_date_getTimezoneOffset(JsVar *parent) { return -getTimeFromDateVar(parent, false/*system timezone*/).zone; } +/*JSON{ + "type" : "method", + "ifndef" : "SAVE_ON_FLASH", + "class" : "Date", + "name" : "getIsDST", + "generate" : "jswrap_date_getIsDST", + "return" : ["int32","true if daylight savings time is in effect"] +} +This returns a boolean indicating whether daylight savings time is in effect. + + */ +int jswrap_date_getIsDST(JsVar *parent) { + return getTimeFromDateVar(parent, false/*system timezone*/).is_dst ? 1 : 0; +} + /*JSON{ "type" : "method", @@ -541,6 +522,7 @@ JsVarFloat jswrap_date_setHours(JsVar *parent, int hoursValue, JsVar *minutesVal td.sec = jsvGetInteger(secondsValue); if (jsvIsNumeric(millisecondsValue)) td.ms = jsvGetInteger(millisecondsValue); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -566,6 +548,7 @@ JsVarFloat jswrap_date_setMinutes(JsVar *parent, int minutesValue, JsVar *second td.sec = jsvGetInteger(secondsValue); if (jsvIsNumeric(millisecondsValue)) td.ms = jsvGetInteger(millisecondsValue); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -588,6 +571,7 @@ JsVarFloat jswrap_date_setSeconds(JsVar *parent, int secondsValue, JsVar *millis td.sec = secondsValue; if (jsvIsNumeric(millisecondsValue)) td.ms = jsvGetInteger(millisecondsValue); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -606,6 +590,7 @@ JsVarFloat jswrap_date_setSeconds(JsVar *parent, int secondsValue, JsVar *millis JsVarFloat jswrap_date_setMilliseconds(JsVar *parent, int millisecondsValue) { TimeInDay td = getTimeFromDateVar(parent, false/*system timezone*/); td.ms = millisecondsValue; + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -627,6 +612,7 @@ JsVarFloat jswrap_date_setDate(JsVar *parent, int dayValue) { CalendarDate d = getCalendarDate(td.daysSinceEpoch); d.day = dayValue; td.daysSinceEpoch = fromCalenderDate(&d); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -652,6 +638,7 @@ JsVarFloat jswrap_date_setMonth(JsVar *parent, int monthValue, JsVar *dayValue) if (jsvIsNumeric(dayValue)) d.day = jsvGetInteger(dayValue); td.daysSinceEpoch = fromCalenderDate(&d); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -678,6 +665,7 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal if (jsvIsNumeric(dayValue)) d.day = jsvGetInteger(dayValue); td.daysSinceEpoch = fromCalenderDate(&d); + setCorrectTimeZone(&td); return jswrap_date_setTime(parent, fromTimeInDay(&td)); } @@ -783,7 +771,9 @@ static bool _parse_time(TimeInDay *time, int initialChars) { if (strcmp(tkstr,"GMT")==0 || strcmp(tkstr,"Z")==0) { time->zone = 0; jslGetNextToken(); - } + } else { + setCorrectTimeZone(&time); + } } if (lex->tk == '+' || lex->tk == '-') { int sign = lex->tk == '+' ? 1 : -1; @@ -794,14 +784,19 @@ static bool _parse_time(TimeInDay *time, int initialChars) { i = (i%100) + ((i/100)*60); time->zone = i*sign; jslGetNextToken(); - } - } + } else { + setCorrectTimeZone(&time); + } + } else { + setCorrectTimeZone(&time); + } return true; } } } } + setCorrectTimeZone(&time); return false; } @@ -826,6 +821,7 @@ JsVarFloat jswrap_date_parse(JsVar *str) { time.sec = 0; time.ms = 0; time.zone = 0; + time.is_dst = false; CalendarDate date = getCalendarDate(0); JsLex lex; @@ -837,7 +833,6 @@ JsVarFloat jswrap_date_parse(JsVar *str) { date.dow = getDay(jslGetTokenValueAsString()); if (date.month>=0) { // Aug 9, 1995 - time.zone = jsdGetTimeZone(); jslGetNextToken(); if (lex.tk == LEX_INT) { date.day = _parse_int(); @@ -846,14 +841,18 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.year = _parse_int(); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - } + } else { + setCorrectTimeZone(&time); + } } } } } else if (date.dow>=0) { + // Mon, 25 Dec 1995 time.zone = jsdGetTimeZone(); date.month = 0; jslGetNextToken(); @@ -867,10 +866,13 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.year = _parse_int(); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - } + } else { + setCorrectTimeZone(&time); + } } } } @@ -892,12 +894,13 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.day = _parse_int(); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_ID && jslGetTokenValueAsString()[0]=='T') { - time.zone = jsdGetTimeZone(); // if nothing given assume local time - // _parse_time will check for Z and adjust time accordingly _parse_time(&time, 1); - } + } else { + setCorrectTimeZone(&time); + } } } } @@ -906,6 +909,5 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslKill(); jslSetLex(oldLex); - time.daysSinceEpoch = fromCalenderDate(&date); return fromTimeInDay(&time); } diff --git a/src/jswrap_date.h b/src/jswrap_date.h index 78941477d5..798a632d29 100644 --- a/src/jswrap_date.h +++ b/src/jswrap_date.h @@ -17,6 +17,7 @@ typedef struct { int daysSinceEpoch; int ms,sec,min,hour; int zone; // timezone in minutes + bool is_dst; } TimeInDay; typedef struct { From 81a57e5d4598172c547c0792deba80c66d0710b3 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sun, 3 Jul 2022 12:56:49 +0100 Subject: [PATCH 0155/1183] Update jswrap_date.c --- src/jswrap_date.c | 60 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 8ddc9e4ab9..a59834d54b 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -65,7 +65,7 @@ void getDateFromDayNumber(int day, int *y, int *m, int *date) { // If as_local_time is true, then returns the number of seconds in the timezone in effect, as opposed to GMT JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time) { int m = month; - unsigned int ans; + int ans; if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. if (++m > 11) { y++; @@ -73,21 +73,23 @@ JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_o } } ans = getDayNumberFromDate(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN + // ((14 - ((ans + 4) % 7) + dow) % 7) is zero if 1st is our dow, 1 if 1st is the day before our dow etc if (dow_number == 4) { - ans -= 7 - (7 - ((ans + 4) % 7) + dow) % 7; + ans += ((14 - ((ans + 4) % 7) + dow) % 7) - 7; } else { - ans += 7 * dow_number + (14 + dow - ((ans + 4) % 7)) % 7; + ans += 7 * dow_number + (14 - ((ans + 4) % 7) + dow) % 7; } - ans = (ans - day_offset) * 1440 + timeOfDay; + ans = (ans + day_offset) * 1440 + timeOfDay; if (!as_local_time) { ans -= timezone; if (!is_start) ans -= dst_offset; } - return ans*60.0; + return 60.0*ans; } // Returns the effective timezone in minutes east // is_local_time is true if ms is referenced to local time, false if it's referenced to GMT +// if is_dst is not zero, then it will be set to true if DST is in effect int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { @@ -111,29 +113,36 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { getDateFromDayNumber(sec/86400,&y,0,0); dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); + // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStart= dstStart if (sec >= dstEnd) { if (dstStart < dstEnd) { + // Northern hemisphere - DST has ended if (is_dst) *is_dst = false; return dstSetting[1]; } else { + // Southern hemisphere - DST has started if (is_dst) *is_dst = true; return dstSetting[0] + dstSetting[1]; } } else { // sec >= dstStart, sec < dstEnd + // Northern hemisphere - DST has started for the summer if (is_dst) *is_dst = true; return dstSetting[0] + dstSetting[1]; } @@ -146,17 +155,12 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); } -// TODO FIXME this needs to be called every time a TimeInDay is created or mangled. +// this needs to be called just before a TimeInDay is used -- unless the TimeInDay timezone has been determined by other means. void setCorrectTimeZone(TimeInDay *td) { td->zone = 0; td->zone = jsdGetEffectiveTimeZone(fromTimeInDay(td),true,&(td->is_dst)); } -/// return time zone in minutes -//int jsdGetTimeZone() { -// return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); -//} - /* NOTE: we use / and % here because the compiler is smart enough to * condense them into one op. */ TimeInDay getTimeFromMilliSeconds(JsVarFloat ms_in, bool forceGMT) { @@ -185,10 +189,6 @@ JsVarFloat fromTimeInDay(TimeInDay *td) { return (JsVarFloat)(td->ms + (((td->hour*60+td->min - td->zone)*60+td->sec)*1000) + (JsVarFloat)td->daysSinceEpoch*MSDAY); } -// First calculate the number of four-year-interval, so calculation -// of leap year will be simple. Btw, because 2000 IS a leap year and -// 2100 is out of range, the formlua is simplified -// dow,date/day/month/year will always be in range CalendarDate getCalendarDate(int d) { CalendarDate date; @@ -249,6 +249,10 @@ The built-in class for handling Dates. timezone using the `E.setTimeZone(...)` function. For example `E.setTimeZone(1)` will be GMT+0100 + +*However* if you have daylight savings time set with `E.setDST(...)` then the timezone set +by `E.setTimeZone(...)` will be _ignored_. + */ /*JSON{ @@ -682,7 +686,7 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal } Converts to a String, eg: `Fri Jun 20 2014 14:52:20 GMT+0000` - **Note:** This uses whatever timezone was set with `E.setTimeZone()` + **Note:** This uses whatever timezone was set with `E.setTimeZone()` or `E.setDST()` */ JsVar *jswrap_date_toString(JsVar *parent) { TimeInDay time = getTimeFromDateVar(parent, false/*system timezone*/); @@ -746,6 +750,30 @@ JsVar *jswrap_date_toISOString(JsVar *parent) { return jsvVarPrintf("%d-%02d-%02dT%02d:%02d:%02d.%03dZ", date.year, date.month+1, date.day, time.hour, time.min, time.sec, time.ms); } +/*JSON{ + "type" : "method", + "class" : "Date", + "name" : "toLocalISOString", + "generate" : "jswrap_date_toLocalISOString", + "return" : ["JsVar","A String"] +} +Converts to a ISO 8601 String (with timezone information), eg: `2014-06-20T14:52:20.123-0500` + */ +JsVar *jswrap_date_toLocalISOString(JsVar *parent) { + TimeInDay time = getTimeFromDateVar(parent, false/*system timezone*/); + CalendarDate date = getCalendarDate(time.daysSinceEpoch); + char zonesign; + int zone; + if (time.zone<0) { + zone = -time.zone; + zonesign = '-'; + } else { + zone = +time.zone; + zonesign = '+'; + } + zone = 100*(zone/60) + (zone%60) + return jsvVarPrintf("%d-%02d-%02dT%02d:%02d:%02d.%03d%c%04d", date.year, date.month+1, date.day, time.hour, time.min, time.sec, time.ms, zonesign, zone); +} static JsVarInt _parse_int() { return (int)stringToIntWithRadix(jslGetTokenValueAsString(), 10, NULL, NULL); From 283b04e64d59677c5394a4b27fc25e5a3157628e Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sun, 3 Jul 2022 22:45:34 +0100 Subject: [PATCH 0156/1183] Now compiles --- src/jswrap_date.c | 9 +++--- src/jswrap_date.h | 9 ++++-- src/jswrap_espruino.c | 68 ++++++++++++++++++++++++------------------- src/jswrap_espruino.h | 1 + 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index a59834d54b..76f0580a97 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -94,15 +94,15 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { int y; - JsVarInt dstSettings[12]; + JsVarInt dstSetting[12]; JsvArrayBufferIterator it; jsvArrayBufferIteratorNew(&it, dst, 0); y = 0; while (y < 12) { JsVar *setting = jsvArrayBufferIteratorGetValue(&it); - dstSettings[y++]=(JsVarInt)(setting->varData); - jsvUnlock(setting); + dstSetting[y++]=setting->varData.integer; + jsvUnLock(setting); } jsvArrayBufferIteratorFree(&it); jsvUnLock(dst); @@ -771,7 +771,7 @@ JsVar *jswrap_date_toLocalISOString(JsVar *parent) { zone = +time.zone; zonesign = '+'; } - zone = 100*(zone/60) + (zone%60) + zone = 100*(zone/60) + (zone%60); return jsvVarPrintf("%d-%02d-%02dT%02d:%02d:%02d.%03d%c%04d", date.year, date.month+1, date.day, time.hour, time.min, time.sec, time.ms, zonesign, zone); } @@ -881,7 +881,6 @@ JsVarFloat jswrap_date_parse(JsVar *str) { } } else if (date.dow>=0) { // Mon, 25 Dec 1995 - time.zone = jsdGetTimeZone(); date.month = 0; jslGetNextToken(); if (lex.tk==',') { diff --git a/src/jswrap_date.h b/src/jswrap_date.h index 798a632d29..4e20d2c0b8 100644 --- a/src/jswrap_date.h +++ b/src/jswrap_date.h @@ -28,8 +28,11 @@ typedef struct { int dow; ///< 0..6, Sunday is 0 } CalendarDate; -/// return time zone in minutes -int jsdGetTimeZone(); +int getDayNumberFromDate(int y, int m, int d); +void getDateFromDayNumber(int day, int *y, int *m, int *date); +JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time); +int jstGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst); +void setCorrectTimeZone(TimeInDay *td); TimeInDay getTimeFromMilliSeconds(JsVarFloat ms_in, bool forceGMT); JsVarFloat fromTimeInDay(TimeInDay *td); CalendarDate getCalendarDate(int d); @@ -50,6 +53,7 @@ int jswrap_date_getDay(JsVar *parent); int jswrap_date_getDate(JsVar *parent); int jswrap_date_getMonth(JsVar *parent); int jswrap_date_getFullYear(JsVar *parent); +int jswrap_date_getIsDST(JsVar *parent); JsVarFloat jswrap_date_setHours(JsVar *parent, int hoursValue, JsVar *minutesValue, JsVar *secondsValue, JsVar *millisecondsValue); JsVarFloat jswrap_date_setMinutes(JsVar *parent, int minutesValue, JsVar *secondsValue, JsVar *millisecondsValue); @@ -62,5 +66,6 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal JsVar *jswrap_date_toString(JsVar *parent); JsVar *jswrap_date_toUTCString(JsVar *parent); JsVar *jswrap_date_toISOString(JsVar *parent); +JsVar *jswrap_date_toLocalISOString(JsVar *parent); JsVarFloat jswrap_date_parse(JsVar *str); diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 69badf4289..741b8622b9 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1706,13 +1706,13 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12)) { JsVar *offset = jsvArrayBufferGet(dst,0); - if ((jsvIsInt(offset)) && (!offset->varData)) { + if ((jsvIsInt(offset)) && (!offset->varData.integer)) { jsvUnLock2(dst,offset); return; } jsvUnLock(offset); } - jsvUnlock(dst); + jsvUnLock(dst); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_TIMEZONE_VAR, jsvNewFromInteger((int)(zone*60))); } @@ -1723,22 +1723,25 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { "name" : "setDST", "generate" : "jswrap_espruino_setDST", "params" : [ - ["dstOffset","int","The number of minutes daylight savings time adds to the clock (usually 60) - set to 0 to disable DST"], - ["timezone","int","The time zone, in minutes, when DST is not in effect - positive east of Greenwich"], - ["startDowNumber","int","The index of the day-of-week in the month when DST starts - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last"], - ["startDow","int","The day-of-week for the DST start calculation - 0 for Sunday, 6 for Saturday"], - ["startMonth","int","The number of the month that DST starts - 0 for January, 11 for December"], - ["startDayOffset","int","The number of days between the selected day-of-week and the actual day that DST starts - usually 0"], - ["startTimeOfDay","int","The number of minutes elapsed in the day before DST starts"], - ["endDowNumber","int","The index of the day-of-week in the month when DST ends - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last"], - ["endDow","int","The day-of-week for the DST end calculation - 0 for Sunday, 6 for Saturday"], - ["endMonth","int","The number of the month that DST ends - 0 for January, 11 for December"], - ["endDayOffset","int","The number of days between the selected day-of-week and the actual day that DST ends - usually 0"], - ["endTimeOfDay","int","The number of minutes elapsed in the day before DST ends"] + ["params","JsVarArray","An array containing the settings for DST"] ] } Set the daylight savings time parameters to be used with `Date` objects. +The parameters are +- dstOffset: The number of minutes daylight savings time adds to the clock (usually 60) - set to 0 to disable DST +- timezone: The time zone, in minutes, when DST is not in effect - positive east of Greenwich +- startDowNumber: The index of the day-of-week in the month when DST starts - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last +- startDow: The day-of-week for the DST start calculation - 0 for Sunday, 6 for Saturday +- startMonth: The number of the month that DST starts - 0 for January, 11 for December +- startDayOffset: The number of days between the selected day-of-week and the actual day that DST starts - usually 0 +- startTimeOfDay: The number of minutes elapsed in the day before DST starts +- endDowNumber: The index of the day-of-week in the month when DST ends - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last +- endDow: The day-of-week for the DST end calculation - 0 for Sunday, 6 for Saturday +- endMonth: The number of the month that DST ends - 0 for January, 11 for December +- endDayOffset: The number of days between the selected day-of-week and the actual day that DST ends - usually 0 +- endTimeOfDay: The number of minutes elapsed in the day before DST ends + To determine what the `dowNumber, dow, month, dayOffset, timeOfDay` parameters should be, start with a sentence of the form "DST starts on the last Sunday of March (plus 0 days) at 03:00". Since it's the last Sunday, we have startDowNumber = 4, and since it's Sunday, we have startDow = 0. That it is March gives us startMonth = 2, and that the offset is zero days, we have @@ -1751,24 +1754,29 @@ and ends at 04:00 EEST on the last Sunday in October. So someone in Ukraine migh Note that when DST parameters are set (i.e. when `dstOffset` is not zero), `E.setTimeZone()` has no effect. */ -void jswrap_espruino_setDST(JsVarInt dstOffset, JsVarInt timezone, JsVarInt startDowNumber, JsVarInt startDow, jsVarInt startMonth, jsVarInt startDayOffset, - jsVarInt startTimeOfDay, jsVarInt endDowNumber, jsVarInt endDow, jsVarInt endMonth, jsVarInt endDayOffset, jsVarInt endTimeOfDay) { - JsVar dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT16, 12); - jsvArrayBufferSet(dst, 0, jsvNewFromInteger(dstOffset)); - jsvArrayBufferSet(dst, 1, jsvNewFromInteger(timezone)); - jsvArrayBufferSet(dst, 2, jsvNewFromInteger(startDowNumber)); - jsvArrayBufferSet(dst, 3, jsvNewFromInteger(startDow)); - jsvArrayBufferSet(dst, 4, jsvNewFromInteger(startMonth)); - jsvArrayBufferSet(dst, 5, jsvNewFromInteger(startDayOffset)); - jsvArrayBufferSet(dst, 6, jsvNewFromInteger(startTimeOfDay)); - jsvArrayBufferSet(dst, 7, jsvNewFromInteger(endDowNumber)); - jsvArrayBufferSet(dst, 8, jsvNewFromInteger(endDow)); - jsvArrayBufferSet(dst, 9, jsvNewFromInteger(endMonth)); - jsvArrayBufferSet(dst, 10,jsvNewFromInteger(endDayOffset)); - jsvArrayBufferSet(dst, 11,jsvNewFromInteger(endTimeOfDay)); +void jswrap_espruino_setDST(JsVar *params) { + JsVar *dst; + JsvIterator it; + unsigned int i = 0; + + if (!jsvIsIterable(params)) return; + if (jsvGetLength(params) != 12) return; + jsvIteratorNew(&it,params,JSIF_DEFINED_ARRAY_ElEMENTS); + dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT16, 12); + while (i < 12) { + JsVar *val = jsvIteratorGetValue(&it); + if (jsvIsInt(val)) { + jsvArrayBufferSet(dst,i++,jsvNewFromInteger(val->varData.integer)); + } else { + jsvArrayBufferSet(dst,0,0); + jsvArrayBufferSet(dst,i++,0); + } + jsvIteratorNext(&it); + jsvUnLock(val); + } + jsvIteratorFree(&it); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, dst); } - /*JSON{ diff --git a/src/jswrap_espruino.h b/src/jswrap_espruino.h index 0ec5800569..6b7019c921 100644 --- a/src/jswrap_espruino.h +++ b/src/jswrap_espruino.h @@ -55,6 +55,7 @@ JsVar *jswrap_espruino_HSBtoRGB(JsVarFloat hue, JsVarFloat sat, JsVarFloat bri, void jswrap_espruino_setPassword(JsVar *pwd); void jswrap_espruino_lockConsole(); void jswrap_espruino_setTimeZone(JsVarFloat zone); +void jswrap_espruino_setDST(JsVar *params); JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers); void jswrap_espruino_asm(JsVar *callspec, JsVar *args); void jswrap_espruino_compiledC(JsVar *code); From d60896c54da958610121b250f6bb636846d779aa Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 00:04:42 +0100 Subject: [PATCH 0157/1183] Tabs to spaces, starting debugging --- src/jswrap_date.c | 147 ++++++++++++++++++++++-------------------- src/jswrap_espruino.c | 2 +- 2 files changed, 77 insertions(+), 72 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 76f0580a97..3afc7f51d0 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -17,6 +17,9 @@ #include "jsparse.h" #include "jshardware.h" #include "jslex.h" +#ifdef DEBUG +#include "jsinteractive.h" +#endif const int MSDAY = 24*60*60*1000; const int BASE_DOW = 4; @@ -48,7 +51,7 @@ void getDateFromDayNumber(int day, int *y, int *m, int *date) { e = (5*b-1)/153; if (date) *date=b-30*e-((3*e)/5); if (m) { - if (e<14) + if (e<14) *m=e-2; else *m=e-14; @@ -94,60 +97,62 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { int y; - JsVarInt dstSetting[12]; - JsvArrayBufferIterator it; - - jsvArrayBufferIteratorNew(&it, dst, 0); - y = 0; - while (y < 12) { - JsVar *setting = jsvArrayBufferIteratorGetValue(&it); - dstSetting[y++]=setting->varData.integer; - jsvUnLock(setting); - } - jsvArrayBufferIteratorFree(&it); - jsvUnLock(dst); - if (dstSetting[0]) { + JsVarInt dstSetting[12]; + JsvArrayBufferIterator it; + + jsvArrayBufferIteratorNew(&it, dst, 0); + y = 0; + while (y < 12) { + JsVar *setting = jsvArrayBufferIteratorGetValue(&it); +jsDebug(DBG_INFO,"Setting %d is %d\n",y,setting->varData.integer); + dstSetting[y++]=setting->varData.integer; + jsvUnLock(setting); + jsvArrayBufferIteratorNext(&it); + } + jsvArrayBufferIteratorFree(&it); + jsvUnLock(dst); + if (dstSetting[0]) { JsVarFloat sec = ms/1000; - JsVarFloat dstStart,dstEnd; + JsVarFloat dstStart,dstEnd; - getDateFromDayNumber(sec/86400,&y,0,0); - dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); - dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); - // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStart= dstStart - if (sec >= dstEnd) { - if (dstStart < dstEnd) { - // Northern hemisphere - DST has ended - if (is_dst) *is_dst = false; - return dstSetting[1]; - } else { - // Southern hemisphere - DST has started - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } - } else { // sec >= dstStart, sec < dstEnd - // Northern hemisphere - DST has started for the summer - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } + getDateFromDayNumber(sec/86400,&y,0,0); + dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); + dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); + // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStart= dstStart + if (sec >= dstEnd) { + if (dstStart < dstEnd) { + // Northern hemisphere - DST has ended + if (is_dst) *is_dst = false; + return dstSetting[1]; + } else { + // Southern hemisphere - DST has started + if (is_dst) *is_dst = true; + return dstSetting[0] + dstSetting[1]; + } + } else { // sec >= dstStart, sec < dstEnd + // Northern hemisphere - DST has started for the summer + if (is_dst) *is_dst = true; + return dstSetting[0] + dstSetting[1]; + } + } + } } else { jsvUnLock(dst); } @@ -202,12 +207,12 @@ CalendarDate getCalendarDate(int d) { int fromCalenderDate(CalendarDate *date) { while (date->month < 0) { - date->year--; - date->month += 12; + date->year--; + date->month += 12; } while (date->month > 11) { - date->year++; - date->month -= 12; + date->year++; + date->month -= 12; } return getDayNumberFromDate(date->year, date->month, date->day); }; @@ -315,7 +320,7 @@ JsVar *jswrap_date_constructor(JsVar *args) { td.min = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 4))); td.sec = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 5))); td.ms = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 6))); - setCorrectTimeZone(&td); + setCorrectTimeZone(&td); time = fromTimeInDay(&td); } @@ -800,8 +805,8 @@ static bool _parse_time(TimeInDay *time, int initialChars) { time->zone = 0; jslGetNextToken(); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } } if (lex->tk == '+' || lex->tk == '-') { int sign = lex->tk == '+' ? 1 : -1; @@ -813,11 +818,11 @@ static bool _parse_time(TimeInDay *time, int initialChars) { time->zone = i*sign; jslGetNextToken(); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } return true; } @@ -869,18 +874,18 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.year = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } } } } } else if (date.dow>=0) { - // Mon, 25 Dec 1995 + // Mon, 25 Dec 1995 date.month = 0; jslGetNextToken(); if (lex.tk==',') { @@ -898,8 +903,8 @@ JsVarFloat jswrap_date_parse(JsVar *str) { if (lex.tk == LEX_INT) { _parse_time(&time, 0); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } } } } @@ -921,13 +926,13 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.day = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_ID && jslGetTokenValueAsString()[0]=='T') { _parse_time(&time, 1); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(&time); + } } } } diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 741b8622b9..71643780b1 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1759,7 +1759,7 @@ void jswrap_espruino_setDST(JsVar *params) { JsvIterator it; unsigned int i = 0; - if (!jsvIsIterable(params)) return; + if (!jsvIsArray(params)) return; if (jsvGetLength(params) != 12) return; jsvIteratorNew(&it,params,JSIF_DEFINED_ARRAY_ElEMENTS); dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT16, 12); From 3d6ddf41b5aca28ba660cc99578a5d46b7f951a8 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 13:16:50 +0100 Subject: [PATCH 0158/1183] bugfixes --- src/jswrap_date.c | 53 ++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 3afc7f51d0..8e3ac0d464 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -17,9 +17,6 @@ #include "jsparse.h" #include "jshardware.h" #include "jslex.h" -#ifdef DEBUG -#include "jsinteractive.h" -#endif const int MSDAY = 24*60*60*1000; const int BASE_DOW = 4; @@ -66,16 +63,15 @@ void getDateFromDayNumber(int day, int *y, int *m, int *date) { // Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y // If as_local_time is true, then returns the number of seconds in the timezone in effect, as opposed to GMT -JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time) { - int m = month; +JsVarFloat getDstChangeTime(int y, int dow_number, int dow, int month, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time) { int ans; if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. - if (++m > 11) { + if (++month > 11) { y++; - m-=12; + month-=12; } } - ans = getDayNumberFromDate(y, m, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN + ans = getDayNumberFromDate(y, month, 1); // ans % 7 is 0 for THU; (ans + 4) % 7 is 0 for SUN // ((14 - ((ans + 4) % 7) + dow) % 7) is zero if 1st is our dow, 1 if 1st is the day before our dow etc if (dow_number == 4) { ans += ((14 - ((ans + 4) % 7) + dow) % 7) - 7; @@ -104,7 +100,6 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { y = 0; while (y < 12) { JsVar *setting = jsvArrayBufferIteratorGetValue(&it); -jsDebug(DBG_INFO,"Setting %d is %d\n",y,setting->varData.integer); dstSetting[y++]=setting->varData.integer; jsvUnLock(setting); jsvArrayBufferIteratorNext(&it); @@ -115,7 +110,7 @@ jsDebug(DBG_INFO,"Setting %d is %d\n",y,setting->varData.integer); JsVarFloat sec = ms/1000; JsVarFloat dstStart,dstEnd; - getDateFromDayNumber(sec/86400,&y,0,0); + getDateFromDayNumber((int)(sec/86400),&y,0,0); dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStartzone = 0; jslGetNextToken(); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(time); + } } if (lex->tk == '+' || lex->tk == '-') { int sign = lex->tk == '+' ? 1 : -1; @@ -818,18 +813,17 @@ static bool _parse_time(TimeInDay *time, int initialChars) { time->zone = i*sign; jslGetNextToken(); } else { - setCorrectTimeZone(&time); - } + setCorrectTimeZone(time); + } } else { - setCorrectTimeZone(&time); - } - + setCorrectTimeZone(time); + } return true; } } } } - setCorrectTimeZone(&time); + setCorrectTimeZone(time); return false; } @@ -856,6 +850,7 @@ JsVarFloat jswrap_date_parse(JsVar *str) { time.zone = 0; time.is_dst = false; CalendarDate date = getCalendarDate(0); + bool timezoneSet = false; JsLex lex; JsLex *oldLex = jslSetLex(&lex); @@ -874,18 +869,17 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.year = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - } else { - setCorrectTimeZone(&time); - } + timezoneSet = true; + } } } } } else if (date.dow>=0) { - // Mon, 25 Dec 1995 + // Mon, 25 Dec 1995 date.month = 0; jslGetNextToken(); if (lex.tk==',') { @@ -902,9 +896,8 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - } else { - setCorrectTimeZone(&time); - } + timezoneSet = true; + } } } } @@ -926,19 +919,19 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.day = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_ID && jslGetTokenValueAsString()[0]=='T') { _parse_time(&time, 1); - } else { - setCorrectTimeZone(&time); - } + timezoneSet = true; + } } } } } } + if (!timezoneSet) setCorrectTimeZone(&time); jslKill(); jslSetLex(oldLex); return fromTimeInDay(&time); From 58b82b67ec859b7871012483b61e24c74cdbe7ef Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 15:29:46 +0100 Subject: [PATCH 0159/1183] tabs to spaces, and bug fix --- src/jswrap_date.c | 89 ++++++++++++++++++++++--------------------- src/jswrap_espruino.c | 4 +- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 8e3ac0d464..de17f7478c 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -115,37 +115,37 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStart= dstStart - if (sec >= dstEnd) { - if (dstStart < dstEnd) { - // Northern hemisphere - DST has ended - if (is_dst) *is_dst = false; - return dstSetting[1]; - } else { - // Southern hemisphere - DST has started - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } - } else { // sec >= dstStart, sec < dstEnd - // Northern hemisphere - DST has started for the summer - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } + if (sec >= dstEnd) { + if (dstStart < dstEnd) { + // Northern hemisphere - DST has ended + if (is_dst) *is_dst = false; + return dstSetting[1]; + } else { + // Southern hemisphere - DST has started + if (is_dst) *is_dst = true; + return dstSetting[0] + dstSetting[1]; + } + } else { // sec >= dstStart, sec < dstEnd + // Northern hemisphere - DST has started for the summer + if (is_dst) *is_dst = true; + return dstSetting[0] + dstSetting[1]; + } } } } else { @@ -799,9 +799,10 @@ static bool _parse_time(TimeInDay *time, int initialChars) { if (strcmp(tkstr,"GMT")==0 || strcmp(tkstr,"Z")==0) { time->zone = 0; jslGetNextToken(); + if (lex->tk == LEX_EOF) return true; } else { - setCorrectTimeZone(time); - } + setCorrectTimeZone(time); + } } if (lex->tk == '+' || lex->tk == '-') { int sign = lex->tk == '+' ? 1 : -1; @@ -813,11 +814,11 @@ static bool _parse_time(TimeInDay *time, int initialChars) { time->zone = i*sign; jslGetNextToken(); } else { - setCorrectTimeZone(time); - } + setCorrectTimeZone(time); + } } else { - setCorrectTimeZone(time); - } + setCorrectTimeZone(time); + } return true; } } @@ -869,12 +870,12 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.year = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - timezoneSet = true; - } + timezoneSet = true; + } } } } @@ -896,8 +897,8 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { _parse_time(&time, 0); - timezoneSet = true; - } + timezoneSet = true; + } } } } @@ -919,12 +920,12 @@ JsVarFloat jswrap_date_parse(JsVar *str) { jslGetNextToken(); if (lex.tk == LEX_INT) { date.day = _parse_int(); - time.daysSinceEpoch = fromCalenderDate(&date); + time.daysSinceEpoch = fromCalenderDate(&date); jslGetNextToken(); if (lex.tk == LEX_ID && jslGetTokenValueAsString()[0]=='T') { _parse_time(&time, 1); - timezoneSet = true; - } + timezoneSet = true; + } } } } diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 71643780b1..22af914b26 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1705,8 +1705,8 @@ Time can be set with `setTime`. void jswrap_espruino_setTimeZone(JsVarFloat zone) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12)) { - JsVar *offset = jsvArrayBufferGet(dst,0); - if ((jsvIsInt(offset)) && (!offset->varData.integer)) { + JsVar *offset = jsvArrayBufferGet(dst,0); + if ((jsvIsInt(offset)) && (!offset->varData.integer)) { jsvUnLock2(dst,offset); return; } From 2f3e56f8d7a3c4bd63070932a75c53c44e12cd44 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 15:31:54 +0100 Subject: [PATCH 0160/1183] Incorrect test case! Assumed GMT rather than local --- tests/test_date.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_date.js b/tests/test_date.js index 26e89a1b1f..073e827048 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -18,7 +18,7 @@ gmt.forEach(function(n) { if (n[0]==n[1]) pass++; }); E.setTimeZone(2); var cest = [ -[ Date.parse("2011-10-20") , 1319068800000.0 ], +[ Date.parse("2011-10-20") , 1319061600000.0 ], [ Date.parse("2011-10-20T14:48:12.345") , 1319114892345.0 ], [ Date.parse("Aug 9, 1995") , 807919200000.0 ], [ new Date("Wed, 09 Aug 1995 00:00:00").getTime() , 807919200000.0 ], From 301dbfda1e97158630fc56d3bf662b23914ab1b8 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 16:24:00 +0100 Subject: [PATCH 0161/1183] Bug fix, and added tests for DST code --- src/jswrap_espruino.c | 21 +++++++-------------- tests/test_date.js | 12 +++++++++++- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 22af914b26..5c7586ffab 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1698,21 +1698,12 @@ Set the time zone to be used with `Date` objects. For example `E.setTimeZone(1)` will be GMT+0100 -Note that `E.setTimeZone()` will have no effect when daylight savings time rules have been set with `E.setDST()` +Note that `E.setTimeZone()` will have no effect when daylight savings time rules have been set with `E.setDST()`. The +timezone value will be stored, but never used so long as DST settings are in effect. Time can be set with `setTime`. */ void jswrap_espruino_setTimeZone(JsVarFloat zone) { - JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); - if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12)) { - JsVar *offset = jsvArrayBufferGet(dst,0); - if ((jsvIsInt(offset)) && (!offset->varData.integer)) { - jsvUnLock2(dst,offset); - return; - } - jsvUnLock(offset); - } - jsvUnLock(dst); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_TIMEZONE_VAR, jsvNewFromInteger((int)(zone*60))); } @@ -1766,10 +1757,12 @@ void jswrap_espruino_setDST(JsVar *params) { while (i < 12) { JsVar *val = jsvIteratorGetValue(&it); if (jsvIsInt(val)) { - jsvArrayBufferSet(dst,i++,jsvNewFromInteger(val->varData.integer)); + jsvArrayBufferSet(dst,i++,val); } else { - jsvArrayBufferSet(dst,0,0); - jsvArrayBufferSet(dst,i++,0); + JsVar *zero = jsvNewFromInteger(0); + jsvArrayBufferSet(dst,0,zero); + jsvArrayBufferSet(dst,i++,zero); + jsvUnLock(zero); } jsvIteratorNext(&it); jsvUnLock(val); diff --git a/tests/test_date.js b/tests/test_date.js index 073e827048..ff2eef91d9 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -33,4 +33,14 @@ var cest = [ cest.forEach(function(n) { if (n[0]==n[1]) pass++; }); -result = pass == gmt.length + cest.length; +// Northern hemisphere, +2h summer and +3h winter. Change last Sun Mar @ 3am and last Sun Oct @ 4am. +E.setDST(60,120,4,0,2,0,180,4,0,9,0,240); +var dst = [ +[ new Date("2011-02-10T14:12:00").toLocalISOString() , "2011-02-10T14:12:00.000+0200" ], +[ new Date("2011-06-11T11:12:00").toLocalISOString() , "2011-06-11T11:12:00.000+0300" ], +[ new Date("2011-11-04T09:25:00").toLocalISOString() , "2011-11-04T09:25:00.000+0200" ] +]; + +dst.forEach(function(n) { if (n[0]==n[1]) pass++; }); + +result = pass == gmt.length + cest.length + dst.length; From 2454adfe1508baef4a2ac66f139a6fff4718988f Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 17:17:33 +0100 Subject: [PATCH 0162/1183] Adding tests for 0.1s either side of DST changes --- tests/test_date.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_date.js b/tests/test_date.js index ff2eef91d9..d65e076dfa 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -38,7 +38,11 @@ E.setDST(60,120,4,0,2,0,180,4,0,9,0,240); var dst = [ [ new Date("2011-02-10T14:12:00").toLocalISOString() , "2011-02-10T14:12:00.000+0200" ], [ new Date("2011-06-11T11:12:00").toLocalISOString() , "2011-06-11T11:12:00.000+0300" ], -[ new Date("2011-11-04T09:25:00").toLocalISOString() , "2011-11-04T09:25:00.000+0200" ] +[ new Date("2011-11-04T09:25:00").toLocalISOString() , "2011-11-04T09:25:00.000+0200" ], +[ new Date("2011-03-27T00:59:59.9Z").toLocalISOString() , "2011-03-27T02:59:59.900+0200" ], +[ new Date("2011-03-27T01:00:00.1Z").toLocalISOString() , "2011-03-27T04:00:00.100+0300" ], +[ new Date("2011-10-30T00:59:59.9Z").toLocalISOString() , "2011-10-30T03:59:59.900+0300" ], +[ new Date("2011-10-30T01:00:00.1Z").toLocalISOString() , "2011-10-30T03:00:00.100+0200" ] ]; dst.forEach(function(n) { if (n[0]==n[1]) pass++; }); From 71f0d09dcb624f175bfaab6096b8df1d9e8b4c87 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 17:19:50 +0100 Subject: [PATCH 0163/1183] Correcting a comment - got seasons backwards --- tests/test_date.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_date.js b/tests/test_date.js index d65e076dfa..4d76363341 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -33,7 +33,7 @@ var cest = [ cest.forEach(function(n) { if (n[0]==n[1]) pass++; }); -// Northern hemisphere, +2h summer and +3h winter. Change last Sun Mar @ 3am and last Sun Oct @ 4am. +// Northern hemisphere, +2h winter and +3h summer. Change last Sun Mar @ 3am and last Sun Oct @ 4am. E.setDST(60,120,4,0,2,0,180,4,0,9,0,240); var dst = [ [ new Date("2011-02-10T14:12:00").toLocalISOString() , "2011-02-10T14:12:00.000+0200" ], From 6822cf78f3460eabda901da3fd9b3a0240aaf2d7 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 4 Jul 2022 17:34:40 +0100 Subject: [PATCH 0164/1183] Southern hemisphere tests revealed a bug! --- src/jswrap_date.c | 2 +- tests/test_date.js | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index de17f7478c..a885982c2c 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -128,7 +128,7 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { } else { // dstEnd <= sec < dstStart // Southern hemisphere - DST has ended for the winter if (is_dst) *is_dst = false; - return dstSetting[0]; + return dstSetting[1]; } } else { // sec >= dstStart if (sec >= dstEnd) { diff --git a/tests/test_date.js b/tests/test_date.js index 4d76363341..b6d9c0b105 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -40,11 +40,22 @@ var dst = [ [ new Date("2011-06-11T11:12:00").toLocalISOString() , "2011-06-11T11:12:00.000+0300" ], [ new Date("2011-11-04T09:25:00").toLocalISOString() , "2011-11-04T09:25:00.000+0200" ], [ new Date("2011-03-27T00:59:59.9Z").toLocalISOString() , "2011-03-27T02:59:59.900+0200" ], -[ new Date("2011-03-27T01:00:00.1Z").toLocalISOString() , "2011-03-27T04:00:00.100+0300" ], +[ new Date("2011-03-27T01:00:00.0Z").toLocalISOString() , "2011-03-27T04:00:00.000+0300" ], [ new Date("2011-10-30T00:59:59.9Z").toLocalISOString() , "2011-10-30T03:59:59.900+0300" ], -[ new Date("2011-10-30T01:00:00.1Z").toLocalISOString() , "2011-10-30T03:00:00.100+0200" ] +[ new Date("2011-10-30T01:00:00.0Z").toLocalISOString() , "2011-10-30T03:00:00.000+0200" ] ]; dst.forEach(function(n) { if (n[0]==n[1]) pass++; }); -result = pass == gmt.length + cest.length + dst.length; +// Southern hemisphere. -3h winter and -2h summer. Change 2nd Sun Mar @2am and 2nd Sun Oct @ 2am. +E.setDST(60,-180,1,0,9,0,120,1,0,2,0,120); +var dstSouth = [ +[ new Date("2011-03-13T03:59:59.9Z").toLocalISOString() , "2011-03-13T01:59:59.900-0200" ], +[ new Date("2011-03-13T04:00:00.0Z").toLocalISOString() , "2011-03-13T01:00:00.000-0300" ], +[ new Date("2011-10-09T04:59:59.9Z").toLocalISOString() , "2011-10-09T01:59:59.900-0300" ], +[ new Date("2011-10-09T05:00:00.0Z").toLocalISOString() , "2011-10-09T03:00:00.000-0200" ] +]; + +dstSouth.forEach(function(n) { if (n[0]==n[1]) pass++; }); + +result = pass == gmt.length + cest.length + dst.length + dstSouth.length; From c79fa0093fc95ca0f50fb3ec3dc1ed9d2fb75e9f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Jul 2022 09:27:49 +0100 Subject: [PATCH 0165/1183] nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications --- ChangeLog | 1 + libs/bluetooth/jswrap_bluetooth.c | 4 ++++ targets/nrf5x/bluetooth.c | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/ChangeLog b/ChangeLog index 586e25b912..01d3b8ebab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,7 @@ nRF52: Fix recent regression which stopped reconnection after a bluetooth disconnect (fix #2226) Bangle.js: Include the 'sched' library in installed apps (needed for alarm) (fix #2229) Bangle.js2: Fix text size on buttons when they are tapped in E.showPrompt + nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 3242a407dc..24cb176bf4 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -1249,6 +1249,10 @@ NRF.setServices({ }, onWrite : function(evt) { // optional console.log("Got ", evt.data); // an ArrayBuffer + }, + onWriteDesc : function(evt) { // optional - called when the 'cccd' descriptor is written + // for example this is called when notifications are requested by the client: + console.log("Notifications enabled = ", evt.data[0]&1); } } // more characteristics allowed diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index d31f640e4e..ed95858cdb 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -3029,6 +3029,13 @@ void jsble_set_services(JsVar *data) { bleGetWriteEventName(eventName, characteristic_handles.value_handle); jsvObjectSetChildAndUnLock(execInfo.root, eventName, writeCb); } + // Add + writeCb = jsvObjectGetChild(charVar, "onWriteDesc", 0); + if (writeCb) { + char eventName[12]; + bleGetWriteEventName(eventName, characteristic_handles.cccd_handle); + jsvObjectSetChildAndUnLock(execInfo.root, eventName, writeCb); + } jsvUnLock(charVar); From 00c832d34dbaee622c39beebce392a53bea42e76 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Jul 2022 09:31:55 +0100 Subject: [PATCH 0166/1183] code comments --- targets/nrf5x/bluetooth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index ed95858cdb..3e688027ad 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -3022,14 +3022,14 @@ void jsble_set_services(JsVar *data) { jsble_check_error(err_code); jsvUnLock(charValue); // unlock here in case we were storing data in a flat string - // Add Write callback + // Add onWrite callback JsVar *writeCb = jsvObjectGetChild(charVar, "onWrite", 0); if (writeCb) { char eventName[12]; bleGetWriteEventName(eventName, characteristic_handles.value_handle); jsvObjectSetChildAndUnLock(execInfo.root, eventName, writeCb); } - // Add + // Add onWriteDesc callback for writes to the CCCD writeCb = jsvObjectGetChild(charVar, "onWriteDesc", 0); if (writeCb) { char eventName[12]; From 3f145f948a4415304ed4f86edb1d97a4b813562e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Jul 2022 10:56:29 +0100 Subject: [PATCH 0167/1183] nRF5x: Move advertising_start and restart_softdevice outside of IRQs (MEMORY_BUSY warnings less likely now) --- ChangeLog | 1 + libs/bluetooth/bluetooth.h | 2 ++ targets/nrf5x/bluetooth.c | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 01d3b8ebab..339d890e5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,7 @@ Bangle.js: Include the 'sched' library in installed apps (needed for alarm) (fix #2229) Bangle.js2: Fix text size on buttons when they are tapped in E.showPrompt nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications + nRF5x: Move advertising_start and restart_softdevice outside of IRQs (MEMORY_BUSY warnings less likely now) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/bluetooth/bluetooth.h b/libs/bluetooth/bluetooth.h index 8af377e16c..5e8bb412af 100644 --- a/libs/bluetooth/bluetooth.h +++ b/libs/bluetooth/bluetooth.h @@ -139,6 +139,8 @@ typedef enum { BLEP_ERROR, //< Softdevice threw some error (code in data) BLEP_CONNECTED, //< Peripheral connected (address as buffer) BLEP_DISCONNECTED, //< Peripheral disconnected + BLEP_ADVERTISING_START, //< Start adevrtising - do it outside of IRQ because we may need to allocate JsVars + BLEP_RESTART_SOFTDEVICE, //< Perform a softdevice restart (again, we don't want to do this in an IRQ!) BLEP_RSSI_PERIPH, //< RSSI data from peripheral connection (rssi as data) BLEP_ADV_REPORT, //< Advertising received (as buffer) BLEP_RSSI_CENTRAL, //< RSSI data from central connection (rssi as data low byte, index in m_central_conn_handles as high byte ) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 3e688027ad..1f603c2bea 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -366,6 +366,14 @@ int jsble_exec_pending(IOEvent *event) { bleQueueEventAndUnLock(JS_EVENT_PREFIX"disconnect", reason); break; } + case BLEP_ADVERTISING_START: { + jsble_advertising_start(); // start advertising - we ignore the return code here + break; + } + case BLEP_RESTART_SOFTDEVICE: { + jsble_restart_softdevice(NULL); + break; + } case BLEP_RSSI_PERIPH: { JsVar *evt = jsvNewFromInteger((signed char)data); if (evt) jsiQueueObjectCallbacks(execInfo.root, BLE_RSSI_EVENT, &evt, 1); @@ -1179,7 +1187,7 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { { // the timeout for sd_ble_gap_adv_start expired - kick it off again bleStatus &= ~BLE_IS_ADVERTISING; // we still think we're advertising, but we stopped - jsble_advertising_start(); // ignore return code + jsble_queue_pending(BLEP_ADVERTISING_START, 0); // start advertising again } break; @@ -1298,12 +1306,11 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { nus_transmit_string(); // restart advertising after disconnection if (!(bleStatus & BLE_IS_SLEEPING)) - jsble_advertising_start(); // ignore return code + jsble_queue_pending(BLEP_ADVERTISING_START, 0); // start advertising again jsble_queue_pending(BLEP_DISCONNECTED, p_ble_evt->evt.gap_evt.params.disconnected.reason); } if ((bleStatus & BLE_NEEDS_SOFTDEVICE_RESTART) && !jsble_has_connection()) - jsble_restart_softdevice(NULL); - + jsble_queue_pending(BLEP_RESTART_SOFTDEVICE, 0); } break; case BLE_GAP_EVT_RSSI_CHANGED: { @@ -1905,7 +1912,7 @@ static void pm_evt_handler(pm_evt_t const * p_evt) { break; case PM_EVT_PEERS_DELETE_SUCCEEDED: - jsble_advertising_start(); // ignore return code + jsble_queue_pending(BLEP_ADVERTISING_START, 0); // start advertising again break; case PM_EVT_PEERS_DELETE_FAILED: @@ -2571,6 +2578,7 @@ void jsble_setup_advdata(ble_advdata_t *advdata) { } uint32_t jsble_advertising_start() { + // try not to call from IRQ as we might want to allocate JsVars if (bleStatus & BLE_IS_ADVERTISING) return 0; ble_advdata_t scanrsp; From 3fa203980bd813e290eecba4c879b8ad863e53bb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Jul 2022 11:12:45 +0100 Subject: [PATCH 0168/1183] free up some more memory for micro:bit 1 build again --- boards/MICROBIT1.blocklist | 6 +++++- src/jswrap_espruino.c | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/boards/MICROBIT1.blocklist b/boards/MICROBIT1.blocklist index 0c8d8549e7..91bdf95ad5 100644 --- a/boards/MICROBIT1.blocklist +++ b/boards/MICROBIT1.blocklist @@ -1,3 +1,7 @@ [ - {"class":"OneWire","name":"*"} + {"class":"OneWire","name":"*"}, + {"class":"Array","name":"every"}, + {"class":"Array","name":"some"}, + {"class":"SPI","name":"send4bit"}, + {"class":"NRF","name":"getBattery"} ] diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index d6ce65266c..09ea3fc057 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1143,6 +1143,7 @@ void jswrap_espruino_dumpFreeList() { "type" : "staticmethod", "class" : "E", "name" : "dumpFragmentation", + "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_e_dumpFragmentation" } Show fragmentation. From 333cb9b304667054cd337f45a77fd311a02dd6d8 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Tue, 5 Jul 2022 15:03:45 +0100 Subject: [PATCH 0169/1183] Fixes arising from code review --- libs/filesystem/jswrap_fs.c | 2 +- src/jswrap_date.c | 19 +++++++++++-------- src/jswrap_espruino.c | 17 +---------------- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/libs/filesystem/jswrap_fs.c b/libs/filesystem/jswrap_fs.c index 36375c12d0..bfae83a008 100755 --- a/libs/filesystem/jswrap_fs.c +++ b/libs/filesystem/jswrap_fs.c @@ -351,7 +351,7 @@ JsVar *jswrap_fs_stat(JsVar *path) { td.min = (int)((info.ftime>>5)&63); td.sec = (int)((info.ftime)&63); td.ms = 0; - td.zone = jsdGetTimeZone(); // TomWS: add adjustment for timezone offset introduced in date_from_milliseconds + setCorrectTimeZone(&td); // TomWS: add adjustment for timezone offset introduced in date_from_milliseconds jsvObjectSetChildAndUnLock(obj, "mtime", jswrap_date_from_milliseconds(fromTimeInDay(&td))); return obj; } diff --git a/src/jswrap_date.c b/src/jswrap_date.c index a885982c2c..a613cda9a0 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -24,6 +24,7 @@ const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\ const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; // Convert a y,m,d into a number of days since 1970. 0<=m<=11 +// https://github.com/deirdreobyrne/CalendarAndDST int getDayNumberFromDate(int y, int m, int d) { int ans; @@ -37,6 +38,7 @@ int getDayNumberFromDate(int y, int m, int d) { } // Convert a number of days since 1970 into y,m,d. 0<=m<=11 +// https://github.com/deirdreobyrne/CalendarAndDST void getDateFromDayNumber(int day, int *y, int *m, int *date) { int a = day + 135081; int b,c,d,e; @@ -63,6 +65,7 @@ void getDateFromDayNumber(int day, int *y, int *m, int *date) { // Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y // If as_local_time is true, then returns the number of seconds in the timezone in effect, as opposed to GMT +// https://github.com/deirdreobyrne/CalendarAndDST JsVarFloat getDstChangeTime(int y, int dow_number, int dow, int month, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time) { int ans; if (dow_number == 4) { // last X of this month? Work backwards from 1st of next month. @@ -89,6 +92,7 @@ JsVarFloat getDstChangeTime(int y, int dow_number, int dow, int month, int day_o // Returns the effective timezone in minutes east // is_local_time is true if ms is referenced to local time, false if it's referenced to GMT // if is_dst is not zero, then it will be set to true if DST is in effect +// https://github.com/deirdreobyrne/CalendarAndDST int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { @@ -99,9 +103,7 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { jsvArrayBufferIteratorNew(&it, dst, 0); y = 0; while (y < 12) { - JsVar *setting = jsvArrayBufferIteratorGetValue(&it); - dstSetting[y++]=setting->varData.integer; - jsvUnLock(setting); + dstSetting[y++]=jsvArrayBufferIteratorGetIntegerValue(&it); jsvArrayBufferIteratorNext(&it); } jsvArrayBufferIteratorFree(&it); @@ -202,12 +204,12 @@ CalendarDate getCalendarDate(int d) { int fromCalenderDate(CalendarDate *date) { while (date->month < 0) { - date->year--; - date->month += 12; + date->year--; + date->month += 12; } while (date->month > 11) { - date->year++; - date->month -= 12; + date->year++; + date->month -= 12; } return getDayNumberFromDate(date->year, date->month, date->day); }; @@ -315,7 +317,7 @@ JsVar *jswrap_date_constructor(JsVar *args) { td.min = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 4))); td.sec = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 5))); td.ms = (int)(jsvGetIntegerAndUnLock(jsvGetArrayItem(args, 6))); - setCorrectTimeZone(&td); + setCorrectTimeZone(&td); time = fromTimeInDay(&td); } @@ -752,6 +754,7 @@ JsVar *jswrap_date_toISOString(JsVar *parent) { } /*JSON{ "type" : "method", + "ifndef" : "SAVE_ON_FLASH", "class" : "Date", "name" : "toLocalISOString", "generate" : "jswrap_date_toLocalISOString", diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 5c7586ffab..e4085799bb 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1752,22 +1752,7 @@ void jswrap_espruino_setDST(JsVar *params) { if (!jsvIsArray(params)) return; if (jsvGetLength(params) != 12) return; - jsvIteratorNew(&it,params,JSIF_DEFINED_ARRAY_ElEMENTS); - dst = jsvNewTypedArray(ARRAYBUFFERVIEW_INT16, 12); - while (i < 12) { - JsVar *val = jsvIteratorGetValue(&it); - if (jsvIsInt(val)) { - jsvArrayBufferSet(dst,i++,val); - } else { - JsVar *zero = jsvNewFromInteger(0); - jsvArrayBufferSet(dst,0,zero); - jsvArrayBufferSet(dst,i++,zero); - jsvUnLock(zero); - } - jsvIteratorNext(&it); - jsvUnLock(val); - } - jsvIteratorFree(&it); + dst = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_INT16, params, 0, 0); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, dst); } From 9327f504c7e0bcdedb29ff47d3cc3bc4122eec9d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Jul 2022 11:14:06 +0100 Subject: [PATCH 0170/1183] Bangle.js: Ensure E.showMessage background color comes from theme ref https://github.com/espruino/BangleApps/pull/2025 --- ChangeLog | 1 + libs/js/banglejs/E_showMessage.js | 4 ++-- libs/js/banglejs/E_showMessage.min.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 339d890e5e..0a8419cd8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,7 @@ Bangle.js2: Fix text size on buttons when they are tapped in E.showPrompt nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications nRF5x: Move advertising_start and restart_softdevice outside of IRQs (MEMORY_BUSY warnings less likely now) + Bangle.js: Ensure E.showMessage background color comes from theme 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/js/banglejs/E_showMessage.js b/libs/js/banglejs/E_showMessage.js index 315b203777..1450a11dbf 100644 --- a/libs/js/banglejs/E_showMessage.js +++ b/libs/js/banglejs/E_showMessage.js @@ -2,8 +2,8 @@ if ("string" == typeof options) options = { title : options }; options = options||{}; - g.clearRect(Bangle.appRect); // clear screen - g.reset().setFont("6x8",(g.getWidth()>128)?2:1).setFontAlign(0,-1); + g.reset().clearRect(Bangle.appRect); // clear screen + g.setFont("6x8",(g.getWidth()>128)?2:1).setFontAlign(0,-1); var Y = Bangle.appRect.y; var W = g.getWidth(), H = g.getHeight()-Y, FH=g.getFontHeight(); var titleLines = g.wrapString(options.title, W-2); diff --git a/libs/js/banglejs/E_showMessage.min.js b/libs/js/banglejs/E_showMessage.min.js index cb562483df..69e1a64045 100644 --- a/libs/js/banglejs/E_showMessage.min.js +++ b/libs/js/banglejs/E_showMessage.min.js @@ -1,2 +1,2 @@ -(function(e,a){"string"==typeof a&&(a={title:a});a=a||{};g.clearRect(Bangle.appRect);g.reset().setFont("6x8",128 Date: Wed, 6 Jul 2022 15:44:43 +0100 Subject: [PATCH 0171/1183] Code efficiencies added, but microbit1 still fails --- boards/MICROBIT1.py | 1 + src/jsutils.h | 2 ++ src/jswrap_date.c | 74 +++++++++++++++---------------------------- src/jswrap_date.h | 6 +++- src/jswrap_espruino.c | 4 ++- src/jswrap_espruino.h | 2 ++ tests/test_date.js | 3 ++ 7 files changed, 41 insertions(+), 51 deletions(-) diff --git a/boards/MICROBIT1.py b/boards/MICROBIT1.py index aeaa4354a1..b80e68fa53 100644 --- a/boards/MICROBIT1.py +++ b/boards/MICROBIT1.py @@ -34,6 +34,7 @@ 'makefile' : [ 'SAVE_ON_FLASH=1', 'DEFINES+=-DSAVE_ON_FLASH_EXTREME', + 'DEFINES+=-DESPR_NO_DAYLIGHT_SAVING', 'DEFINES+=-DJSVAR_FORCE_NO_INLINE=1', 'CFLAGS += -ffreestanding', # needed for SAVE_ON_FLASH_EXTREME (jswrap_math, __aeabi_dsub) 'CFLAGS += -D__STARTUP_CLEAR_BSS -DLD_NOSTARTFILES', diff --git a/src/jsutils.h b/src/jsutils.h index 18ec12e40e..e967b155f9 100755 --- a/src/jsutils.h +++ b/src/jsutils.h @@ -320,7 +320,9 @@ typedef int64_t JsSysTime; #define JSPARSE_FUNCTION_LINENUMBER_NAME JS_HIDDEN_CHAR_STR"lin" // The line number offset of the function #define JS_EVENT_PREFIX "#on" #define JS_TIMEZONE_VAR "tz" +#ifndef ESPR_NO_DAYLIGHT_SAVING #define JS_DST_SETTINGS_VAR "dst" +#endif #define JS_GRAPHICS_VAR "gfx" #define JSPARSE_EXCEPTION_VAR "except" // when exceptions are thrown, they're stored in the root scope diff --git a/src/jswrap_date.c b/src/jswrap_date.c index a613cda9a0..0c00421791 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -23,7 +23,7 @@ const int BASE_DOW = 4; const char *MONTHNAMES = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; const char *DAYNAMES = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; -// Convert a y,m,d into a number of days since 1970. 0<=m<=11 +// Convert y,m,d into a number of days since 1970, where 0<=m<=11 // https://github.com/deirdreobyrne/CalendarAndDST int getDayNumberFromDate(int y, int m, int d) { int ans; @@ -33,36 +33,35 @@ int getDayNumberFromDate(int y, int m, int d) { m+=12; } ans = (y/100); - ans = 365*y + (y>>2) - ans + (ans>>2) + 30*m + ((3*m+6)/5) + d - 719531; - return ans; + return 365*y + (y>>2) - ans + (ans>>2) + 30*m + ((3*m+6)/5) + d - 719531; } // Convert a number of days since 1970 into y,m,d. 0<=m<=11 // https://github.com/deirdreobyrne/CalendarAndDST void getDateFromDayNumber(int day, int *y, int *m, int *date) { int a = day + 135081; - int b,c,d,e; + int b,c,d; a = (a-(a/146097)+146095)/36524; a = day + a - (a>>2); - c = ((a<<2)+2877911)/1461; - d = 365*c + (c>>2); - b = a + 719600 - d; - e = (5*b-1)/153; - if (date) *date=b-30*e-((3*e)/5); + b = ((a<<2)+2877911)/1461; + c = a + 719600 - 365*b - (b>>2); + d = (5*c-1)/153; + if (date) *date=c-30*d-((3*d)/5); if (m) { - if (e<14) - *m=e-2; + if (d<14) + *m=d-2; else - *m=e-14; + *m=d-14; } if (y) { - if (e>13) - *y=c+1; + if (d>13) + *y=b+1; else - *y=c; + *y=b; } } +#ifndef ESPR_NO_DAYLIGHT_SAVING // Given a set of DST change settings, calculate the time (in GMT seconds since 1970) that the change happens in year y // If as_local_time is true, then returns the number of seconds in the timezone in effect, as opposed to GMT // https://github.com/deirdreobyrne/CalendarAndDST @@ -88,12 +87,14 @@ JsVarFloat getDstChangeTime(int y, int dow_number, int dow, int month, int day_o } return 60.0*ans; } +#endif // Returns the effective timezone in minutes east // is_local_time is true if ms is referenced to local time, false if it's referenced to GMT // if is_dst is not zero, then it will be set to true if DST is in effect // https://github.com/deirdreobyrne/CalendarAndDST int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { +#ifndef ESPR_NO_DAYLIGHT_SAVING JsVar *dst = jsvObjectGetChild(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, 0); if ((dst) && (jsvIsArrayBuffer(dst)) && (jsvGetLength(dst) == 12) && (dst->varData.arraybuffer.type == ARRAYBUFFERVIEW_INT16)) { int y; @@ -111,48 +112,23 @@ int jsdGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst) { if (dstSetting[0]) { JsVarFloat sec = ms/1000; JsVarFloat dstStart,dstEnd; + bool dstActive; getDateFromDayNumber((int)(sec/86400),&y,0,0); dstStart = getDstChangeTime(y, dstSetting[2], dstSetting[3], dstSetting[4], dstSetting[5], dstSetting[6], 1, dstSetting[0], dstSetting[1], is_local_time); dstEnd = getDstChangeTime(y, dstSetting[7], dstSetting[8], dstSetting[9], dstSetting[10], dstSetting[11], 0, dstSetting[0], dstSetting[1], is_local_time); - // Now, check all permutations and combinations, noting that whereas in the northern hemisphere, dstStart= dstStart - if (sec >= dstEnd) { - if (dstStart < dstEnd) { - // Northern hemisphere - DST has ended - if (is_dst) *is_dst = false; - return dstSetting[1]; - } else { - // Southern hemisphere - DST has started - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } - } else { // sec >= dstStart, sec < dstEnd - // Northern hemisphere - DST has started for the summer - if (is_dst) *is_dst = true; - return dstSetting[0] + dstSetting[1]; - } + if (dstStart < dstEnd) { // Northern hemisphere + dstActive = (sec >= dstStart) && (sec < dstEnd); + } else { // Southern hemisphere + dstActive = (sec < dstEnd) || (sec >= dstStart); } + if (is_dst) *is_dst = dstActive; + return dstActive ? dstSetting[0]+dstSetting[1] : dstSetting[1]; } } else { jsvUnLock(dst); } +#endif if (is_dst) *is_dst = false; return jsvGetIntegerAndUnLock(jsvObjectGetChild(execInfo.hiddenRoot, JS_TIMEZONE_VAR, 0)); } @@ -339,6 +315,7 @@ int jswrap_date_getTimezoneOffset(JsVar *parent) { return -getTimeFromDateVar(parent, false/*system timezone*/).zone; } +// I'm assuming SAVE_ON_FLASH always goes with ESPR_NO_DAYLIGHT_SAVING /*JSON{ "type" : "method", "ifndef" : "SAVE_ON_FLASH", @@ -354,7 +331,6 @@ int jswrap_date_getIsDST(JsVar *parent) { return getTimeFromDateVar(parent, false/*system timezone*/).is_dst ? 1 : 0; } - /*JSON{ "type" : "method", "class" : "Date", diff --git a/src/jswrap_date.h b/src/jswrap_date.h index 4e20d2c0b8..dec320b468 100644 --- a/src/jswrap_date.h +++ b/src/jswrap_date.h @@ -17,7 +17,7 @@ typedef struct { int daysSinceEpoch; int ms,sec,min,hour; int zone; // timezone in minutes - bool is_dst; + bool is_dst; // will always be false IFNDEF ESPR_NO_DAYLIGHT_SAVING } TimeInDay; typedef struct { @@ -30,7 +30,9 @@ typedef struct { int getDayNumberFromDate(int y, int m, int d); void getDateFromDayNumber(int day, int *y, int *m, int *date); +#ifndef ESPR_NO_DAYLIGHT_SAVING JsVarFloat getDstChangeTime(int y, int dow_number, int month, int dow, int day_offset, int timeOfDay, bool is_start, int dst_offset, int timezone, bool as_local_time); +#endif int jstGetEffectiveTimeZone(JsVarFloat ms, bool is_local_time, bool *is_dst); void setCorrectTimeZone(TimeInDay *td); TimeInDay getTimeFromMilliSeconds(JsVarFloat ms_in, bool forceGMT); @@ -53,7 +55,9 @@ int jswrap_date_getDay(JsVar *parent); int jswrap_date_getDate(JsVar *parent); int jswrap_date_getMonth(JsVar *parent); int jswrap_date_getFullYear(JsVar *parent); +#ifndef ESPR_NO_DAYLIGHT_SAVING int jswrap_date_getIsDST(JsVar *parent); +#endif JsVarFloat jswrap_date_setHours(JsVar *parent, int hoursValue, JsVar *minutesValue, JsVar *secondsValue, JsVar *millisecondsValue); JsVarFloat jswrap_date_setMinutes(JsVar *parent, int minutesValue, JsVar *secondsValue, JsVar *millisecondsValue); diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 93707d0aa4..1ebebcb779 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -1709,8 +1709,10 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { jsvNewFromInteger((int)(zone*60))); } +#ifndef ESPR_NO_DAYLIGHT_SAVING /*JSON{ "type" : "staticmethod", + "ifndef" : "ESPR_NO_DAYLIGHT_SAVING", "class" : "E", "name" : "setDST", "generate" : "jswrap_espruino_setDST", @@ -1756,7 +1758,7 @@ void jswrap_espruino_setDST(JsVar *params) { dst = jswrap_typedarray_constructor(ARRAYBUFFERVIEW_INT16, params, 0, 0); jsvObjectSetChildAndUnLock(execInfo.hiddenRoot, JS_DST_SETTINGS_VAR, dst); } - +#endif /*JSON{ "type" : "staticmethod", diff --git a/src/jswrap_espruino.h b/src/jswrap_espruino.h index 6b7019c921..8ef36214eb 100644 --- a/src/jswrap_espruino.h +++ b/src/jswrap_espruino.h @@ -55,7 +55,9 @@ JsVar *jswrap_espruino_HSBtoRGB(JsVarFloat hue, JsVarFloat sat, JsVarFloat bri, void jswrap_espruino_setPassword(JsVar *pwd); void jswrap_espruino_lockConsole(); void jswrap_espruino_setTimeZone(JsVarFloat zone); +#ifndef ESPR_NO_DAYLIGHT_SAVING void jswrap_espruino_setDST(JsVar *params); +#endif JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers); void jswrap_espruino_asm(JsVar *callspec, JsVar *args); void jswrap_espruino_compiledC(JsVar *code); diff --git a/tests/test_date.js b/tests/test_date.js index b6d9c0b105..71ddd81300 100644 --- a/tests/test_date.js +++ b/tests/test_date.js @@ -50,6 +50,9 @@ dst.forEach(function(n) { if (n[0]==n[1]) pass++; }); // Southern hemisphere. -3h winter and -2h summer. Change 2nd Sun Mar @2am and 2nd Sun Oct @ 2am. E.setDST(60,-180,1,0,9,0,120,1,0,2,0,120); var dstSouth = [ +[ new Date("2011-02-10T14:12:00").toLocalISOString() , "2011-02-10T14:12:00.000-0200" ], +[ new Date("2011-06-11T11:12:00").toLocalISOString() , "2011-06-11T11:12:00.000-0300" ], +[ new Date("2011-11-04T09:25:00").toLocalISOString() , "2011-11-04T09:25:00.000-0200" ], [ new Date("2011-03-13T03:59:59.9Z").toLocalISOString() , "2011-03-13T01:59:59.900-0200" ], [ new Date("2011-03-13T04:00:00.0Z").toLocalISOString() , "2011-03-13T01:00:00.000-0300" ], [ new Date("2011-10-09T04:59:59.9Z").toLocalISOString() , "2011-10-09T01:59:59.900-0300" ], From 2f80e208d97a4a9f6c0c4574ba44180ee88c4bbd Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Jul 2022 17:05:18 +0100 Subject: [PATCH 0172/1183] Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage --- ChangeLog | 1 + src/jsflash.c | 222 ++++++++++++++++++++++++++++++++++--------- src/jsflash.h | 35 +++++-- src/jsinteractive.c | 2 +- src/jswrap_storage.c | 16 ++++ src/jswrap_storage.h | 2 + 6 files changed, 227 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a8419cd8b..a38e646ced 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications nRF5x: Move advertising_start and restart_softdevice outside of IRQs (MEMORY_BUSY warnings less likely now) Bangle.js: Ensure E.showMessage background color comes from theme + Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jsflash.c b/src/jsflash.c index 28be76da96..b6a4f542f1 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -18,10 +18,6 @@ #include "jswrap_string.h" //jswrap_string_match #include "jswrap_espruino.h" //jswrap_espruino_CRC -#ifdef BANGLEJS -#define ESPR_NO_VARIMAGE // don't allow saving an image of current state to flash - no use on Bangle.js -#endif - #define SAVED_CODE_BOOTCODE_RESET ".bootrst" // bootcode that runs even after reset #define SAVED_CODE_BOOTCODE ".bootcde" // bootcode that doesn't run after reset #ifndef ESPR_NO_VARIMAGE @@ -53,6 +49,11 @@ #define JSF_CACHE_NOT_FOUND 0xFFFFFFFF +#ifdef ESPR_STORAGE_FILENAME_TABLE +uint32_t jsfFilenameTableBank1Addr = 0; // address of DATA in the table (or 0 if no table) +uint32_t jsfFilenameTableBank1Size = 0; // size of table in bytes +#endif + #if ESPR_USE_STORAGE_CACHE /* Filename lookups can take over 1ms per file even on a reasonably empty SPI Flash memory, so we can have a cache of the most used file *addresses* in RAM. The data is still in @@ -132,6 +133,9 @@ static void jsfCachePut(JsfFileHeader *header, uint32_t addr) { } // ------------------------------------------------------------------------------------------------ static uint32_t jsfCreateFile(JsfFileName name, uint32_t size, JsfFileFlags flags, JsfFileHeader *returnedHeader); +#ifdef ESPR_STORAGE_FILENAME_TABLE +static uint32_t jsfBankCreateFileTable(uint32_t startAddr); +#endif /// Aligns a block, pushing it along in memory until it reaches the required alignment static uint32_t jsfAlignAddress(uint32_t addr) { @@ -176,6 +180,18 @@ JsfFileFlags jsfGetFileFlags(JsfFileHeader *header) { return (JsfFileFlags)((uint32_t)header->size >> 24); } +/** returns true if this file isn't deleted, or some internal +type of file like FILENAME_TABLE that shouldn't be listed +or kept when compacting */ +static bool jsfIsRealFile(JsfFileHeader *header) { + return (header->name.firstChars != 0) // if not replaced +#ifdef ESPR_STORAGE_FILENAME_TABLE + && !(jsfGetFileFlags(header) & JSFF_FILENAME_TABLE) +#endif + ; +} + + /// Return the flags for this file based on the header static uint32_t jsfGetBankEndAddress(uint32_t addr) { #ifdef JSF_BANK2_START_ADDRESS @@ -260,6 +276,10 @@ static bool jsfEraseArea(uint32_t startAddr, uint32_t endAddr) { bool jsfEraseAll() { jsDebug(DBG_INFO,"EraseAll\n"); jsfCacheClear(); +#ifdef ESPR_STORAGE_FILENAME_TABLE + jsfFilenameTableBank1Addr = 0; + jsfFilenameTableBank1Size = 0; +#endif #ifdef JSF_BANK2_START_ADDRESS if (!jsfEraseArea(JSF_BANK2_START_ADDRESS, JSF_BANK2_END_ADDRESS)) return false; #endif @@ -274,6 +294,20 @@ static void jsfEraseFileInternal(uint32_t addr, JsfFileHeader *header) { addr += (uint32_t)((char*)&header->name.firstChars - (char*)header); header->name.firstChars = 0; jshFlashWrite(&header->name.firstChars,addr,(uint32_t)sizeof(header->name.firstChars)); + +#ifdef ESPR_STORAGE_FILENAME_TABLE + if (addr>=JSF_START_ADDRESS && addr20) + jsfBankCreateFileTable(JSF_START_ADDRESS); + } +#endif } bool jsfEraseFile(JsfFileName name) { @@ -450,7 +484,7 @@ static bool jsfCompactInternal(uint32_t startAddress, char *swapBuffer, uint32_t memset(&header,0,sizeof(JsfFileHeader)); uint32_t addr = startAddress; if (jsfGetFileHeader(addr, &header, true)) do { - if (header.name.firstChars != 0) { // if not replaced + if (jsfIsRealFile(&header)) { // if not replaced or system file jsDebug(DBG_INFO,"compact> copying file at 0x%08x\n", addr); // Rewrite file position for any JsVars that used this file *if* the file changed position uint32_t newAddress = writeAddress+swapBufferUsed; @@ -555,6 +589,10 @@ bool jsfBankCompact(uint32_t startAddress) { // Try and compact saved data so it'll fit in Flash again bool jsfCompact() { jsfCacheClear(); +#ifdef ESPR_STORAGE_FILENAME_TABLE + jsfFilenameTableBank1Addr = 0; + jsfFilenameTableBank1Size = 0; +#endif bool compacted = jsfBankCompact(JSF_START_ADDRESS); #ifdef JSF_BANK2_START_ADDRESS compacted |= jsfBankCompact(JSF_BANK2_START_ADDRESS); @@ -603,6 +641,8 @@ static uint32_t jsfCreateFile(JsfFileName name, uint32_t size, JsfFileFlags flag jsfCacheClearFile(name); uint32_t bankStartAddress,bankEndAddress; jsfGetDriveBankAddress(drive,&bankStartAddress,&bankEndAddress); + /* TODO: do we want to start our scan from jsfFilenameTableBank1Addr to + * make writing files faster? */ uint32_t requiredSize = jsfAlignAddress(size)+(uint32_t)sizeof(JsfFileHeader); bool compacted = false; @@ -669,16 +709,37 @@ static uint32_t jsfCreateFile(JsfFileName name, uint32_t size, JsfFileFlags flag static uint32_t jsfBankFindFile(uint32_t bankAddress, uint32_t bankEndAddress, JsfFileName name, JsfFileHeader *returnedHeader) { uint32_t addr = bankAddress; JsfFileHeader header; +#ifdef ESPR_STORAGE_FILENAME_TABLE + if (jsfFilenameTableBank1Addr && addr==JSF_START_ADDRESS) { + uint32_t baseAddr = addr; + uint32_t tableAddr = jsfFilenameTableBank1Addr; + // Scan after this should start AFTER this table + addr = tableAddr+jsfFilenameTableBank1Size; + // Now scan the table and call back for each item + while (tableAddr < addr) { + // read the address and name... + jshFlashRead(&header, tableAddr, sizeof(JsfFileHeader)); + tableAddr += (uint32_t)sizeof(JsfFileHeader); + if (memcmp(header.name.c, name.c, sizeof(name.c))==0) { // name matches + uint32_t fileAddr = baseAddr + header.size; + if (jsfGetFileHeader(fileAddr, &header, true) && // read the real header + (header.name.firstChars != 0)) { // check the file was not replaced + if (returnedHeader) + *returnedHeader = header; + return fileAddr+(uint32_t)sizeof(JsfFileHeader); + } + } + } + } +#endif + memset(&header,0,sizeof(JsfFileHeader)); if (jsfGetFileHeader(addr, &header, false)) do { // check for something with the same first 4 chars of name that hasn't been replaced. if (header.name.firstChars == name.firstChars) { // Now load the whole header (with name) and check properly - jsfGetFileHeader(addr, &header, true); - if (memcmp(header.name.c, name.c, sizeof(name.c))==0) { - uint32_t endOfFile = addr + (uint32_t)sizeof(JsfFileHeader) + jsfGetFileSize(&header); - if (endOfFilebankEndAddress) - return 0; // corrupt - file too long + if (jsfGetFileHeader(addr, &header, true) && // get file (checks file length is ok) + memcmp(header.name.c, name.c, sizeof(name.c))==0) { if (returnedHeader) *returnedHeader = header; return addr+(uint32_t)sizeof(JsfFileHeader); @@ -791,7 +852,8 @@ void jsfDebugFiles() { #endif } -static bool jsfIsBankStorageValid(uint32_t startAddr, JsfStorageTestType testType) { +static bool jsfIsBankStorageValid(uint32_t startAddr, JsfStorageTestType testFlags) { + JsfStorageTestType testType = testFlags&JSFSTT_TYPE_MASK; uint32_t addr = startAddr; uint32_t endAddr = jsfGetBankEndAddress(addr); uint32_t oldAddr = addr; @@ -801,6 +863,14 @@ static bool jsfIsBankStorageValid(uint32_t startAddr, JsfStorageTestType testTyp bool valid = jsfGetFileHeader(addr, &header, true); if (valid) { while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)) { +#ifdef ESPR_STORAGE_FILENAME_TABLE + if ((testFlags & JSFSTT_FIND_FILENAME_TABLE) && + (startAddr==JSF_START_ADDRESS) && + (jsfGetFileFlags(&header) & JSFF_FILENAME_TABLE)) { + jsfFilenameTableBank1Addr = addr + (uint32_t)sizeof(JsfFileHeader); + jsfFilenameTableBank1Size = jsfGetFileSize(&header); + } +#endif oldAddr = addr; jshKickWatchDog(); // stop watchdog reboots } @@ -831,11 +901,11 @@ static bool jsfIsBankStorageValid(uint32_t startAddr, JsfStorageTestType testTyp * For instance the first page may be blank but other pages * may contain info (which is invalid)... */ -bool jsfIsStorageValid(JsfStorageTestType testType) { - if (!jsfIsBankStorageValid(JSF_START_ADDRESS, testType)) +bool jsfIsStorageValid(JsfStorageTestType testFlags) { + if (!jsfIsBankStorageValid(JSF_START_ADDRESS, testFlags)) return false; #ifdef JSF_BANK2_START_ADDRESS - if (!jsfIsBankStorageValid(JSF_BANK2_START_ADDRESS, testType)) + if (!jsfIsBankStorageValid(JSF_BANK2_START_ADDRESS, testFlags)) return false; #endif return true; @@ -891,7 +961,7 @@ JsVar* jsvAddressToVar(size_t addr, uint32_t length) { // linux fakes flash with a file, so we can't just return a pointer to it! uint32_t alignedSize = jsfAlignAddress((uint32_t)length); char *d = (char*)malloc(alignedSize); - jshFlashRead(d, addr, alignedSize); + jshFlashRead(d, (size_t)addr, alignedSize); JsVar *v = jsvNewStringOfLength((uint32_t)length, d); free(d); return v; @@ -967,6 +1037,37 @@ bool jsfWriteFile(JsfFileName name, JsVar *data, JsfFileFlags flags, JsVarInt of return true; } +static void jsfBankListFilesHandleFile(JsVar *files, uint32_t addr, JsfFileHeader *header, JsVar *regex, JsfFileFlags containing, JsfFileFlags notContaining, uint32_t *hash) { + JsfFileFlags flags = jsfGetFileFlags(header); + if (notContaining&flags) return; + if (containing && !(containing&flags)) return; + if (flags&JSFF_STORAGEFILE) { + // find last char + int i = 0; + while (i+1name) && header->name.c[i+1]) i++; + // if last ch isn't \1 (eg first StorageFile) ignore this + if (header->name.c[i]!=1) return; + // if we're specifically asking for StorageFile, remove last char + if (containing&JSFF_STORAGEFILE) + header->name.c[i]=0; + } + JsVar *v = jsfVarFromName(header->name); + bool match = true; + if (regex) { + JsVar *m = jswrap_string_match(v,regex); + match = !(jsvIsUndefined(m) || jsvIsNull(m)); + jsvUnLock(m); + } +#ifndef SAVE_ON_FLASH + if (hash && match) { + *hash = (*hash<<1) | (*hash>>31); // roll hash + *hash = *hash ^ addr ^ jsvGetIntegerAndUnLock(jswrap_espruino_CRC32(v)); // apply filename + } +#endif + if (match && files) jsvArrayPushAndUnLock(files, v); + else jsvUnLock(v); +} + /** Return all files in flash as a JsVar array of names. If regex is supplied, it is used to filter the filenames using String.match(regexp) * If containing!=0, file flags must contain one of the 'containing' argument's bits. * Flags can't contain any bits in the 'notContaining' argument @@ -974,36 +1075,28 @@ bool jsfWriteFile(JsfFileName name, JsVar *data, JsfFileFlags flags, JsVarInt of static void jsfBankListFiles(JsVar *files, uint32_t addr, JsVar *regex, JsfFileFlags containing, JsfFileFlags notContaining, uint32_t *hash) { JsfFileHeader header; memset(&header,0,sizeof(JsfFileHeader)); - if (jsfGetFileHeader(addr, &header, true)) do { - if (header.name.firstChars != 0) { // if not replaced - JsfFileFlags flags = jsfGetFileFlags(&header); - if (notContaining&flags) continue; - if (containing && !(containing&flags)) continue; - if (flags&JSFF_STORAGEFILE) { - // find last char - int i = 0; - while (i+1>31); // roll hash - *hash = *hash ^ addr ^ jsvGetIntegerAndUnLock(jswrap_espruino_CRC32(v)); // apply filename +#ifdef ESPR_STORAGE_FILENAME_TABLE + if (jsfFilenameTableBank1Addr && addr==JSF_START_ADDRESS) { + uint32_t baseAddr = addr; + uint32_t tableAddr = jsfFilenameTableBank1Addr; + // Scan after this should start AFTER this table + addr = tableAddr+jsfFilenameTableBank1Size; + // Now scan the table and call back for each item + while (tableAddr < addr) { + // read just the address + jshFlashRead(&header, tableAddr, 4); + tableAddr += (uint32_t)sizeof(JsfFileHeader); + // Now read the header at the address we have in our table (file may have been deleted) + uint32_t fileAddr = baseAddr + header.size; + if (jsfGetFileHeader(fileAddr, &header, true) && jsfIsRealFile(&header)) { + jsfBankListFilesHandleFile(files, fileAddr, &header, regex, containing, notContaining, hash); } + } + } #endif - if (match && files) jsvArrayPushAndUnLock(files, v); - else jsvUnLock(v); + if (jsfGetFileHeader(addr, &header, true)) do { + if (jsfIsRealFile(&header)) { // if not replaced or a system file + jsfBankListFilesHandleFile(files, addr, &header, regex, containing, notContaining, hash); } } while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)); @@ -1256,3 +1349,46 @@ void jsfResetStorage() { #endif } +#ifdef ESPR_STORAGE_FILENAME_TABLE +/// Create a lookup table for filenames. On success return file's address +static uint32_t jsfBankCreateFileTable(uint32_t startAddr) { + JsfFileHeader header; + memset(&header,0,sizeof(JsfFileHeader)); + uint32_t fileCount = 0; + // first count files + uint32_t addr = startAddr; // address of file header + if (jsfGetFileHeader(addr, &header, false)) do { + if (jsfIsRealFile(&header)) fileCount++; + } while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)); + // now write table + JsfFileName name = jsfNameFromString("[FILENAME_TABLE]"); + uint32_t tableAddr = jsfFindFile(name, &header); // address of file data (not header) + if (tableAddr) jsfEraseFileInternal(tableAddr, &header); + uint32_t tableSize = fileCount * (uint32_t)sizeof(JsfFileHeader); + if (tableSize==0) return 0; // empty table + tableAddr = jsfCreateFile(name, tableSize, JSFF_FILENAME_TABLE, &header); + if (!tableAddr) return 0; // couldn't create file + // Now rescan files and write into file + addr = startAddr; + uint32_t writeAddr = tableAddr; + if (jsfGetFileHeader(addr, &header, true)) do { + if (jsfIsRealFile(&header)) { + JsfFileHeader filenameTableHeader = header; + filenameTableHeader.size = addr - startAddr; // write file address into file + jshFlashWriteAligned(&filenameTableHeader, writeAddr, sizeof(JsfFileHeader)); + writeAddr += (uint32_t)sizeof(JsfFileHeader); + } + } while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)); + if (startAddr == JSF_START_ADDRESS) { + jsfFilenameTableBank1Addr = tableAddr; + jsfFilenameTableBank1Size = tableSize; + } + return tableAddr; +} + +/// Create a lookup table for files - this speeds up file access +void jsfCreateFileTable() { + jsfBankCreateFileTable(JSF_START_ADDRESS); +} +#endif + diff --git a/src/jsflash.h b/src/jsflash.h index b8370b9265..c9a851bf29 100644 --- a/src/jsflash.h +++ b/src/jsflash.h @@ -16,6 +16,16 @@ #include "jsvar.h" +#ifdef BANGLEJS +#define ESPR_NO_VARIMAGE // don't allow saving an image of current state to flash - no use on Bangle.js +#define ESPR_STORAGE_FILENAME_TABLE // on non-Bangle.js boards without external flash this doesn't make much sense +#endif + +#ifdef LINUX // for testing... +#define ESPR_STORAGE_FILENAME_TABLE +#endif + + /// Simple filename used for Flash Storage. We use firstChars so we can do a quick first pass check for equality typedef union { uint32_t firstChars; ///< Set these all to 0 to indicate a replaced/deleted file @@ -32,9 +42,12 @@ typedef struct { } JsfFileHeader; typedef enum { - JSFF_NONE, - JSFF_STORAGEFILE = 64, // This file is a 'storage file' created by Storage.open - JSFF_COMPRESSED = 128 // This file contains compressed data (used only for .varimg currently) + JSFF_NONE, ///< A normal file +#ifndef SAVE_ON_FLASH + JSFF_FILENAME_TABLE = 32, ///< A file that contains a list of JsfFileHeader structs with 'size' pointing to the file addresses at the time it was created +#endif + JSFF_STORAGEFILE = 64, ///< This file is a 'storage file' created by Storage.open + JSFF_COMPRESSED = 128 ///< This file contains compressed data (used only for .varimg currently) } JsfFileFlags; // these are stored in the top 8 bits of JsfFileHeader.size @@ -81,9 +94,11 @@ uint32_t jsfHashFiles(JsVar *regex, JsfFileFlags containing, JsfFileFlags notCon void jsfDebugFiles(); typedef enum { - JSFSTT_QUICK, ///< Just files - JSFSTT_NORMAL, ///< Just files, or all space if storage empty - JSFSTT_ALL ///< all space, including empty space + JSFSTT_QUICK, ///< Just files + JSFSTT_NORMAL, ///< Just files, or all space if storage empty + JSFSTT_ALL, ///< all space, including empty space + JSFSTT_TYPE_MASK = 7, + JSFSTT_FIND_FILENAME_TABLE = 128, ///< When we scan, should we also update our link to the FILENAME_TABLE } JsfStorageTestType; /** Return false if the current storage is not valid * or is corrupt somehow. Basically that means if @@ -93,7 +108,7 @@ typedef enum { * For instance the first page may be blank but other pages * may contain info (which is invalid)... */ -bool jsfIsStorageValid(JsfStorageTestType testType); +bool jsfIsStorageValid(JsfStorageTestType testFlags); /** Return true if there is nothing at all in Storage (first header on first page is all 0xFF) */ bool jsfIsStorageEmpty(); @@ -130,4 +145,10 @@ void jsfRemoveCodeFromFlash(); // Erase storage to 'factory' values. void jsfResetStorage(); + +#ifdef ESPR_STORAGE_FILENAME_TABLE +/// Create a lookup table for files - this speeds up file access +void jsfCreateFileTable(); +#endif + #endif //JSFLASH_H_ diff --git a/src/jsinteractive.c b/src/jsinteractive.c index 710975e3c9..32e305f8ed 100644 --- a/src/jsinteractive.c +++ b/src/jsinteractive.c @@ -798,7 +798,7 @@ void jsiSemiInit(bool autoLoad, JsfFileName *loadedFilename) { #ifdef BANGLEJS jsiConsolePrintf("Checking storage...\n"); #endif - if (!jsfIsStorageValid(JSFSTT_NORMAL)) { + if (!jsfIsStorageValid(JSFSTT_NORMAL | JSFSTT_FIND_FILENAME_TABLE)) { jsiConsolePrintf("Storage is corrupt.\n"); jsfResetStorage(); } else { diff --git a/src/jswrap_storage.c b/src/jswrap_storage.c index b2fa26ca73..e6420bf327 100644 --- a/src/jswrap_storage.c +++ b/src/jswrap_storage.c @@ -460,6 +460,22 @@ JsVar *jswrap_storage_getStats() { return o; } +/*JSON{ + "type" : "staticmethod", + "ifndef" : "SAVE_ON_FLASH", + "class" : "Storage", + "name" : "optimise", + "generate" : "jswrap_storage_optimise" +} +Writes a lookup table for files into Bangle.js's storage. This allows any file stored +up to that point to be accessed quickly. + */ +void jswrap_storage_optimise() { +#ifdef ESPR_STORAGE_FILENAME_TABLE + jsfCreateFileTable(); +#endif +} + /*JSON{ "type" : "staticmethod", "ifndef" : "SAVE_ON_FLASH", diff --git a/src/jswrap_storage.h b/src/jswrap_storage.h index 32ddb6bc40..7c8fcd08bb 100644 --- a/src/jswrap_storage.h +++ b/src/jswrap_storage.h @@ -28,6 +28,7 @@ JsVarInt jswrap_storage_hash(JsVar *regex); void jswrap_storage_debug(); int jswrap_storage_getFree(); JsVar *jswrap_storage_getStats(); +void jswrap_storage_optimise(); JsVar *jswrap_storage_open(JsVar *name, JsVar *mode); JsVar *jswrap_storagefile_read(JsVar *f, int len); @@ -35,3 +36,4 @@ JsVar *jswrap_storagefile_readLine(JsVar *f); int jswrap_storagefile_getLength(JsVar *f); void jswrap_storagefile_write(JsVar *parent, JsVar *_data); void jswrap_storagefile_erase(JsVar *f); + From ca04c97ba7f73e9afa3411ffd18f99a5fb2c9285 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Jul 2022 10:12:45 +0100 Subject: [PATCH 0173/1183] Minor storage speed improvement - stop scanning storage if we found the file --- src/jsflash.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/jsflash.c b/src/jsflash.c index b6a4f542f1..aa23498296 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -714,7 +714,7 @@ static uint32_t jsfBankFindFile(uint32_t bankAddress, uint32_t bankEndAddress, J uint32_t baseAddr = addr; uint32_t tableAddr = jsfFilenameTableBank1Addr; // Scan after this should start AFTER this table - addr = tableAddr+jsfFilenameTableBank1Size; + addr = jsfAlignAddress(tableAddr+jsfFilenameTableBank1Size); // Now scan the table and call back for each item while (tableAddr < addr) { // read the address and name... @@ -728,6 +728,9 @@ static uint32_t jsfBankFindFile(uint32_t bankAddress, uint32_t bankEndAddress, J *returnedHeader = header; return fileAddr+(uint32_t)sizeof(JsfFileHeader); } + /* Or... the file was in our table but it's been replaced. In this case + stop scanning our table and instead just do a normal scan for files + added after the table... */ } } } @@ -1080,7 +1083,7 @@ static void jsfBankListFiles(JsVar *files, uint32_t addr, JsVar *regex, JsfFileF uint32_t baseAddr = addr; uint32_t tableAddr = jsfFilenameTableBank1Addr; // Scan after this should start AFTER this table - addr = tableAddr+jsfFilenameTableBank1Size; + addr = jsfAlignAddress(tableAddr+jsfFilenameTableBank1Size); // Now scan the table and call back for each item while (tableAddr < addr) { // read just the address @@ -1360,6 +1363,7 @@ static uint32_t jsfBankCreateFileTable(uint32_t startAddr) { if (jsfGetFileHeader(addr, &header, false)) do { if (jsfIsRealFile(&header)) fileCount++; } while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)); + jsDebug(DBG_INFO,"jsfBankCreateFileTable - %d files\n", fileCount); // now write table JsfFileName name = jsfNameFromString("[FILENAME_TABLE]"); uint32_t tableAddr = jsfFindFile(name, &header); // address of file data (not header) From 2f52b37f00bca6d67c7453a65d7b87de0d0321c5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Jul 2022 10:26:27 +0100 Subject: [PATCH 0174/1183] Fix for potential recursion error if removing a FILENAME_TABLE in order to create a new table --- src/jsflash.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/jsflash.c b/src/jsflash.c index aa23498296..55ebedfdbe 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -287,7 +287,7 @@ bool jsfEraseAll() { } /// When a file is found in memory, erase it (by setting first bytes of name to 0). addr=ptr to data, NOT header -static void jsfEraseFileInternal(uint32_t addr, JsfFileHeader *header) { +static void jsfEraseFileInternal(uint32_t addr, JsfFileHeader *header, bool createFilenameTable) { jsDebug(DBG_INFO,"EraseFile 0x%08x\n", addr); addr -= (uint32_t)sizeof(JsfFileHeader); @@ -296,7 +296,7 @@ static void jsfEraseFileInternal(uint32_t addr, JsfFileHeader *header) { jshFlashWrite(&header->name.firstChars,addr,(uint32_t)sizeof(header->name.firstChars)); #ifdef ESPR_STORAGE_FILENAME_TABLE - if (addr>=JSF_START_ADDRESS && addr=JSF_START_ADDRESS && addr Date: Thu, 7 Jul 2022 11:39:27 +0100 Subject: [PATCH 0175/1183] After some benchmarks, ensure the FILENAME_TABLE is only created when we start to get a *lot* of extra files (adding 10ms to each Storage list call) --- src/jsflash.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/jsflash.c b/src/jsflash.c index 55ebedfdbe..134dd316ca 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -302,9 +302,10 @@ static void jsfEraseFileInternal(uint32_t addr, JsfFileHeader *header, bool crea if (jsfFilenameTableBank1Addr) scanAddr = jsfFilenameTableBank1Addr + jsfFilenameTableBank1Size; JsfStorageStats stats = jsfGetStorageStats(scanAddr, true); - /* if more than 20 files were added/deleted since the last - FILENAME_TABLE, try and make a new one */ - if ((stats.trashCount+stats.fileCount)>20) + /* if more than 200 files were added/deleted since the last + FILENAME_TABLE, try and make a new one. 100 files seems to add + around 5ms to each Storage.list call, or 2ms to a file read. */ + if ((stats.trashCount+stats.fileCount)>200) jsfBankCreateFileTable(JSF_START_ADDRESS); } #endif From db5542672e4e7bfc4bddc3eb651974af1077a76d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Jul 2022 14:38:43 +0100 Subject: [PATCH 0176/1183] Fix for regression a few commits ago where if alignment was wrong, a written file could get 'lost' (fix #2231) --- src/jsflash.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/jsflash.c b/src/jsflash.c index 134dd316ca..e624fad90d 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -50,7 +50,7 @@ #define JSF_CACHE_NOT_FOUND 0xFFFFFFFF #ifdef ESPR_STORAGE_FILENAME_TABLE -uint32_t jsfFilenameTableBank1Addr = 0; // address of DATA in the table (or 0 if no table) +uint32_t jsfFilenameTableBank1Addr = 0; // address of DATA in the table, NOT THE HEADER (or 0 if no table) uint32_t jsfFilenameTableBank1Size = 0; // size of table in bytes #endif @@ -683,6 +683,7 @@ static uint32_t jsfCreateFile(JsfFileName name, uint32_t size, JsfFileFlags flag }; // If we were going to straddle the next page and there's enough space, // push this file forwards so it starts on a clean page boundary + // Maybe we shouldn't do this any more - see https://github.com/espruino/Espruino/issues/2232 addr = freeAddr; uint32_t spaceAvailable = jsfGetSpaceLeftInPage(addr); uint32_t nextPage = jsfGetAddressOfNextPage(addr); @@ -714,10 +715,9 @@ static uint32_t jsfBankFindFile(uint32_t bankAddress, uint32_t bankEndAddress, J if (jsfFilenameTableBank1Addr && addr==JSF_START_ADDRESS) { uint32_t baseAddr = addr; uint32_t tableAddr = jsfFilenameTableBank1Addr; - // Scan after this should start AFTER this table - addr = jsfAlignAddress(tableAddr+jsfFilenameTableBank1Size); + uint32_t tableEnd = tableAddr + jsfFilenameTableBank1Size; // Now scan the table and call back for each item - while (tableAddr < addr) { + while (tableAddr < tableEnd) { // read the address and name... jshFlashRead(&header, tableAddr, sizeof(JsfFileHeader)); tableAddr += (uint32_t)sizeof(JsfFileHeader); @@ -734,11 +734,18 @@ static uint32_t jsfBankFindFile(uint32_t bankAddress, uint32_t bankEndAddress, J added after the table... */ } } - } + // We didn't find the file in our table... + // Now point 'addr' to the start of this table and fill in the header. + // the normal code will see this, skip over it like a normal file + // and carry on regardless. + addr = jsfFilenameTableBank1Addr - sizeof(JsfFileHeader); // address of jsfFilenameTable's header + header.name.firstChars = 0; + header.size = jsfFilenameTableBank1Size; + } else #endif - - memset(&header,0,sizeof(JsfFileHeader)); - if (jsfGetFileHeader(addr, &header, false)) do { + if (!jsfGetFileHeader(addr, &header, false)) return 0; + // Now search through files in storage + do { // check for something with the same first 4 chars of name that hasn't been replaced. if (header.name.firstChars == name.firstChars) { // Now load the whole header (with name) and check properly @@ -1084,10 +1091,9 @@ static void jsfBankListFiles(JsVar *files, uint32_t addr, JsVar *regex, JsfFileF //jsiConsolePrintf("jsfFilenameTable 0x%08x\n", jsfFilenameTableBank1Addr); uint32_t baseAddr = addr; uint32_t tableAddr = jsfFilenameTableBank1Addr; - // Scan after this should start AFTER this table - addr = jsfAlignAddress(tableAddr+jsfFilenameTableBank1Size); + uint32_t tableEnd = tableAddr + jsfFilenameTableBank1Size; // Now scan the table and call back for each item - while (tableAddr < addr) { + while (tableAddr < tableEnd) { // read just the address jshFlashRead(&header, tableAddr, 4); tableAddr += (uint32_t)sizeof(JsfFileHeader); @@ -1097,15 +1103,21 @@ static void jsfBankListFiles(JsVar *files, uint32_t addr, JsVar *regex, JsfFileF jsfBankListFilesHandleFile(files, fileAddr, &header, regex, containing, notContaining, hash); } } - } + // We didn't find the file in our table... + // Now point 'addr' to the start of this table and fill in the header. + // the normal code will see this, skip over it like a normal file + // and carry on regardless. + addr = jsfFilenameTableBank1Addr - sizeof(JsfFileHeader); // address of jsfFilenameTable's header + header.name.firstChars = 0; + header.size = jsfFilenameTableBank1Size; + } else #endif - //jsiConsolePrintf("list from 0x%08x\n", addr); - if (jsfGetFileHeader(addr, &header, true)) do { + if (!jsfGetFileHeader(addr, &header, true)) return; + do { if (jsfIsRealFile(&header)) { // if not replaced or a system file jsfBankListFilesHandleFile(files, addr, &header, regex, containing, notContaining, hash); } } while (jsfGetNextFileHeader(&addr, &header, GNFH_GET_ALL)); - } /** Return all files in flash as a JsVar array of names. If regex is supplied, it is used to filter the filenames using String.match(regexp) From 2e0502cbb721c72fcae6807ac85edd9900b60a40 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Jul 2022 14:43:25 +0100 Subject: [PATCH 0177/1183] Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) --- ChangeLog | 3 ++- src/jsflash.c | 16 +++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index a38e646ced..113e1cc796 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,7 +14,8 @@ nRF5x: Add 'onWriteDesc' in NRF.setServices - allowing you to know when something subscribed for notifications nRF5x: Move advertising_start and restart_softdevice outside of IRQs (MEMORY_BUSY warnings less likely now) Bangle.js: Ensure E.showMessage background color comes from theme - Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage + Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage (fix #2152) + Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jsflash.c b/src/jsflash.c index e624fad90d..c69ecff4cb 100644 --- a/src/jsflash.c +++ b/src/jsflash.c @@ -681,20 +681,10 @@ static uint32_t jsfCreateFile(JsfFileName name, uint32_t size, JsfFileFlags flag } } }; - // If we were going to straddle the next page and there's enough space, - // push this file forwards so it starts on a clean page boundary - // Maybe we shouldn't do this any more - see https://github.com/espruino/Espruino/issues/2232 + /* We used to push files forward to the nearest page boundary but now there's very little point + doing this. While we still have to cope with it when reading storage, we now don't try and align + new files - see https://github.com/espruino/Espruino/issues/2232 */ addr = freeAddr; - uint32_t spaceAvailable = jsfGetSpaceLeftInPage(addr); - uint32_t nextPage = jsfGetAddressOfNextPage(addr); - if (nextPage && // there is a next page - ((nextPage - addr) < requiredSize) && // it would straddle pages - (spaceAvailable > (size + nextPage - addr)) && // there is space - (requiredSize < 512) && // it's not too big. We should always try and put big files as near the start as possible. See note in jsfCompact - !jsfGetFileHeader(nextPage, &header, false)) { // the next page is free - jsDebug(DBG_INFO,"CreateFile straddles page boundary, pushed to next page (0x%08x -> 0x%08x)\n", addr, nextPage); - addr = nextPage; - } // write out the header jsDebug(DBG_INFO,"CreateFile new 0x%08x\n", addr+(uint32_t)sizeof(JsfFileHeader)); header.size = size | (flags<<24); From 12e33519cf7db4b80175dfc723d07037b762d6f8 Mon Sep 17 00:00:00 2001 From: BartS23 Date: Thu, 14 Jul 2022 12:36:08 +0200 Subject: [PATCH 0178/1183] Add action "Test Factory Apps" --- .github/workflows/testFactoryApps.yml | 79 ++++++++++++++++++ scripts/factoryTests.js | 103 ++++++++++++++++++++++++ tests/FactoryApps/about.BANGLEJS.txt | 35 ++++++++ tests/FactoryApps/about.BANGLEJS2.txt | 35 ++++++++ tests/FactoryApps/alarm.BANGLEJS.txt | 45 +++++++++++ tests/FactoryApps/alarm.BANGLEJS2.txt | 15 ++++ tests/FactoryApps/health.BANGLEJS2.txt | 14 ++++ tests/FactoryApps/sched.BANGLEJS.txt | 39 +++++++++ tests/FactoryApps/sched.BANGLEJS2.txt | 14 ++++ tests/FactoryApps/setting.BANGLEJS.txt | 40 +++++++++ tests/FactoryApps/setting.BANGLEJS2.txt | 15 ++++ tests/FactoryApps/welcome.BANGLEJS.txt | 46 +++++++++++ tests/FactoryApps/welcome.BANGLEJS2.txt | 45 +++++++++++ 13 files changed, 525 insertions(+) create mode 100644 .github/workflows/testFactoryApps.yml create mode 100755 scripts/factoryTests.js create mode 100644 tests/FactoryApps/about.BANGLEJS.txt create mode 100644 tests/FactoryApps/about.BANGLEJS2.txt create mode 100644 tests/FactoryApps/alarm.BANGLEJS.txt create mode 100644 tests/FactoryApps/alarm.BANGLEJS2.txt create mode 100644 tests/FactoryApps/health.BANGLEJS2.txt create mode 100644 tests/FactoryApps/sched.BANGLEJS.txt create mode 100644 tests/FactoryApps/sched.BANGLEJS2.txt create mode 100644 tests/FactoryApps/setting.BANGLEJS.txt create mode 100644 tests/FactoryApps/setting.BANGLEJS2.txt create mode 100644 tests/FactoryApps/welcome.BANGLEJS.txt create mode 100644 tests/FactoryApps/welcome.BANGLEJS2.txt diff --git a/.github/workflows/testFactoryApps.yml b/.github/workflows/testFactoryApps.yml new file mode 100644 index 0000000000..85c419413a --- /dev/null +++ b/.github/workflows/testFactoryApps.yml @@ -0,0 +1,79 @@ +name: Test Factory Apps + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + git-ref: + description: Git Ref (Optional) + required: false + +permissions: + contents: read + +jobs: + # This workflow contains a single job called "build" + tests: + runs-on: ubuntu-latest + steps: + - name: Checkout Espruino + uses: actions/checkout@v3 + with: + submodules: recursive + path: 'Espruino' + ref: ${{ github.event.inputs.git-ref }} + + - name: Checkout EspruinoWebIDE + uses: actions/checkout@v3 + with: + repository: espruino/EspruinoWebIDE + submodules: recursive + path: 'EspruinoWebIDE' + + - name: Checkout EspruinoAppLoaderCore + uses: actions/checkout@v3 + with: + repository: espruino/EspruinoAppLoaderCore + submodules: recursive + path: 'EspruinoAppLoaderCore' + + - name: Setup emsdk + uses: mymindstorm/setup-emsdk@v11 + with: + # Make sure to set a version number! + version: 3.1.12 + # This is the name of the cache folder. + # The cache folder will be placed in the build directory, + # so make sure it doesn't conflict with anything! + actions-cache-folder: 'emsdk' + + - name: Use Node.js + uses: actions/setup-node@v3 + + - name: Create Emulator + run: | + cd $GITHUB_WORKSPACE/Espruino + make clean + BOARD=EMSCRIPTEN make || exit 1 + make clean + BOARD=EMSCRIPTEN2 make || exit 1 + cp $GITHUB_WORKSPACE/Espruino/emulator_banglejs*.js $GITHUB_WORKSPACE/EspruinoWebIDE/emu/ -v + + - name: Run Tests Bangle.js + run: node $GITHUB_WORKSPACE/Espruino/scripts/factoryTests.js BANGLEJS + id: TestBangle1 + continue-on-error: true + + - name: Run Tests Bangle.js2 + run: node $GITHUB_WORKSPACE/Espruino/scripts/factoryTests.js BANGLEJS2 + id: TestBangle2 + continue-on-error: true + + - name: Fail test + if: (steps.TestBangle1.outcome != 'skipped' && steps.TestBangle1.outcome != 'success') || (steps.TestBangle2.outcome != 'skipped' && steps.TestBangle2.outcome != 'success') + run: exit 1 diff --git a/scripts/factoryTests.js b/scripts/factoryTests.js new file mode 100755 index 0000000000..417754ce3f --- /dev/null +++ b/scripts/factoryTests.js @@ -0,0 +1,103 @@ +#!/usr/bin/node + +if (process.argv.length == 3 && process.argv[2] == "BANGLEJS") { + var EMULATOR = "banglejs1"; + var DEVICEID = "BANGLEJS"; +} else if (process.argv.length == 3 && process.argv[2] == "BANGLEJS2") { + var EMULATOR = "banglejs2"; + var DEVICEID = "BANGLEJS2"; +} else { + console.log("USAGE:"); + console.log(" factoryTests.js BANGLEJS"); + console.log(" or"); + console.log(" factoryTests.js BANGLEJS2"); + process.exit(1); +} + +const TESTS_DIR = __dirname + "/../tests/FactoryApps"; + +if (!require("fs").existsSync(__dirname + "/../../EspruinoWebIDE")) { + console.log("You need to:"); + console.log(" git clone https://github.com/espruino/EspruinoWebIDE"); + console.log("At the same level as this project"); + process.exit(1); +} +eval(require("fs").readFileSync(__dirname + "/../../EspruinoWebIDE/emu/emulator_"+EMULATOR+".js").toString()); +eval(require("fs").readFileSync(__dirname + "/../../EspruinoWebIDE/emu/emu_"+EMULATOR+".js").toString()); +eval(require("fs").readFileSync(__dirname + "/../../EspruinoWebIDE/emu/common.js").toString().replace('console.log("EMSCRIPTEN:"', '//console.log("EMSCRIPTEN:"')); + +var Const = {}; +var module = undefined; +var Espruino = require(__dirname + "/../../EspruinoAppLoaderCore/lib/espruinotools.js"); + +/* we factory reset ONCE, get this, then we can use it to reset +state quickly for each new app */ +var factoryFlashMemory = new Uint8Array(FLASH_SIZE); +// Log of messages from app +var appLog = ""; +// List of apps that errored +var erroredApps = []; + +jsRXCallback = function() {}; +jsUpdateGfx = function() {}; + +function ERROR(s) { + console.error(s); + process.exit(1); +} + +var lastTxt; +function onConsoleOutput(txt) { + if (txt == "\r" && lastTxt == "\r") return; + if (txt && !txt.startsWith("=") ) { + appLog += txt + "\n"; + lastTxt = txt; + } +} + + +function runTest(file) { + let testLog = ""; + flashMemory.set(factoryFlashMemory); + jsTransmitString("reset()\n"); + console.log(`Load steps from ${file}`); + var steps = require("fs").readFileSync(TESTS_DIR + '/' + file).toString().split("\n"); + steps.forEach(step => { + if (!step) { + return; + } +// console.log("run: " , step); + appLog = ""; + jsTransmitString(step + "\n"); + testLog += appLog; + }); + if (testLog.replace("Uncaught Storage Updated!", "").indexOf("Uncaught")>=0) { + erroredApps.push( { id : file, log : testLog } ); + } +} + +// wait until loaded... +setTimeout(function() { + console.log("Loaded..."); + jsInit(); + jsIdle(); + console.log("Factory reset"); + jsTransmitString("Bangle.factoryReset()\n"); + factoryFlashMemory.set(flashMemory); + console.log("Ready!"); + appLog = ""; + require("fs").readdirSync(TESTS_DIR).forEach(file => file.endsWith(`.${DEVICEID}.txt`) && runTest(file)); + console.log("Finish"); + jsStopIdle(); + + if (erroredApps.length) { + erroredApps.forEach(app => { + console.log(`::error file=${app.id}::${app.id}`); + console.log("::group::Log"); + app.log.split("\n").forEach(line => console.log(`\u001b[38;2;255;0;0m${line}`)); + console.log("::endgroup::"); + }); + process.exit(1); + } + process.exit(0); +}); diff --git a/tests/FactoryApps/about.BANGLEJS.txt b/tests/FactoryApps/about.BANGLEJS.txt new file mode 100644 index 0000000000..3f4f455921 --- /dev/null +++ b/tests/FactoryApps/about.BANGLEJS.txt @@ -0,0 +1,35 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; + +bootCode += "var loadCalled = false;"; +bootCode += "var load = () => loadCalled = true;"; +require("Storage").write(".boot1", bootCode); + +// act +load("about.app.js"); + +press(BTN1); // quit + +// assert +if (!loadCalled) throw "Error"; diff --git a/tests/FactoryApps/about.BANGLEJS2.txt b/tests/FactoryApps/about.BANGLEJS2.txt new file mode 100644 index 0000000000..3f4f455921 --- /dev/null +++ b/tests/FactoryApps/about.BANGLEJS2.txt @@ -0,0 +1,35 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; + +bootCode += "var loadCalled = false;"; +bootCode += "var load = () => loadCalled = true;"; +require("Storage").write(".boot1", bootCode); + +// act +load("about.app.js"); + +press(BTN1); // quit + +// assert +if (!loadCalled) throw "Error"; diff --git a/tests/FactoryApps/alarm.BANGLEJS.txt b/tests/FactoryApps/alarm.BANGLEJS.txt new file mode 100644 index 0000000000..c7348c0562 --- /dev/null +++ b/tests/FactoryApps/alarm.BANGLEJS.txt @@ -0,0 +1,45 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; +require("Storage").write(".boot1", bootCode); + +require("Storage").erase("sched.json"); + +// act +load("alarm.app.js"); + +press(BTN3); // down to new +press(BTN2); // OK +press(BTN3); // down to alarm +press(BTN2); // OK +press(BTN2); // Back +press(BTN3); // down to new +press(BTN2); // OK +press(BTN3); // down to alarm +press(BTN3); // down to timer +press(BTN2); // OK +press(BTN2); // Back +press(BTN2); // Back + +// assert +if (!require("Storage").list("sched.json").length) throw "Error"; diff --git a/tests/FactoryApps/alarm.BANGLEJS2.txt b/tests/FactoryApps/alarm.BANGLEJS2.txt new file mode 100644 index 0000000000..e52052e124 --- /dev/null +++ b/tests/FactoryApps/alarm.BANGLEJS2.txt @@ -0,0 +1,15 @@ +// arrange +require("Storage").erase("sched.json"); + +// act +load("alarm.app.js"); +Bangle.emit("touch", 0, { x: 0, y: 80 }); // new +Bangle.emit("touch", 0, { x: 0, y: 80 }); // alarm +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back +Bangle.emit("touch", 0, { x: 0, y: 80 }); // new +Bangle.emit("touch", 0, { x: 0, y: 100 }); // timer +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back + +// assert +if (!require("Storage").list("sched.json").length) throw "Error"; diff --git a/tests/FactoryApps/health.BANGLEJS2.txt b/tests/FactoryApps/health.BANGLEJS2.txt new file mode 100644 index 0000000000..5c67b696d2 --- /dev/null +++ b/tests/FactoryApps/health.BANGLEJS2.txt @@ -0,0 +1,14 @@ +// arrange +require("Storage").erase("health.json"); + +// act +load("health.app.js"); +Bangle.emit("drag", { "dx": 0, "dy": -30 }); // scroll down +Bangle.emit("touch", 0, { x: 0, y: 150 }); // Settings +Bangle.emit("touch", 0, { x: 0, y: 80 }); // HRM Interval +Bangle.emit("touch", 0, { x: 0, y: 100 }); // 3 min +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back + +// assert +if (!require("Storage").list("health.json").length) throw "Error"; diff --git a/tests/FactoryApps/sched.BANGLEJS.txt b/tests/FactoryApps/sched.BANGLEJS.txt new file mode 100644 index 0000000000..8e2ffcf495 --- /dev/null +++ b/tests/FactoryApps/sched.BANGLEJS.txt @@ -0,0 +1,39 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; +require("Storage").write(".boot1", bootCode); + +require("Storage").erase("sched.json"); +var timer = require("sched").newDefaultTimer(); +timer.timer = 1; +timer.del = false; +require("sched").setAlarm("unitTest", timer); + +// act +load("sched.js"); + +press(BTN3); // right to stop +press(BTN2); // stop + +// assert +if (!require("Storage").readJSON("sched.json") || !require("Storage").readJSON("sched.json").some(alarm => !alarm.on)) throw "Error"; diff --git a/tests/FactoryApps/sched.BANGLEJS2.txt b/tests/FactoryApps/sched.BANGLEJS2.txt new file mode 100644 index 0000000000..dc278656c0 --- /dev/null +++ b/tests/FactoryApps/sched.BANGLEJS2.txt @@ -0,0 +1,14 @@ +// arrange +require("Storage").erase("sched.json"); + +var timer = require("sched").newDefaultTimer(); +timer.timer = 1; +timer.del = false; +require("sched").setAlarm("unitTest", timer); + +// act +load("sched.js"); +Bangle.emit("touch", 1, { x: 140, y: 140 }); // Stop + +// assert +if (!require("Storage").readJSON("sched.json") || !require("Storage").readJSON("sched.json").some(alarm => !alarm.on)) throw "Error"; diff --git a/tests/FactoryApps/setting.BANGLEJS.txt b/tests/FactoryApps/setting.BANGLEJS.txt new file mode 100644 index 0000000000..df0697cab9 --- /dev/null +++ b/tests/FactoryApps/setting.BANGLEJS.txt @@ -0,0 +1,40 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; +require("Storage").write(".boot1", bootCode); + +require("Storage").erase(".boot0"); + +// act +load("setting.app.js"); + +press(BTN1); // Up to Utils +press(BTN2); // OK +press(BTN3); // Down to debug +press(BTN3); // Down to compact +press(BTN3); // Down to rewrite settings +press(BTN2); // OK +press(BTN2); // Back + +// assert +if (!require("Storage").list(".boot0").length) throw "Error"; diff --git a/tests/FactoryApps/setting.BANGLEJS2.txt b/tests/FactoryApps/setting.BANGLEJS2.txt new file mode 100644 index 0000000000..2946c0d84f --- /dev/null +++ b/tests/FactoryApps/setting.BANGLEJS2.txt @@ -0,0 +1,15 @@ +// arrange +require("Storage").erase(".boot0"); + +// act +load("setting.app.js"); + +Bangle.emit("drag", { "dx": 0, "dy": -70 }); // scroll down +Bangle.emit("touch", 0, { x: 0, y: 150 }); // utils +Bangle.emit("touch", 0, { x: 0, y: 150 }); // rewrite settings +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back +Bangle.emit("touch", 0, { x: 0, y: 0 }); // back + +// assert +if (!require("Storage").list(".boot0").length) throw "Error"; + diff --git a/tests/FactoryApps/welcome.BANGLEJS.txt b/tests/FactoryApps/welcome.BANGLEJS.txt new file mode 100644 index 0000000000..8433e348e8 --- /dev/null +++ b/tests/FactoryApps/welcome.BANGLEJS.txt @@ -0,0 +1,46 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; + +bootCode += "var load = () => require('welcome.boot.js');"; +require("Storage").write(".boot1", bootCode); + +require("Storage").erase("welcome.json"); + +// act +load("welcome.app.js"); + +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN3); // next scene +press(BTN2); // back + +// assert +if (!require("Storage").list("welcome.json").length) throw "Error"; diff --git a/tests/FactoryApps/welcome.BANGLEJS2.txt b/tests/FactoryApps/welcome.BANGLEJS2.txt new file mode 100644 index 0000000000..353d52fe40 --- /dev/null +++ b/tests/FactoryApps/welcome.BANGLEJS2.txt @@ -0,0 +1,45 @@ +// arrange +var bootCode = ""; +bootCode += "var setWatchOrg = setWatch;"; +bootCode += "var callBacks = [];"; +bootCode += "var setWatch = (callBack, btn) => {"; +bootCode += " let watchNo = setWatchOrg.apply(null, arguments);"; +bootCode += " callBacks[watchNo] = {btn: btn, callBack: callBack};"; +bootCode += " return watchNo;"; +bootCode += "};"; +bootCode += "var clearWatchOrg = clearWatch;"; +bootCode += "var clearWatch = (watchNo) => {"; +bootCode += " if (watchNo) {"; +bootCode += " clearWatchOrg(watchNo);"; +bootCode += " delete callBacks[watchNo];"; +bootCode += " } else {"; +bootCode += " clearWatchOrg();"; +bootCode += " callBacks = [];"; +bootCode += " }"; +bootCode += "};"; + +bootCode += "press = (btn) => callBacks"; +bootCode += " .filter(callBack => callBack.btn == btn)"; +bootCode += " .forEach(callBack => callBack.callBack());"; + +bootCode += "var load = () => require('welcome.boot.js');"; +require("Storage").write(".boot1", bootCode); + +require("Storage").erase("welcome.json"); + +// act +load("welcome.app.js"); + +press(BTN1); // to scene 2 +press(BTN1); // to scene 3 +press(BTN1); // to scene 4 +press(BTN1); // to scene 5 +press(BTN1); // to scene 6 +press(BTN1); // to scene 7 +press(BTN1); // to scene 8 +press(BTN1); // to scene 9 +press(BTN1); // to scene 10 +press(BTN1); // back + +// assert +if (!require("Storage").list("welcome.json").length) throw "Error"; From f860f7e6722c2407f7f6a4a679f3500f3d6ca41f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 14 Jul 2022 13:37:15 +0100 Subject: [PATCH 0179/1183] nRF5x: Call sd_ble_gattc_hv_confirm in response to BLE indications --- ChangeLog | 1 + targets/nrf5x/bluetooth.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index 113e1cc796..2d5d72ced9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,7 @@ Bangle.js: Ensure E.showMessage background color comes from theme Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage (fix #2152) Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) + nRF5x: Call sd_ble_gattc_hv_confirm in response to BLE indications 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 1f603c2bea..5b4d989ab4 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -1679,6 +1679,9 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { const ble_gattc_evt_hvx_t *p_hvx = &p_ble_evt->evt.gattc_evt.params.hvx; // p_hvx->type is BLE_GATT_HVX_NOTIFICATION or BLE_GATT_HVX_INDICATION jsble_queue_pending_buf(BLEP_NOTIFICATION, p_hvx->handle, (char*)p_hvx->data, p_hvx->len); + if (p_hvx->type == BLE_GATT_HVX_INDICATION) { + sd_ble_gattc_hv_confirm(p_ble_evt->evt.gattc_evt.conn_handle, p_hvx->handle); + } } break; #endif From 285a367a8575f6b7914a3ae59145bf2966e088dc Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 15 Jul 2022 08:46:58 +0100 Subject: [PATCH 0180/1183] Bangle.js 2: Make Bangle.setBarometerPower retry twice if it has an I2C error --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 106 ++++++++++++++++++---------------- 2 files changed, 57 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d5d72ced9..d3700dfc5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage (fix #2152) Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) nRF5x: Call sd_ble_gattc_hv_confirm in response to BLE indications + Bangle.js 2: Make Bangle.setBarometerPower retry twice if it has an I2C error 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 92c2d3efbd..002bc4ba40 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -2550,56 +2550,62 @@ bool jswrap_banglejs_setBarometerPower(bool isOn, JsVar *appId) { isOn = setDeviceRequested("Barom", appId, isOn); if (isOn) bangleFlags |= JSBF_BAROMETER_ON; else bangleFlags &= ~JSBF_BAROMETER_ON; - if (isOn) { - if (!wasOn) { -#ifdef PRESSURE_DEVICE_SPL06_007_EN - if (PRESSURE_DEVICE_SPL06_007_EN) { - jswrap_banglejs_barometerWr(SPL06_CFGREG, 0); // No FIFO or IRQ (should be default but has been nonzero when read! - jswrap_banglejs_barometerWr(SPL06_PRSCFG, 0x33); // pressure oversample by 8x, 8 measurement per second - jswrap_banglejs_barometerWr(SPL06_TMPCFG, 0xB3); // temperature oversample by 8x, 8 measurements per second, external sensor - jswrap_banglejs_barometerWr(SPL06_MEASCFG, 7); // continuous temperature and pressure measurement - // read calibration data - unsigned char buf[SPL06_COEF_NUM]; - buf[0] = SPL06_COEF_START; jsi2cWrite(PRESSURE_I2C, PRESSURE_ADDR, 1, buf, false); - jsi2cRead(PRESSURE_I2C, PRESSURE_ADDR, SPL06_COEF_NUM, buf, true); - barometer_c0 = twosComplement(((unsigned short)buf[0] << 4) | (((unsigned short)buf[1] >> 4) & 0x0F), 12); - barometer_c1 = twosComplement((((unsigned short)buf[1] & 0x0F) << 8) | buf[2], 12); - barometer_c00 = twosComplement(((unsigned int)buf[3] << 12) | ((unsigned int)buf[4] << 4) | (((unsigned int)buf[5] >> 4) & 0x0F), 20); - barometer_c10 = twosComplement((((unsigned int)buf[5] & 0x0F) << 16) | ((unsigned int)buf[6] << 8) | (unsigned int)buf[7], 20); - barometer_c01 = twosComplement(((unsigned short)buf[8] << 8) | (unsigned short)buf[9], 16); - barometer_c11 = twosComplement(((unsigned short)buf[10] << 8) | (unsigned short)buf[11], 16); - barometer_c20 = twosComplement(((unsigned short)buf[12] << 8) | (unsigned short)buf[13], 16); - barometer_c21 = twosComplement(((unsigned short)buf[14] << 8) | (unsigned short)buf[15], 16); - barometer_c30 = twosComplement(((unsigned short)buf[16] << 8) | (unsigned short)buf[17], 16); - } -#endif // PRESSURE_DEVICE_SPL06_007_EN -#ifdef PRESSURE_DEVICE_BMP280_EN - if (PRESSURE_DEVICE_BMP280_EN) { - jswrap_banglejs_barometerWr(0xF4, 0x27); // ctrl_meas_reg - normal mode, no pressure/temp oversample - jswrap_banglejs_barometerWr(0xF5, 0xA0); // config_reg - 1s standby, no filter, I2C - // read calibration data - unsigned char buf[24]; - buf[0] = 0x88; jsi2cWrite(PRESSURE_I2C, PRESSURE_ADDR, 1, buf, false); - jsi2cRead(PRESSURE_I2C, PRESSURE_ADDR, 24, buf, true); - int i; - barometerDT[0] = ((int)buf[1] << 8) | (int)buf[0]; //first coeff is unsigned - for (i=1;i<3;i++) - barometerDT[i] = twosComplement(((int)buf[(i*2)+1] << 8) | (int)buf[i*2], 16); - barometerDP[0] = ((int)buf[7] << 8) | (int)buf[6]; //first coeff is unsigned - for (i=1;i<9;i++) - barometerDP[i] = twosComplement(((int)buf[(i*2)+7] << 8) | (int)buf[(i*2)+6], 16); - } -#endif // PRESSURE_DEVICE_BMP280_EN - } // wasOn - } else { // !isOn -> turn off -#ifdef PRESSURE_DEVICE_SPL06_007_EN - if (PRESSURE_DEVICE_SPL06_007_EN) - jswrap_banglejs_barometerWr(SPL06_MEASCFG, 0); // Barometer off -#endif -#ifdef PRESSURE_DEVICE_BMP280_EN - if (PRESSURE_DEVICE_BMP280_EN) - jswrap_banglejs_barometerWr(0xF4, 0); // Barometer off -#endif + int tries = 3; + while (tries-- > 0) { + if (isOn) { + if (!wasOn) { + #ifdef PRESSURE_DEVICE_SPL06_007_EN + if (PRESSURE_DEVICE_SPL06_007_EN) { + jswrap_banglejs_barometerWr(SPL06_CFGREG, 0); // No FIFO or IRQ (should be default but has been nonzero when read! + jswrap_banglejs_barometerWr(SPL06_PRSCFG, 0x33); // pressure oversample by 8x, 8 measurement per second + jswrap_banglejs_barometerWr(SPL06_TMPCFG, 0xB3); // temperature oversample by 8x, 8 measurements per second, external sensor + jswrap_banglejs_barometerWr(SPL06_MEASCFG, 7); // continuous temperature and pressure measurement + // read calibration data + unsigned char buf[SPL06_COEF_NUM]; + buf[0] = SPL06_COEF_START; jsi2cWrite(PRESSURE_I2C, PRESSURE_ADDR, 1, buf, false); + jsi2cRead(PRESSURE_I2C, PRESSURE_ADDR, SPL06_COEF_NUM, buf, true); + barometer_c0 = twosComplement(((unsigned short)buf[0] << 4) | (((unsigned short)buf[1] >> 4) & 0x0F), 12); + barometer_c1 = twosComplement((((unsigned short)buf[1] & 0x0F) << 8) | buf[2], 12); + barometer_c00 = twosComplement(((unsigned int)buf[3] << 12) | ((unsigned int)buf[4] << 4) | (((unsigned int)buf[5] >> 4) & 0x0F), 20); + barometer_c10 = twosComplement((((unsigned int)buf[5] & 0x0F) << 16) | ((unsigned int)buf[6] << 8) | (unsigned int)buf[7], 20); + barometer_c01 = twosComplement(((unsigned short)buf[8] << 8) | (unsigned short)buf[9], 16); + barometer_c11 = twosComplement(((unsigned short)buf[10] << 8) | (unsigned short)buf[11], 16); + barometer_c20 = twosComplement(((unsigned short)buf[12] << 8) | (unsigned short)buf[13], 16); + barometer_c21 = twosComplement(((unsigned short)buf[14] << 8) | (unsigned short)buf[15], 16); + barometer_c30 = twosComplement(((unsigned short)buf[16] << 8) | (unsigned short)buf[17], 16); + } + #endif // PRESSURE_DEVICE_SPL06_007_EN + #ifdef PRESSURE_DEVICE_BMP280_EN + if (PRESSURE_DEVICE_BMP280_EN) { + jswrap_banglejs_barometerWr(0xF4, 0x27); // ctrl_meas_reg - normal mode, no pressure/temp oversample + jswrap_banglejs_barometerWr(0xF5, 0xA0); // config_reg - 1s standby, no filter, I2C + // read calibration data + unsigned char buf[24]; + buf[0] = 0x88; jsi2cWrite(PRESSURE_I2C, PRESSURE_ADDR, 1, buf, false); + jsi2cRead(PRESSURE_I2C, PRESSURE_ADDR, 24, buf, true); + int i; + barometerDT[0] = ((int)buf[1] << 8) | (int)buf[0]; //first coeff is unsigned + for (i=1;i<3;i++) + barometerDT[i] = twosComplement(((int)buf[(i*2)+1] << 8) | (int)buf[i*2], 16); + barometerDP[0] = ((int)buf[7] << 8) | (int)buf[6]; //first coeff is unsigned + for (i=1;i<9;i++) + barometerDP[i] = twosComplement(((int)buf[(i*2)+7] << 8) | (int)buf[(i*2)+6], 16); + } + #endif // PRESSURE_DEVICE_BMP280_EN + } // wasOn + } else { // !isOn -> turn off + #ifdef PRESSURE_DEVICE_SPL06_007_EN + if (PRESSURE_DEVICE_SPL06_007_EN) + jswrap_banglejs_barometerWr(SPL06_MEASCFG, 0); // Barometer off + #endif + #ifdef PRESSURE_DEVICE_BMP280_EN + if (PRESSURE_DEVICE_BMP280_EN) + jswrap_banglejs_barometerWr(0xF4, 0); // Barometer off + #endif + } + if (!tries || !jspHasError()) return isOn; // return - all is going correctly (or we tried a few times and failed) + // we had an error (almost certainly I2C) - clear the error and try again hopefully + jsvUnLock(jspGetException()); } return isOn; #else // PRESSURE_DEVICE From 1f2a3b4521f11837c54f28c33782ef3698df10a3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Jul 2022 15:49:32 +0100 Subject: [PATCH 0181/1183] Fix errors creating type files --- libs/graphics/jswrap_graphics.c | 3 ++- libs/misc/jswrap_unistroke.c | 22 +++++++++++++++++ scripts/build_tern_json.js | 43 +++++++++++++++++++++------------ 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 477b1c0be7..0f7dd3412e 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -453,7 +453,8 @@ a full update of the screen. /*JSON{ "type" : "property", "class" : "Graphics", - "name" : "buffer" + "name" : "buffer", + "return" : ["JsVar","An ArrayBuffer (or not defined on Graphics instances not created with `Graphics.createArrayBuffer`)"] } On Graphics instances with an offscreen buffer, this is an `ArrayBuffer` that provides access to the underlying diff --git a/libs/misc/jswrap_unistroke.c b/libs/misc/jswrap_unistroke.c index 859f65c6e3..6e4caf7e3d 100644 --- a/libs/misc/jswrap_unistroke.c +++ b/libs/misc/jswrap_unistroke.c @@ -14,6 +14,28 @@ #include "jswrap_unistroke.h" #include "unistroke.h" +/*JSON{ + "type" : "class", + "class" : "Unistroke", + "ifdef" : "BANGLEJS2" +} +This class provides functionality to recognise gestures drawn +on a touchscreen. It is only built into Bangle.js 2. + +Usage: + +``` +var strokes = { + stroke1 : Unistroke.new(new Uint8Array([x1, y1, x2, y2, x3, y3, ...])), + stroke2 : Unistroke.new(new Uint8Array([x1, y1, x2, y2, x3, y3, ...])), + stroke3 : Unistroke.new(new Uint8Array([x1, y1, x2, y2, x3, y3, ...])) +}; +var r = Unistroke.recognise(strokes,new Uint8Array([x1, y1, x2, y2, x3, y3, ...])) +print(r); // stroke1/stroke2/stroke3 +``` + +*/ + /*JSON{ "type" : "staticmethod", "class" : "Unistroke", diff --git a/scripts/build_tern_json.js b/scripts/build_tern_json.js index 8393303547..a90d56b616 100755 --- a/scripts/build_tern_json.js +++ b/scripts/build_tern_json.js @@ -5,21 +5,28 @@ // This build a JSON description file for Tern.js as // specified here: http://ternjs.net/doc/manual.html#typedef -var marked = require('marked'); -// Set default options except highlight which has no default -marked.setOptions({ - gfm: true, // github markdown - highlight: function (code) { - return require('highlight.js').highlightAuto(code).value; - }, - tables: true, - breaks: false, - pedantic: false, - sanitize: false, - smartLists: true, - smartypants: false, - langPrefix: 'lang-' -}); +var marked = v => v; +try { + marked = require('marked'); + // Set default options except highlight which has no default + marked.setOptions({ + gfm: true, // github markdown + highlight: function (code) { + return require('highlight.js').highlightAuto(code).value; + }, + tables: true, + breaks: false, + pedantic: false, + sanitize: false, + smartLists: true, + smartypants: false, + langPrefix: 'lang-' + }); +} catch (e) { + console.error("WARNING: marked is not installed"); +} + +var hadErrors = false; require("./common.js").readAllWrapperFiles(function(json) { var tern = { "!name": "Espruino" }; @@ -50,6 +57,7 @@ require("./common.js").readAllWrapperFiles(function(json) { } } catch (e) { console.error("Exception "+e, j); + hadErrors = true; } }); @@ -94,6 +102,7 @@ require("./common.js").readAllWrapperFiles(function(json) { console.warn("Unknown type "+j.type+" for ",j); } catch (e) { console.error("Exception "+e, e.stack, j); + hadErrors = true; } }); @@ -101,6 +110,10 @@ require("./common.js").readAllWrapperFiles(function(json) { delete tern["Telnet"]["!type"]; + if (hadErrors) { + console.log("ERRORS PROCESING FILES"); + process.exit(1); + } console.log(JSON.stringify(tern,null,2)); }); From 5ac00d984e31c512c2294cf8eb8f8e72687cab91 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Jul 2022 15:54:43 +0100 Subject: [PATCH 0182/1183] tweak for new marked --- scripts/build_tern_json.js | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/scripts/build_tern_json.js b/scripts/build_tern_json.js index a90d56b616..890bc16fd4 100755 --- a/scripts/build_tern_json.js +++ b/scripts/build_tern_json.js @@ -5,26 +5,23 @@ // This build a JSON description file for Tern.js as // specified here: http://ternjs.net/doc/manual.html#typedef -var marked = v => v; -try { - marked = require('marked'); - // Set default options except highlight which has no default - marked.setOptions({ - gfm: true, // github markdown - highlight: function (code) { - return require('highlight.js').highlightAuto(code).value; - }, - tables: true, - breaks: false, - pedantic: false, - sanitize: false, - smartLists: true, - smartypants: false, - langPrefix: 'lang-' - }); -} catch (e) { - console.error("WARNING: marked is not installed"); -} +var marked = require('marked'); +// yay - new marked version incompatible with old one... +if (marked.marked) marked=marked.marked; +// Set default options except highlight which has no default +marked.setOptions({ + gfm: true, // github markdown + highlight: function (code) { + return require('highlight.js').highlightAuto(code).value; + }, + tables: true, + breaks: false, + pedantic: false, + sanitize: false, + smartLists: true, + smartypants: false, + langPrefix: 'lang-' +}); var hadErrors = false; From 3e9d5f99d6d0c3d797a6b04cc5b814983a4602c6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Jul 2022 16:58:53 +0100 Subject: [PATCH 0183/1183] fix broken json --- targets/esp8266/jswrap_esp8266.c | 1 - 1 file changed, 1 deletion(-) diff --git a/targets/esp8266/jswrap_esp8266.c b/targets/esp8266/jswrap_esp8266.c index 1e4aff7819..1212ec45ba 100644 --- a/targets/esp8266/jswrap_esp8266.c +++ b/targets/esp8266/jswrap_esp8266.c @@ -71,7 +71,6 @@ void jswrap_ESP8266_reboot() { "name" : "getResetInfo", "generate" : "jswrap_ESP8266_getResetInfo", "return" : ["JsVar","An object with the reset cause information"], - "return_object" : "RstInfo" } At boot time the esp8266's firmware captures the cause of the reset/reboot. This function returns this information in an object with the following fields: From 255b25505c62dc528bef8c3cf9ea2bd06f16555e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Jul 2022 17:00:33 +0100 Subject: [PATCH 0184/1183] really fix broken JSON --- targets/esp8266/jswrap_esp8266.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/esp8266/jswrap_esp8266.c b/targets/esp8266/jswrap_esp8266.c index 1212ec45ba..02ce89ea97 100644 --- a/targets/esp8266/jswrap_esp8266.c +++ b/targets/esp8266/jswrap_esp8266.c @@ -70,7 +70,7 @@ void jswrap_ESP8266_reboot() { "ifdef" : "ESP8266", "name" : "getResetInfo", "generate" : "jswrap_ESP8266_getResetInfo", - "return" : ["JsVar","An object with the reset cause information"], + "return" : ["JsVar","An object with the reset cause information"] } At boot time the esp8266's firmware captures the cause of the reset/reboot. This function returns this information in an object with the following fields: From bece571f8ec8a2148be5f37bffc1821d0f52ef1d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 20 Jul 2022 17:13:18 +0100 Subject: [PATCH 0185/1183] Bangle.js 2: Fix `NRF.setAdvertising({},{scannable:false})` Bangle.js 2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) --- ChangeLog | 2 + libs/bluetooth/bluetooth.h | 4 +- libs/bluetooth/jswrap_bluetooth.c | 11 +-- libs/pixljs/jswrap_pixljs.c | 4 +- targets/esp32/bluetooth.c | 10 ++- targets/nrf5x/bluetooth.c | 108 ++++++++++++++++++++++-------- 6 files changed, 99 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index d3700dfc5b..06cbff29f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,6 +18,8 @@ Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) nRF5x: Call sd_ble_gattc_hv_confirm in response to BLE indications Bangle.js 2: Make Bangle.setBarometerPower retry twice if it has an I2C error + Bangle.js 2: Fix `NRF.setAdvertising({},{scannable:false})` + Bangle.js 2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/bluetooth/bluetooth.h b/libs/bluetooth/bluetooth.h index 5e8bb412af..967f7b7c80 100644 --- a/libs/bluetooth/bluetooth.h +++ b/libs/bluetooth/bluetooth.h @@ -234,8 +234,8 @@ bool jsble_check_error(uint32_t err_code); /** Set the connection interval of the peripheral connection. Returns an error code */ uint32_t jsble_set_periph_connection_interval(JsVarFloat min, JsVarFloat max); -/// Scanning for advertising packets -uint32_t jsble_set_scanning(bool enabled, bool activeScan); +/// Scanning for advertising packets. options can be an object with optional {active:bool, phy:"1mbps/2mbps/coded"} +uint32_t jsble_set_scanning(bool enabled, JsVar *options); /// returning RSSI values for current connection uint32_t jsble_set_rssi_scan(bool enabled); diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 24cb176bf4..bf0e62567b 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -235,7 +235,7 @@ void jswrap_ble_reconfigure_softdevice() { JsVar *v,*o; // restart various v = jsvObjectGetChild(execInfo.root, BLE_SCAN_EVENT,0); - if (v) jsble_set_scanning(true, false); + if (v) jsble_set_scanning(true, NULL); jsvUnLock(v); v = jsvObjectGetChild(execInfo.root, BLE_RSSI_EVENT,0); if (v) jsble_set_rssi_scan(true); @@ -286,7 +286,7 @@ void jswrap_ble_kill() { if (bleTaskInfo2) jsvUnLock(bleTaskInfo2); bleTaskInfo2 = 0; // if we were scanning, make sure we stop - jsble_set_scanning(false, false); + jsble_set_scanning(false, NULL); jsble_set_rssi_scan(false); #if CENTRAL_LINK_COUNT>0 @@ -782,6 +782,7 @@ NRF.setAdvertising([ interval: 600 // Advertising interval in msec, between 20 and 10000 (default is 375ms) manufacturer: 0x0590 // IF sending manufacturer data, this is the manufacturer ID manufacturerData: [...] // IF sending manufacturer data, this is an array of data + phy: "1mbps/2mbps/coded" // (NRF52840 only) use the long-range coded phy for transmission (1mbps default) } ``` @@ -1886,9 +1887,7 @@ void jswrap_ble_setScan_cb(JsVar *callback, JsVar *filters, JsVar *adv) { void jswrap_ble_setScan(JsVar *callback, JsVar *options) { JsVar *filters = 0; - bool activeScan = false; if (jsvIsObject(options)) { - activeScan = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "active", 0)); filters = jsvObjectGetChild(options, "filters", 0); if (filters && !jsvIsArray(filters)) { jsvUnLock(filters); @@ -1911,7 +1910,7 @@ void jswrap_ble_setScan(JsVar *callback, JsVar *options) { jsvObjectRemoveChild(execInfo.root, BLE_SCAN_EVENT); } // either start or stop scanning - uint32_t err_code = jsble_set_scanning(callback != 0, activeScan); + uint32_t err_code = jsble_set_scanning(callback != 0, options); jsble_check_error(err_code); jsvUnLock(filters); } @@ -2983,6 +2982,8 @@ Espruino will pick the FIRST device it finds, or it'll call `catch`. is found. eg. `NRF.requestDevice({ timeout:2000, filters: [ ... ] })` * `active` - whether to perform active scanning (requesting 'scan response' packets from any devices that are found). eg. `NRF.requestDevice({ active:true, filters: [ ... ] })` +* `phy` - (NRF52840 only) use the long-range coded phy (`"1mbps"` default, can be `"1mbps/2mbps/both/coded"`) +* `extended` - (NRF52840 only) support receiving extended-length advertising packets (default=true if phy isn't `"1mbps"`) **NOTE:** `timeout` and `active` are not part of the Web Bluetooth standard. diff --git a/libs/pixljs/jswrap_pixljs.c b/libs/pixljs/jswrap_pixljs.c index 4d041ed6e8..8e35fe4fd4 100644 --- a/libs/pixljs/jswrap_pixljs.c +++ b/libs/pixljs/jswrap_pixljs.c @@ -323,13 +323,13 @@ static bool pixl_selfTest() { jsiConsolePrintf("Have events - no BLE test\n"); } else { uint32_t err_code; - err_code = jsble_set_scanning(true, false); + err_code = jsble_set_scanning(true, NULL); jsble_check_error(err_code); int timeout = 20; while (timeout-- && !jshHasEvents()) { nrf_delay_ms(100); } - err_code = jsble_set_scanning(false, false); + err_code = jsble_set_scanning(false, NULL); jsble_check_error(err_code); if (!jshHasEvents()) { jsiConsolePrintf("No BLE adverts found in 2s\n"); diff --git a/targets/esp32/bluetooth.c b/targets/esp32/bluetooth.c index 5725a6f7c0..be7dd2ff1f 100644 --- a/targets/esp32/bluetooth.c +++ b/targets/esp32/bluetooth.c @@ -139,9 +139,13 @@ bool jsble_check_error_line(uint32_t err_code, int lineNumber) { return false; } /// Scanning for advertisign packets -uint32_t jsble_set_scanning(bool enabled, bool activeScan){ - if (activeScan) { - jsWarn("active scan not implemented\n"); +uint32_t jsble_set_scanning(bool enabled, JsVar *options){ + bool activeScan = false; + if (enabled && jsvIsObject(options)) { + activeScan = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "active", 0)); + if (activeScan) { + jsWarn("active scan not implemented\n"); + } } bluetooth_gap_setScan(enabled); return 0; diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 5b4d989ab4..e9fd846b2b 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -244,12 +244,14 @@ typedef struct { } BLEAdvReportData; #if NRF_SD_BLE_API_VERSION>5 - // if m_scan_param.extended=1, use BLE_GAP_SCAN_BUFFER_EXTENDED_MIN -uint8_t m_scan_buffer_data[BLE_GAP_SCAN_BUFFER_MIN]; /**< buffer where advertising reports will be stored by the SoftDevice. */ +// if m_scan_param.extended=0, use BLE_GAP_SCAN_BUFFER_MIN +// if m_scan_param.extended=1, use BLE_GAP_SCAN_BUFFER_EXTENDED_MIN +uint8_t m_scan_buffer_data[BLE_GAP_SCAN_BUFFER_EXTENDED_MIN]; /**< buffer where advertising reports will be stored by the SoftDevice. */ ble_data_t m_scan_buffer = { m_scan_buffer_data, - BLE_GAP_SCAN_BUFFER_MIN + sizeof(m_scan_buffer_data) }; +// TODO: this is 255 bytes to allow extended advertising. Maybe we don't need that all the time? #endif // ----------------------------------------------------------------------------------- @@ -2617,6 +2619,8 @@ uint32_t jsble_advertising_start() { jsvObjectIteratorFree(&it); } jsvUnLock(advServices); + // check for any options set up + JsVar *advOptions = jsvObjectGetChild(execInfo.hiddenRoot, BLE_NAME_ADVERTISE_OPTIONS, 0); // update scan response packet memset(&scanrsp, 0, sizeof(scanrsp)); scanrsp.uuids_complete.uuid_cnt = adv_uuid_count; @@ -2629,12 +2633,33 @@ uint32_t jsble_advertising_start() { bool non_scannable = bleStatus & BLE_IS_NOT_SCANNABLE; #if NRF_SD_BLE_API_VERSION>5 adv_params.primary_phy = BLE_GAP_PHY_1MBPS; - adv_params.p_peer_addr = NULL; - adv_params.properties.type = non_connectable - ? (non_scannable ? BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED : BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED) - : (non_scannable ? BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED/*experimental*/ : BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED); + adv_params.secondary_phy = BLE_GAP_PHY_AUTO; // the default adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED; + //adv_params.scan_req_notification = 1; // creates a BLE_GAP_EVT_SCAN_REQ_REPORT event + if (jsvIsObject(advOptions)) { // extended SDK15+ options + JsVar *advPhy = jsvObjectGetChild(advOptions, "phy", 0); + if (jsvIsUndefined(advPhy) || jsvIsStringEqual(advPhy,"1mbps")) { + // default + } else if (jsvIsStringEqual(advPhy,"2mbps")) { + adv_params.primary_phy = BLE_GAP_PHY_1MBPS; + adv_params.secondary_phy = BLE_GAP_PHY_2MBPS; + } else if (jsvIsStringEqual(advPhy,"coded")) { + adv_params.primary_phy = non_connectable ? BLE_GAP_PHY_CODED : BLE_GAP_PHY_1MBPS; // must use 1mbps phy if connectable? + adv_params.secondary_phy = BLE_GAP_PHY_CODED; + } else jsWarn("Unknown phy %q\n", advPhy); + jsvUnLock(advPhy); + } + if (adv_params.secondary_phy == BLE_GAP_PHY_AUTO) { + // the default... + adv_params.properties.type = non_connectable + ? (non_scannable ? BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED : BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED) + : (non_scannable ? BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED/*experimental*/ : BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED); + } else { // coded/2mbps - force use of extended advertising + adv_params.properties.type = non_connectable + ? (non_scannable ? BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED : BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED) + : (non_scannable ? BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED : BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED); + } #else adv_params.type = non_connectable ? (non_scannable ? BLE_GAP_ADV_TYPE_ADV_NONCONN_IND : BLE_GAP_ADV_TYPE_ADV_SCAN_IND) @@ -2642,6 +2667,7 @@ uint32_t jsble_advertising_start() { adv_params.fp = BLE_GAP_ADV_FP_ANY; adv_params.timeout = APP_ADV_TIMEOUT_IN_SECONDS; #endif + jsvUnLock(advOptions); adv_params.p_peer_addr = NULL; adv_params.interval = bleAdvertisingInterval; @@ -2662,14 +2688,17 @@ uint32_t jsble_advertising_start() { //jsiConsolePrintf("adv_data_set %d %d\n", advPtr, advLen); #if NRF_SD_BLE_API_VERSION>5 ble_gap_adv_data_t d; + memset(&d, 0, sizeof(d)); d.adv_data.p_data = (uint8_t*)advPtr; d.adv_data.len = advLen; - d.scan_rsp_data.p_data = m_enc_scan_response_data; - d.scan_rsp_data.len = m_enc_scan_response_data_len; + if (!non_scannable) { + d.scan_rsp_data.p_data = m_enc_scan_response_data; + d.scan_rsp_data.len = m_enc_scan_response_data_len; + } err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &d, &adv_params); if (!err_code) { - sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, m_tx_power); + jsble_check_error(sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, m_tx_power)); err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); } #elif NRF_SD_BLE_API_VERSION<5 @@ -2820,33 +2849,53 @@ void jsble_restart_softdevice(JsVar *jsFunction) { jstRestartUtilTimer(); // restart the util timer } -uint32_t jsble_set_scanning(bool enabled, bool activeScan) { +uint32_t jsble_set_scanning(bool enabled, JsVar *options) { uint32_t err_code = 0; if (enabled) { - if (bleStatus & BLE_IS_SCANNING) return 0; - bleStatus |= BLE_IS_SCANNING; - ble_gap_scan_params_t m_scan_param; - memset(&m_scan_param,0,sizeof(m_scan_param)); + if (bleStatus & BLE_IS_SCANNING) return 0; + bleStatus |= BLE_IS_SCANNING; + ble_gap_scan_params_t m_scan_param; + memset(&m_scan_param,0,sizeof(m_scan_param)); #if NRF_SD_BLE_API_VERSION>5 - m_scan_param.scan_phys = BLE_GAP_PHY_AUTO; - m_scan_param.filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL; + m_scan_param.scan_phys = BLE_GAP_PHY_AUTO; + m_scan_param.filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL; #endif - // non-selective scan - m_scan_param.active = activeScan; // Active scanning set. - m_scan_param.interval = SCAN_INTERVAL;// Scan interval. - m_scan_param.window = SCAN_WINDOW; // Scan window. - m_scan_param.timeout = 0x0000; // No timeout - BLE_GAP_SCAN_TIMEOUT_UNLIMITED + m_scan_param.interval = SCAN_INTERVAL;// Scan interval. + m_scan_param.window = SCAN_WINDOW; // Scan window. + m_scan_param.timeout = 0x0000; // No timeout - BLE_GAP_SCAN_TIMEOUT_UNLIMITED + + if (jsvIsObject(options)) { + m_scan_param.active = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "active", 0)); // Active scanning set. + if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "extended", 0))) + m_scan_param.extended = 1; +#if NRF_SD_BLE_API_VERSION>5 + JsVar *advPhy = jsvObjectGetChild(options, "phy", 0); + if (jsvIsStringEqual(advPhy,"1mbps")) { + // default + } else if (jsvIsStringEqual(advPhy,"2mbps")) { + m_scan_param.scan_phys = BLE_GAP_PHY_2MBPS; + m_scan_param.extended = 1; + } else if (jsvIsStringEqual(advPhy,"both")) { + m_scan_param.scan_phys = BLE_GAP_PHYS_SUPPORTED; + m_scan_param.extended = 1; + } else if (jsvIsStringEqual(advPhy,"coded")) { + m_scan_param.scan_phys = BLE_GAP_PHY_CODED; + m_scan_param.extended = 1; + } else jsWarn("Unknown phy %q\n", advPhy); + jsvUnLock(advPhy); +#endif + } - err_code = sd_ble_gap_scan_start(&m_scan_param + err_code = sd_ble_gap_scan_start(&m_scan_param #if NRF_SD_BLE_API_VERSION>5 , &m_scan_buffer #endif ); - } else { - if (!(bleStatus & BLE_IS_SCANNING)) return 0; - bleStatus &= ~BLE_IS_SCANNING; - err_code = sd_ble_gap_scan_stop(); - } + } else { + if (!(bleStatus & BLE_IS_SCANNING)) return 0; + bleStatus &= ~BLE_IS_SCANNING; + err_code = sd_ble_gap_scan_stop(); + } return err_code; } @@ -3247,6 +3296,9 @@ void jsble_central_connect(ble_gap_addr_t peer_addr, JsVar *options) { m_scan_param.interval = MSEC_TO_UNITS(100, UNIT_0_625_MS); // Scan interval. m_scan_param.window = MSEC_TO_UNITS(90, UNIT_0_625_MS); // Scan window. m_scan_param.timeout = 4; // 4 second timeout. +#if NRF_SD_BLE_API_VERSION>5 + m_scan_param.scan_phys = BLE_GAP_PHYS_SUPPORTED; +#endif ble_gap_conn_params_t gap_conn_params; memset(&gap_conn_params, 0, sizeof(gap_conn_params)); From c090d12194f3ddd0a460cfa90ce01623e3acb9b3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Jul 2022 09:10:52 +0100 Subject: [PATCH 0186/1183] nRF52: Change from hard -> softfp calling convention (saves a few bytes, more compatible with compiled code) --- ChangeLog | 1 + make/family/NRF52.make | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 06cbff29f0..051a812a72 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,7 @@ Bangle.js 2: Make Bangle.setBarometerPower retry twice if it has an I2C error Bangle.js 2: Fix `NRF.setAdvertising({},{scannable:false})` Bangle.js 2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) + nRF52: Change from hard -> softfp calling convention (saves a few bytes, more compatible with compiled code) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/make/family/NRF52.make b/make/family/NRF52.make index b2e8c7f8ad..f703d76db1 100644 --- a/make/family/NRF52.make +++ b/make/family/NRF52.make @@ -77,7 +77,7 @@ endif endif # ARCHFLAGS are shared by both CFLAGS and LDFLAGS. -ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16 +ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=softfp -mfpu=fpv4-sp-d16 # nRF52 specific. INCLUDE += -I$(SOFTDEVICE_PATH)/headers From d3b3daeb8803f73d430d428344c97f242dc4049e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Jul 2022 09:17:56 +0100 Subject: [PATCH 0187/1183] fix SDK12 builds --- targets/nrf5x/bluetooth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index e9fd846b2b..04b9a25955 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -2866,9 +2866,9 @@ uint32_t jsble_set_scanning(bool enabled, JsVar *options) { if (jsvIsObject(options)) { m_scan_param.active = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "active", 0)); // Active scanning set. - if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "extended", 0))) - m_scan_param.extended = 1; #if NRF_SD_BLE_API_VERSION>5 + if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "extended", 0))) + m_scan_param.extended = 1 JsVar *advPhy = jsvObjectGetChild(options, "phy", 0); if (jsvIsStringEqual(advPhy,"1mbps")) { // default From 319e7b58c17d0b6feaddecc3b80d71e33c778e97 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Jul 2022 09:57:00 +0100 Subject: [PATCH 0188/1183] oops - now fix bangle.js 2 build --- targets/nrf5x/bluetooth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 04b9a25955..9b5a09317e 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -2868,7 +2868,7 @@ uint32_t jsble_set_scanning(bool enabled, JsVar *options) { m_scan_param.active = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "active", 0)); // Active scanning set. #if NRF_SD_BLE_API_VERSION>5 if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "extended", 0))) - m_scan_param.extended = 1 + m_scan_param.extended = 1; JsVar *advPhy = jsvObjectGetChild(options, "phy", 0); if (jsvIsStringEqual(advPhy,"1mbps")) { // default From 72780a44f8fc4872ac3d3271fc05c617031512a6 Mon Sep 17 00:00:00 2001 From: qucchia Date: Thu, 21 Jul 2022 12:23:31 +0200 Subject: [PATCH 0189/1183] Auto-generate types for TypeScript --- scripts/build_types.js | 201 +++++++++++++++++++++++++++++++++++++++ src/jswrap_arraybuffer.c | 2 +- 2 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 scripts/build_types.js diff --git a/scripts/build_types.js b/scripts/build_types.js new file mode 100644 index 0000000000..2ed6162d1a --- /dev/null +++ b/scripts/build_types.js @@ -0,0 +1,201 @@ +#!/usr/bin/node + +const fs = require("fs"); + +function indent(string) { + return string + .split("\n") + .map((line) => (line ? " " + line : line)) + .join("\n"); +} + +// TODO: Document parameters +function getDocumentation(object) { + if (!object) return ""; + return ( + "/**\n" + + object + .getDescription() + .split("\n") + .filter((line) => line) + .map((line) => line) + .concat([`@url ${object.getURL()}`]) + .map((line) => " * " + line) + .join("\n") + + "\n */" + ); +} + +function getBasicType(type) { + if (!type) return "any"; + if (["int", "float", "int32"].includes(type)) return "number"; + if (type == "pin") return "Pin"; + if (type == "bool") return "boolean"; + if (type == "File") return "EspFile"; + if (type == "JsVarArray") return "any"; + if (type == "JsVar") return "any"; + if (type == "Array") return "any[]"; + if (type == "Promise") return "Promise"; + return type; +} + +function getDeclaration(object, c) { + if ( + ["function", "method", "staticmethod", "constructor"].includes(object.type) + ) { + // function + let args = []; + if ("params" in object) + args = object.params.map((param) => { + // hack because digitalRead/Write can also take arrays/objects (but most use cases are Pins) + if (param[0] == "pin" && param[1] == "JsLet") param[1] = "Pin"; + if (param[0] === "function") param[0] = "func"; + if (param[0] === "var") param[0] = "variable"; + let doc = typeof param[2] === "string" ? param[2] : param[2].join("\n"); + let optional = doc && doc.startsWith("[optional]"); + let rest = param[1] === "JsVarArray"; + return ( + (rest ? "..." : "") + + param[0] + + (optional ? "?" : "") + + ": " + + getBasicType(param[1]) + + (rest ? "[]" : "") + ); + }); + let returnValue = "any"; + if ("return_object" in object) + returnValue = getBasicType(object.return_object); + else if ("return" in object) returnValue = getBasicType(object.return[0]); + if (c) { + return `${object.name}(${args.join(", ")}): ${returnValue};`; + } else { + return `function ${object.name}(${args.join(", ")}): ${returnValue};`; + } + } else { + // property + const type = + object.type === "object" + ? object.instanceof + : object.return[2] + ? getBasicType(object.return[2]) + : getBasicType(object.return[0]); + if (c) { + return `${object.name}: ${type};`; + } else { + return `const ${object.name}: ${type};`; + } + } +} + +require("./common.js").readAllWrapperFiles(function (objects) { + const classes = {}; + const globals = []; + + // Handle classes and libraries first + objects.forEach(function (object) { + if (object.type == "class" || object.type == "library") { + classes[object.class] = { + library: object.type === "library", + object, + staticProperties: [], + prototype: [], + }; + } + }); + + function getClass(c) { + if (!classes[c]) classes[c] = { staticProperties: [], prototype: [] }; + return classes[c]; + } + + // Handle contents + objects.forEach(function (object) { + if (["include"].includes(object.type)) { + } else if (["class", "object", "library"].includes(object.type)) { + } else if (["init", "idle", "kill"].includes(object.type)) { + } else if (["event"].includes(object.type)) { + // TODO: handle events + } else if (object.type === "constructor") { + getClass(object.class).constructor = object; + } else if (["staticproperty", "staticmethod"].includes(object.type)) { + getClass(object.class).staticProperties.push(object); + } else if (["property", "method"].includes(object.type)) { + getClass(object.class)["prototype"].push(object); + } else if ( + ["function", "letiable", "object", "variable"].includes(object.type) + ) { + globals.push(object); + } else console.warn("Unknown type " + object.type + " for ", object); + }); + + const file = + Object.entries(classes) + .filter(([name, c]) => !c.library && !(name in global)) + .map(([name, c]) => { + if (name == "File") name = "EspFile"; + return ( + `${getDocumentation(c.object)}\ndeclare class ${name} {\n` + + indent( + c.staticProperties + .map((property) => + `${getDocumentation(property)}\nstatic ${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + + c.prototype + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + "\n}" + ); + }) + .join("\n\n") + + "\n\n// GLOBALS\n\n" + + globals + .filter((g) => !(g.name in global)) + .map((global) => { + if (global.name === "require") { + return `${getDocumentation(global)} +declare function require(moduleName: T): Modules[T] +declare function require< + T extends Exclude +>(moduleName: T): any`; + } else { + return `${getDocumentation(global)}\ndeclare ${getDeclaration( + global + )}`; + } + }) + .join("\n\n") + + "\n\n// LIBRARIES\n\ntype Libraries = {\n" + + indent( + Object.entries(classes) + .filter(([_, c]) => c.library) + .map( + ([name, library]) => + `${getDocumentation(library.object)}\n${name}: {\n` + + indent( + library.staticProperties + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + "\n}" + ) + .join("\n\n") + ) + + "\n}"; + fs.writeFileSync("../BangleApps/typescript/types/main.d.ts", file); +}); diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index af250473c0..cc41f06d5a 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -453,7 +453,7 @@ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *a "class" : "ArrayBufferView", "name" : "buffer", "generate_full" : "jsvLock(jsvGetFirstChild(parent))", - "return" : ["JsVar","An ArrayBuffer object"] + "return" : ["JsVar","An ArrayBuffer object", "ArrayBufferLike"] } The buffer this view references */ From 573f062e98c4cb3319a9e34cb06c9abd7e1e6d03 Mon Sep 17 00:00:00 2001 From: qucchia Date: Thu, 21 Jul 2022 12:49:26 +0200 Subject: [PATCH 0190/1183] Types: declare events --- scripts/build_types.js | 62 ++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 2ed6162d1a..26384efe5b 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -39,38 +39,54 @@ function getBasicType(type) { return type; } +function getArguments(object) { + let args = []; + if ("params" in object) + args = object.params.map((param) => { + // hack because digitalRead/Write can also take arrays/objects (but most use cases are Pins) + if (param[0] == "pin" && param[1] == "JsLet") param[1] = "Pin"; + if (param[0] === "function") param[0] = "func"; + if (param[0] === "var") param[0] = "variable"; + let doc = typeof param[2] === "string" ? param[2] : param[2].join("\n"); + let optional = doc && doc.startsWith("[optional]"); + let rest = param[1] === "JsVarArray"; + return ( + (rest ? "..." : "") + + param[0] + + (optional ? "?" : "") + + ": " + + getBasicType(param[1]) + + (rest ? "[]" : "") + ); + }); + return args.join(", "); +} + function getDeclaration(object, c) { - if ( + if (object.type === "event") { + if (c) { + return `on(event: "${object.name}", callback: (${getArguments( + object + )}) => void): void;`; + } else { + return `function on(event: "${object.name}", callback: (${getArguments( + object + )}) => void): void;`; + } + } else if ( ["function", "method", "staticmethod", "constructor"].includes(object.type) ) { // function - let args = []; - if ("params" in object) - args = object.params.map((param) => { - // hack because digitalRead/Write can also take arrays/objects (but most use cases are Pins) - if (param[0] == "pin" && param[1] == "JsLet") param[1] = "Pin"; - if (param[0] === "function") param[0] = "func"; - if (param[0] === "var") param[0] = "variable"; - let doc = typeof param[2] === "string" ? param[2] : param[2].join("\n"); - let optional = doc && doc.startsWith("[optional]"); - let rest = param[1] === "JsVarArray"; - return ( - (rest ? "..." : "") + - param[0] + - (optional ? "?" : "") + - ": " + - getBasicType(param[1]) + - (rest ? "[]" : "") - ); - }); let returnValue = "any"; if ("return_object" in object) returnValue = getBasicType(object.return_object); else if ("return" in object) returnValue = getBasicType(object.return[0]); if (c) { - return `${object.name}(${args.join(", ")}): ${returnValue};`; + return `${object.name}(${getArguments(object)}): ${returnValue};`; } else { - return `function ${object.name}(${args.join(", ")}): ${returnValue};`; + return `function ${object.name}(${getArguments( + object + )}): ${returnValue};`; } } else { // property @@ -115,7 +131,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { } else if (["class", "object", "library"].includes(object.type)) { } else if (["init", "idle", "kill"].includes(object.type)) { } else if (["event"].includes(object.type)) { - // TODO: handle events + getClass(object.class).staticProperties.push(object); } else if (object.type === "constructor") { getClass(object.class).constructor = object; } else if (["staticproperty", "staticmethod"].includes(object.type)) { From 1cb82b22803473e104a2780babfb7772bfa9b862 Mon Sep 17 00:00:00 2001 From: qucchia Date: Thu, 21 Jul 2022 12:49:45 +0200 Subject: [PATCH 0191/1183] Explicitly explain some optional parameters --- libs/banglejs/jswrap_bangle.c | 4 ++-- libs/graphics/jswrap_graphics.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 002bc4ba40..05277ca4c5 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -4458,8 +4458,8 @@ JsVar *jswrap_banglejs_beep(int time, int freq) { "name" : "buzz", "generate" : "jswrap_banglejs_buzz", "params" : [ - ["time","int","Time in ms (default 200)"], - ["strength","float","Power of vibration from 0 to 1 (Default 1)"] + ["time","int","[optional] Time in ms (default 200)"], + ["strength","float","[optional] Power of vibration from 0 to 1 (Default 1)"] ], "return" : ["JsVar","A promise, completed when vibration is finished"], "return_object":"Promise", diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 0f7dd3412e..8314f84f6b 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -424,7 +424,7 @@ Use Graphics.createXXX to create a graphics object that renders in the way you w /*JSON{ "type" : "method", "class" : "Graphics", - "params" : [ ["all","bool","(only on some devices) If `true` then copy all pixels, not just those that have changed."] ], + "params" : [ ["all","bool","[optional] (only on some devices) If `true` then copy all pixels, not just those that have changed."] ], "name" : "flip" } On instances of graphics that drive a display with @@ -1405,8 +1405,8 @@ unsigned int jswrap_graphics_blendColor(JsVar *parent, JsVar *ca, JsVar *cb, JsV "generate_full" : "jswrap_graphics_setColorX(parent, r,g,b, true)", "params" : [ ["r","JsVar","Red (between 0 and 1) **OR** an integer representing the color in the current bit depth and color order **OR** a hexidecimal color string of the form `'#012345'`"], - ["g","JsVar","Green (between 0 and 1)"], - ["b","JsVar","Blue (between 0 and 1)"] + ["g","JsVar","[optional] Green (between 0 and 1)"], + ["b","JsVar","[optional] Blue (between 0 and 1)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" From aa97ab6c3d1c716822d757bb78f00181863eab6a Mon Sep 17 00:00:00 2001 From: qucchia Date: Thu, 21 Jul 2022 13:58:25 +0200 Subject: [PATCH 0192/1183] Use return_object for ArrayBufferView.buffer --- scripts/build_types.js | 4 +--- src/jswrap_arraybuffer.c | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 26384efe5b..f89a9aeb08 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -93,9 +93,7 @@ function getDeclaration(object, c) { const type = object.type === "object" ? object.instanceof - : object.return[2] - ? getBasicType(object.return[2]) - : getBasicType(object.return[0]); + : getBasicType(object.return_object || object.return[0]); if (c) { return `${object.name}: ${type};`; } else { diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index cc41f06d5a..1d42937a65 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -453,7 +453,8 @@ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *a "class" : "ArrayBufferView", "name" : "buffer", "generate_full" : "jsvLock(jsvGetFirstChild(parent))", - "return" : ["JsVar","An ArrayBuffer object", "ArrayBufferLike"] + "return" : ["JsVar","An ArrayBuffer object"], + "return_object" : "ArrayBufferLike" } The buffer this view references */ From cc7a78a5a319838eaa7736072ebb1e592f5ecbcb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Jul 2022 13:50:10 +0100 Subject: [PATCH 0193/1183] error reporting --- targets/nrf5x/app_config.h | 2 ++ targets/nrf5x/bluetooth.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/targets/nrf5x/app_config.h b/targets/nrf5x/app_config.h index c898c8e0f3..2f581aa509 100644 --- a/targets/nrf5x/app_config.h +++ b/targets/nrf5x/app_config.h @@ -151,6 +151,8 @@ #define UART0_CONFIG_USE_EASY_DMA 1 #define UART1_ENABLED 1 #define UART1_CONFIG_USE_EASY_DMA 1 +// To allow advertising transmit via coded phy (connectable:true,scannable:false) +// #define NRF_SDH_BLE_GAP_EVENT_LENGTH 10 #endif // NRF52840 #if ESPR_LSE_ENABLE diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 9b5a09317e..623fe5ea9b 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -2697,9 +2697,11 @@ uint32_t jsble_advertising_start() { } err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &d, &adv_params); + jsble_check_error(err_code); if (!err_code) { jsble_check_error(sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, m_tx_power)); err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); + jsble_check_error(err_code); } #elif NRF_SD_BLE_API_VERSION<5 err_code = sd_ble_gap_adv_data_set( From b226074cc9b47bb9de674843735bc86d8710e02d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Jul 2022 13:55:21 +0100 Subject: [PATCH 0194/1183] slight tweak - can now advertise connectable --- targets/nrf5x/bluetooth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 623fe5ea9b..7373b4763c 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -2645,7 +2645,7 @@ uint32_t jsble_advertising_start() { adv_params.primary_phy = BLE_GAP_PHY_1MBPS; adv_params.secondary_phy = BLE_GAP_PHY_2MBPS; } else if (jsvIsStringEqual(advPhy,"coded")) { - adv_params.primary_phy = non_connectable ? BLE_GAP_PHY_CODED : BLE_GAP_PHY_1MBPS; // must use 1mbps phy if connectable? + adv_params.primary_phy = BLE_GAP_PHY_CODED; // must use 1mbps phy if connectable? adv_params.secondary_phy = BLE_GAP_PHY_CODED; } else jsWarn("Unknown phy %q\n", advPhy); jsvUnLock(advPhy); From c8a591b23461a961595a1a3e23e884e166e306ba Mon Sep 17 00:00:00 2001 From: qucchia Date: Fri, 22 Jul 2022 08:16:32 +0200 Subject: [PATCH 0195/1183] Update typing --- scripts/build_types.js | 79 +++++++++++++++++++++++++++------------- src/jswrap_arraybuffer.c | 2 +- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index f89a9aeb08..9bd3f291cc 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -31,11 +31,10 @@ function getBasicType(type) { if (["int", "float", "int32"].includes(type)) return "number"; if (type == "pin") return "Pin"; if (type == "bool") return "boolean"; - if (type == "File") return "EspFile"; if (type == "JsVarArray") return "any"; if (type == "JsVar") return "any"; if (type == "Array") return "any[]"; - if (type == "Promise") return "Promise"; + // if (type == "Promise") return "Promise"; return type; } @@ -77,16 +76,15 @@ function getDeclaration(object, c) { ["function", "method", "staticmethod", "constructor"].includes(object.type) ) { // function + const name = object.type === "constructor" ? "new" : object.name; let returnValue = "any"; if ("return_object" in object) returnValue = getBasicType(object.return_object); else if ("return" in object) returnValue = getBasicType(object.return[0]); if (c) { - return `${object.name}(${getArguments(object)}): ${returnValue};`; + return `${name}(${getArguments(object)}): ${returnValue};`; } else { - return `function ${object.name}(${getArguments( - object - )}): ${returnValue};`; + return `function ${name}(${getArguments(object)}): ${returnValue};`; } } else { // property @@ -131,7 +129,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { } else if (["event"].includes(object.type)) { getClass(object.class).staticProperties.push(object); } else if (object.type === "constructor") { - getClass(object.class).constructor = object; + getClass(object.class).cons = object; } else if (["staticproperty", "staticmethod"].includes(object.type)) { getClass(object.class).staticProperties.push(object); } else if (["property", "method"].includes(object.type)) { @@ -144,21 +142,29 @@ require("./common.js").readAllWrapperFiles(function (objects) { }); const file = + "// NOTE: This file has been automatically generated.\n\n" + + '/// \n\n' + + "// CLASSES\n\n" + Object.entries(classes) - .filter(([name, c]) => !c.library && !(name in global)) - .map(([name, c]) => { - if (name == "File") name = "EspFile"; - return ( - `${getDocumentation(c.object)}\ndeclare class ${name} {\n` + - indent( - c.staticProperties - .map((property) => - `${getDocumentation(property)}\nstatic ${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") + + .filter(([name, c]) => !c.library) + .map(([name, c]) => + name in global + ? // builtin class (String, Boolean, etc) + `${getDocumentation(c.object)}\ninterface ${name}Constructor {\n` + + indent( + c.staticProperties + .concat([c.cons]) + .filter((property) => property) + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + `\n}\n\ninterface ${name}${name === "Array" ? "" : ""} {\n` + + indent( c.prototype .map((property) => `${getDocumentation(property)}\n${getDeclaration( @@ -167,14 +173,35 @@ require("./common.js").readAllWrapperFiles(function (objects) { )}`.trim() ) .join("\n\n") - ) + - "\n}" - ); - }) + ) + + `\n}\n\ndeclare const ${name}: ${name}Constructor` + : // other class + `${getDocumentation(c.object)}\ndeclare class ${name} {\n` + + indent( + c.staticProperties + .concat([c.cons]) + .filter((property) => property) + .map((property) => + `${getDocumentation(property)}\nstatic ${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + + c.prototype + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + "\n}" + ) .join("\n\n") + "\n\n// GLOBALS\n\n" + globals - .filter((g) => !(g.name in global)) .map((global) => { if (global.name === "require") { return `${getDocumentation(global)} diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index 1d42937a65..d784064c45 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -454,7 +454,7 @@ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *a "name" : "buffer", "generate_full" : "jsvLock(jsvGetFirstChild(parent))", "return" : ["JsVar","An ArrayBuffer object"], - "return_object" : "ArrayBufferLike" + "return_object" : "ArrayBuffer" } The buffer this view references */ From 9347f72e297ca87bf6f3c4a3f4ce7a9335ac6942 Mon Sep 17 00:00:00 2001 From: qucchia Date: Fri, 22 Jul 2022 08:16:55 +0200 Subject: [PATCH 0196/1183] Rename duplicate parameters --- src/jswrap_date.c | 2 +- src/jswrap_regexp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 0c00421791..35152c8464 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -632,7 +632,7 @@ JsVarFloat jswrap_date_setMonth(JsVar *parent, int monthValue, JsVar *dayValue) "generate" : "jswrap_date_setFullYear", "params" : [ ["yearValue","int","The full year - eg. 1989"], - ["yearValue","JsVar","optional - the month, between 0 and 11"], + ["monthValue","JsVar","optional - the month, between 0 and 11"], ["dayValue","JsVar","optional - the day, between 0 and 31"] ], "return" : ["float","The number of milliseconds since 1970"] diff --git a/src/jswrap_regexp.c b/src/jswrap_regexp.c index 0fa4347cb5..672a804d46 100644 --- a/src/jswrap_regexp.c +++ b/src/jswrap_regexp.c @@ -286,7 +286,7 @@ present in a full ES6 JS engine. However it does contain support for the all the "generate" : "jswrap_regexp_constructor", "params" : [ ["regex","JsVar","A regular expression as a string"], - ["regex","JsVar","Flags for the regular expression as a string"] + ["flags","JsVar","Flags for the regular expression as a string"] ], "return" : ["JsVar","A RegExp object"], "return_object" : "RegExp" From b3fa1234b1165b73921e4695e139e6522349ee36 Mon Sep 17 00:00:00 2001 From: qucchia Date: Fri, 22 Jul 2022 08:33:21 +0200 Subject: [PATCH 0197/1183] Fix library URLs --- scripts/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/common.js b/scripts/common.js index 9455d2a02d..bceb6e8f44 100644 --- a/scripts/common.js +++ b/scripts/common.js @@ -25,7 +25,7 @@ Builtin.prototype.getDescription = function() { }; Builtin.prototype.getURL = function() { - if (this.type == "class") + if (this.type == "class" || this.type == "library") anchor = this.class; else if ("class" in this) anchor = "l_"+this.class+"_"+this.name; From cc3d35a3dcc0e351e4c7756b9031f07acedfb839 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Jul 2022 08:21:08 +0100 Subject: [PATCH 0198/1183] Fix for `WARNING: Unknown phy "undefined"` regression when scanning on BLE --- targets/nrf5x/bluetooth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index 7373b4763c..a54f7c6155 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -2872,7 +2872,7 @@ uint32_t jsble_set_scanning(bool enabled, JsVar *options) { if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "extended", 0))) m_scan_param.extended = 1; JsVar *advPhy = jsvObjectGetChild(options, "phy", 0); - if (jsvIsStringEqual(advPhy,"1mbps")) { + if (jsvIsUndefined(advPhy) || jsvIsStringEqual(advPhy,"1mbps")) { // default } else if (jsvIsStringEqual(advPhy,"2mbps")) { m_scan_param.scan_phys = BLE_GAP_PHY_2MBPS; From c122be92b3fdff9a110258ea8da20a2759fcf513 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Jul 2022 08:21:16 +0100 Subject: [PATCH 0199/1183] better docs --- libs/bluetooth/jswrap_bluetooth.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index bf0e62567b..7074245f56 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -1746,7 +1746,7 @@ BluetoothDevice { "data": new Uint8Array([ ... ]).buffer, // ArrayBuffer of returned data "serviceData" : { "0123" : [ 1 ] }, // if service data is in 'data', it's extracted here "manufacturer" : 0x1234, // if manufacturer data is in 'data', the 16 bit manufacturer ID is extracted here - "manufacturerData" : [...], // if manufacturer data is in 'data', the data is extracted here + "manufacturerData" : new Uint8Array([...]).buffer, // if manufacturer data is in 'data', the data is extracted here as an ArrayBuffer "name": "DeviceName" // the advertised device name } ``` @@ -1995,8 +1995,9 @@ prints something like: "rssi": -45, "services": [ "4567" ], "serviceData" : { "0123" : [ 1 ] }, - "manufacturerData" : [...], - "data": new ArrayBuffer([ ... ]), + "manufacturer" : 1424, + "manufacturerData" : new Uint8Array([ ... ]).buffer, + "data": new ArrayBuffer([ ... ]).buffer, "name": "Puck.js 36a2" }, BluetoothDevice { From 8119be4a9a0e828405ce9c633a67dbdd37f517b4 Mon Sep 17 00:00:00 2001 From: qucchia Date: Fri, 22 Jul 2022 11:24:31 +0200 Subject: [PATCH 0200/1183] TypeScript: Document using JSDoc format --- scripts/build_types.js | 67 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 9bd3f291cc..e15dbb4aab 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -9,8 +9,16 @@ function indent(string) { .join("\n"); } -// TODO: Document parameters +function getParameterDescription(description) { + return !description + ? "" + : typeof description === "string" + ? description + : description.join("\n"); +} + function getDocumentation(object) { + // See https://jsdoc.app/ for how JSDoc comments are formatted if (!object) return ""; return ( "/**\n" + @@ -19,8 +27,57 @@ function getDocumentation(object) { .split("\n") .filter((line) => line) .map((line) => line) + .concat(object.type === "constructor" ? ["@constructor"] : []) + .concat( + object.type === "event" + ? [ + "@param {string} event - The event to listen to.", + `@param {(${getArguments( + object + )}) => void} callback - A function that is executed when the event occurs.${ + object.params ? " Its arguments are:" : "" + }`, + ].concat( + object.params + ? object.params.map(([name, _, description]) => + `* \`${name}\` ${getParameterDescription( + description + )}`.split("\n") + ) + : [] + ) + : object.params + ? [""].concat( + object.params + .map(([name, type, description]) => { + const desc = getParameterDescription(description); + return ( + "@param {" + + getBasicType(type) + + "} " + + (desc.startsWith("[optional]") ? "[" + name + "]" : name) + + (!description + ? "" + : typeof description === "string" + ? " - " + desc + : "\n" + desc) + ).split("\n"); + }) + .flat(1) + ) + : [] + ) + .concat( + object.return + ? [ + `@returns {${getBasicType(object.return[0])}} ${ + object.return[1] || "" + }`, + ] + : [] + ) .concat([`@url ${object.getURL()}`]) - .map((line) => " * " + line) + .map((line) => (" * " + line).trimEnd()) .join("\n") + "\n */" ); @@ -150,7 +207,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { .map(([name, c]) => name in global ? // builtin class (String, Boolean, etc) - `${getDocumentation(c.object)}\ninterface ${name}Constructor {\n` + + `interface ${name}Constructor {\n` + indent( c.staticProperties .concat([c.cons]) @@ -174,7 +231,9 @@ require("./common.js").readAllWrapperFiles(function (objects) { ) .join("\n\n") ) + - `\n}\n\ndeclare const ${name}: ${name}Constructor` + `\n}\n\n${getDocumentation( + c.object + )}\ndeclare const ${name}: ${name}Constructor` : // other class `${getDocumentation(c.object)}\ndeclare class ${name} {\n` + indent( From ff3fc6dcdffa736edfeeba91b5720edc7c09679d Mon Sep 17 00:00:00 2001 From: qucchia Date: Fri, 22 Jul 2022 11:48:00 +0200 Subject: [PATCH 0201/1183] Fix minor typos --- README.md | 12 ++++++------ SECURITY.md | 6 +++--- libs/filesystem/jswrap_file.c | 2 +- libs/math/jswrap_math.c | 2 +- libs/microbit/jswrap_microbit.c | 2 +- libs/network/cc3000/jswrap_cc3000.c | 2 +- targets/esp8266/jswrap_esp8266.c | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 91314dc3bb..481e9f05e4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Espruino JavaScript for Microcontrollers | __|___ ___ ___ _ _|_|___ ___ | __|_ -| . | _| | | | | . | |_____|___| _|_| |___|_|_|_|___| - |_| + |_| https://www.espruino.com           [![Join the chat at https://gitter.im/espruino/Espruino](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/espruino/Espruino?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -16,7 +16,7 @@ About Espruino is a JavaScript interpreter for microcontrollers. It is designed for devices with as little as 128kB Flash and 8kB RAM. -Please support Espruino by [ordering one of our official boards](https://www.espruino.com/Order) or [donating](https://www.espruino.com/Donate) +Please support Espruino by [ordering one of our official boards](https://www.espruino.com/Order) or [donating](https://www.espruino.com/Donate). Documentation @@ -28,7 +28,7 @@ Browse the [Espruino Website](https://www.espruino.com) (try using search in the There's also a [Reference](https://www.espruino.com/Reference) for JavaScript commands as well as [Tutorials](https://www.espruino.com/Tutorials). However the documentation on the Espruino website will match the version [available for download](https://www.espruino.com/Download) but **not** the latest version on GitHub. -Builds for the [Espruino Board](https://www.espruino.com/EspruinoBoard) and [Pico Board](https://www.espruino.com/Pico) (built automatically for each Git commit) are [available from here](https://www.espruino.com/binaries/git) +Builds for the [Espruino Board](https://www.espruino.com/EspruinoBoard) and [Pico Board](https://www.espruino.com/Pico) (built automatically for each Git commit) are [available from here](https://www.espruino.com/binaries/git). Other documentation of use is: @@ -60,13 +60,13 @@ We try and support users of the boards we sell, but if you bought a non-official License ------- -Please see the [LICENSE](LICENSE) file +Please see the [LICENSE](LICENSE) file. Building -------- -Check out [the page on building Espruino](README_Building.md) +Check out [the page on building Espruino](README_Building.md). Testing @@ -82,7 +82,7 @@ The [officially supported boards](https://www.espruino.com/Order) are the best s While Espruino can run on other boards, we make no money from them and so cannot afford to test, fix or support the firmware on them. We're dependent on the community. -You can download binaries from https://www.espruino.com/Download +You can download binaries from https://www.espruino.com/Download. If you are a board manufacturer interested in getting your board officially supported, please [check out this page](https://www.espruino.com/Business). diff --git a/SECURITY.md b/SECURITY.md index 73489cd4af..25649b5f5f 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,11 +2,11 @@ ## Supported Versions -We are currently providing software updates for all [official Espruino devices](https://www.espruino.com/Order) +We are currently providing software updates for all [official Espruino devices](https://www.espruino.com/Order). ## Reporting a Vulnerability -To report a vulnerability please just create a [GitHub issue](https://github.com/espruino/Espruino/issues) +To report a vulnerability please just create a [GitHub issue](https://github.com/espruino/Espruino/issues). If you feel the vulnerability is extremely serious and could be exploited if details were published, -please contact us by email at gw@espruino.com +please contact us by email at gw@espruino.com. diff --git a/libs/filesystem/jswrap_file.c b/libs/filesystem/jswrap_file.c index d89a5ab0b2..d4e0841ea7 100755 --- a/libs/filesystem/jswrap_file.c +++ b/libs/filesystem/jswrap_file.c @@ -598,7 +598,7 @@ Pipe this file to a stream (an object with a 'write' method) ], "return" : ["bool","True on success, or false on failure"] } -Change the paramters used for the flash filesystem. +Change the parameters used for the flash filesystem. The default address is the last 1Mb of 4Mb Flash, 0x300000, with total size of 1Mb. Before first use the media needs to be formatted. diff --git a/libs/math/jswrap_math.c b/libs/math/jswrap_math.c index 802f8e96a1..2b597abb78 100644 --- a/libs/math/jswrap_math.c +++ b/libs/math/jswrap_math.c @@ -180,7 +180,7 @@ JsVarFloat jswrap_math_asin(JsVarFloat x) { "name" : "atan", "generate" : "jswrap_math_atan", "params" : [ - ["x","float","The value to get the arc tangent of"] + ["x","float","The value to get the arc tangent of"] ], "return" : ["float","The arc tangent of x, between -PI/2 and PI/2"] }*/ diff --git a/libs/microbit/jswrap_microbit.c b/libs/microbit/jswrap_microbit.c index f5bdd102c4..8dc5710dc6 100644 --- a/libs/microbit/jswrap_microbit.c +++ b/libs/microbit/jswrap_microbit.c @@ -647,7 +647,7 @@ void jswrap_microbit_accelOn() { "generate" : "jswrap_microbit_accelOff", "ifdef" : "MICROBIT2" } -Turn off events from the accelerometer (started with `Microbit.accelOn`) +Turn off events from the accelerometer (started with `Microbit.accelOn`) */ void jswrap_microbit_accelOff() { if (!accel_watch) return; diff --git a/libs/network/cc3000/jswrap_cc3000.c b/libs/network/cc3000/jswrap_cc3000.c index 702f1bfc62..fdcf85648c 100644 --- a/libs/network/cc3000/jswrap_cc3000.c +++ b/libs/network/cc3000/jswrap_cc3000.c @@ -258,7 +258,7 @@ static void _wlan_getIP_set_address(JsVar *options, char *name, unsigned char *p "name" : "setIP", "generate" : "jswrap_wlan_setIP", "params" : [ - ["options","JsVar","Object containing IP address options `{ ip : '1,2,3,4', subnet, gateway, dns }`, or do not supply an object in otder to force DHCP."] + ["options","JsVar","Object containing IP address options `{ ip : '1,2,3,4', subnet, gateway, dns }`, or do not supply an object in otder to force DHCP."] ], "return" : ["bool","True on success"] } diff --git a/targets/esp8266/jswrap_esp8266.c b/targets/esp8266/jswrap_esp8266.c index 02ce89ea97..d0c3b5d54d 100644 --- a/targets/esp8266/jswrap_esp8266.c +++ b/targets/esp8266/jswrap_esp8266.c @@ -72,7 +72,7 @@ void jswrap_ESP8266_reboot() { "generate" : "jswrap_ESP8266_getResetInfo", "return" : ["JsVar","An object with the reset cause information"] } -At boot time the esp8266's firmware captures the cause of the reset/reboot. This function returns this information in an object with the following fields: +At boot time the esp8266's firmware captures the cause of the reset/reboot. This function returns this information in an object with the following fields: * `reason`: "power on", "wdt reset", "exception", "soft wdt", "restart", "deep sleep", or "reset pin" * `exccause`: exception cause @@ -108,7 +108,7 @@ JsVar *jswrap_ESP8266_getResetInfo() { ["enable", "bool", "Enable or disable the debug logging."] ] } -Enable or disable the logging of debug information. A value of `true` enables debug logging while a value of `false` disables debug logging. Debug output is sent to UART1 (gpio2). +Enable or disable the logging of debug information. A value of `true` enables debug logging while a value of `false` disables debug logging. Debug output is sent to UART1 (gpio2). */ void jswrap_ESP8266_logDebug(bool enable) { os_printf("ESP8266.logDebug, enable=%d\n", enable); From 7ad85067074faa4fa9485eeeb48b633cf8c293b8 Mon Sep 17 00:00:00 2001 From: qucchia Date: Sat, 23 Jul 2022 20:15:18 +0200 Subject: [PATCH 0202/1183] Add custom TypeScript declarations in comments --- scripts/build_types.js | 70 +++++++++++++++++++++++------------------- scripts/common.js | 15 +++++++-- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index e15dbb4aab..36b00bff02 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -91,7 +91,7 @@ function getBasicType(type) { if (type == "JsVarArray") return "any"; if (type == "JsVar") return "any"; if (type == "Array") return "any[]"; - // if (type == "Promise") return "Promise"; + if (type == "Promise") return "Promise"; return type; } @@ -115,33 +115,42 @@ function getArguments(object) { (rest ? "[]" : "") ); }); - return args.join(", "); + return "(" + args.join(", ") + ")"; +} + +function getReturnType(object) { + if ("typescript" in object) return object.typescript[1]; + if ("return_object" in object) return getBasicType(object.return_object); + if ("return" in object) return getBasicType(object.return[0]); + return "any"; } function getDeclaration(object, c) { + if ("typescript" in object) + return typeof object.typescript === "string" + ? object.typescript + : object.typescript.join("\n"); if (object.type === "event") { if (c) { - return `on(event: "${object.name}", callback: (${getArguments( + return `on(event: "${object.name}", callback: ${getArguments( object - )}) => void): void;`; + )} => void): void;`; } else { - return `function on(event: "${object.name}", callback: (${getArguments( + return `function on(event: "${object.name}", callback: ${getArguments( object - )}) => void): void;`; + )} => void): void;`; } } else if ( ["function", "method", "staticmethod", "constructor"].includes(object.type) ) { // function const name = object.type === "constructor" ? "new" : object.name; - let returnValue = "any"; - if ("return_object" in object) - returnValue = getBasicType(object.return_object); - else if ("return" in object) returnValue = getBasicType(object.return[0]); if (c) { - return `${name}(${getArguments(object)}): ${returnValue};`; + return `${name}${getArguments(object)}: ${getReturnType(object)};`; } else { - return `function ${name}(${getArguments(object)}): ${returnValue};`; + return `declare function ${name}${getArguments(object)}: ${getReturnType( + object + )};`; } } else { // property @@ -152,12 +161,12 @@ function getDeclaration(object, c) { if (c) { return `${object.name}: ${type};`; } else { - return `const ${object.name}: ${type};`; + return `declare const ${object.name}: ${type};`; } } } -require("./common.js").readAllWrapperFiles(function (objects) { +require("./common.js").readAllWrapperFiles(function (objects, types) { const classes = {}; const globals = []; @@ -192,7 +201,9 @@ require("./common.js").readAllWrapperFiles(function (objects) { } else if (["property", "method"].includes(object.type)) { getClass(object.class)["prototype"].push(object); } else if ( - ["function", "letiable", "object", "variable"].includes(object.type) + ["function", "letiable", "object", "variable", "typescript"].includes( + object.type + ) ) { globals.push(object); } else console.warn("Unknown type " + object.type + " for ", object); @@ -201,9 +212,13 @@ require("./common.js").readAllWrapperFiles(function (objects) { const file = "// NOTE: This file has been automatically generated.\n\n" + '/// \n\n' + - "// CLASSES\n\n" + + "// TYPES\n" + + types + .map((type) => type.replace(/\\\//g, "/").replace(/\\\\/g, "\\")) + .join("") + + "\n\n// CLASSES\n\n" + Object.entries(classes) - .filter(([name, c]) => !c.library) + .filter(([_, c]) => !c.library) .map(([name, c]) => name in global ? // builtin class (String, Boolean, etc) @@ -220,7 +235,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { ) .join("\n\n") ) + - `\n}\n\ninterface ${name}${name === "Array" ? "" : ""} {\n` + + `\n}\n\n${c.object?.typescript || "interface " + name} {\n` + indent( c.prototype .map((property) => @@ -235,7 +250,9 @@ require("./common.js").readAllWrapperFiles(function (objects) { c.object )}\ndeclare const ${name}: ${name}Constructor` : // other class - `${getDocumentation(c.object)}\ndeclare class ${name} {\n` + + `${getDocumentation(c.object)}\ndeclare class ${ + c.object?.typescript || name + } {\n` + indent( c.staticProperties .concat([c.cons]) @@ -247,6 +264,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { )}`.trim() ) .join("\n\n") + + "\n\n" + c.prototype .map((property) => `${getDocumentation(property)}\n${getDeclaration( @@ -261,19 +279,7 @@ require("./common.js").readAllWrapperFiles(function (objects) { .join("\n\n") + "\n\n// GLOBALS\n\n" + globals - .map((global) => { - if (global.name === "require") { - return `${getDocumentation(global)} -declare function require(moduleName: T): Modules[T] -declare function require< - T extends Exclude ->(moduleName: T): any`; - } else { - return `${getDocumentation(global)}\ndeclare ${getDeclaration( - global - )}`; - } - }) + .map((global) => `${getDocumentation(global)}\n${getDeclaration(global)}`) .join("\n\n") + "\n\n// LIBRARIES\n\ntype Libraries = {\n" + indent( diff --git a/scripts/common.js b/scripts/common.js index bceb6e8f44..c21ccebdc5 100644 --- a/scripts/common.js +++ b/scripts/common.js @@ -79,6 +79,7 @@ exports.getWrapperFiles = function (callback) { exports.readWrapperFile = function(filename) { var contents = fs.readFileSync(filename).toString(); var builtins = []; + var types = []; var comments = contents.match( /\/\*JSON(?:(?!\*\/).|[\n\r])*\*\//g ); if (comments) comments.forEach(function(comment) { comment = comment.slice(6,-2); // pull off /*JSON ... */ bit @@ -90,17 +91,25 @@ exports.readWrapperFile = function(filename) { j.implementation = filename; builtins.push(j); }); - return builtins; + var comments = contents.match( /\/\*TYPESCRIPT(?:(?!\*\/).|[\n\r])*\*\//g ); + if (comments) comments.forEach(function(comment) { + comment = comment.slice(12,-2); + types.push(comment); + }); + return [builtins, types]; } /// Extract all parsed /*JSON ... */ comments from all files exports.readAllWrapperFiles = function(callback) { exports.getWrapperFiles(function(files) { var builtins = []; + var types = []; files.forEach(function(filename) { - builtins = builtins.concat(exports.readWrapperFile(filename)); + var [b, t] = exports.readWrapperFile(filename); + builtins = builtins.concat(b); + types = types.concat(t); }); - callback(builtins); + callback(builtins, types); }); } From 6b45a91fd193c43f4d0696d36cb0e1ecacb37758 Mon Sep 17 00:00:00 2001 From: qucchia Date: Sat, 23 Jul 2022 20:16:15 +0200 Subject: [PATCH 0203/1183] Declare some custom TypeScript types --- libs/banglejs/jswrap_bangle.c | 1 + libs/bluetooth/jswrap_bluetooth.c | 21 ++++++++-- libs/pixljs/jswrap_pixljs.c | 67 ++++++++++++++++++++++++++++++- src/jswrap_array.c | 10 +++-- src/jswrap_modules.c | 6 ++- src/jswrap_promise.c | 15 ++++--- 6 files changed, 105 insertions(+), 15 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 05277ca4c5..b08cb4b463 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -4828,6 +4828,7 @@ to select an application to launch. ["menu","JsVar","An object containing name->function mappings to to be used in a menu"] ], "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], + "typescript": "showMenu(menu: Menu): MenuInstance;", "ifdef" : "BANGLEJS" } Display a menu on the screen, and set up the buttons to navigate through it. diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 7074245f56..aaa5484837 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -343,7 +343,7 @@ void jswrap_ble_dumpBluetoothInitialisation(vcbprintf_callback user_callback, vo // ------------------------------------------------------------------------------ /*JSON{ - "type": "class", + "type" : "class", "class" : "NRF" } The NRF class is for controlling functionality of the Nordic nRF51/nRF52 chips. @@ -1974,8 +1974,9 @@ JsVar *jswrap_ble_filterDevices(JsVar *devices, JsVar *filters) { "generate" : "jswrap_ble_findDevices", "params" : [ ["callback","JsVar","The callback to call with received advertising packets (as `BluetoothDevice`), or undefined to stop"], - ["options","JsVar","A time in milliseconds to scan for (defaults to 2000), Or an optional object `{filters: ..., timeout : ..., active: bool}` (as would be passed to `NRF.requestDevice`) to filter devices by"] - ] + ["options","JsVar","[optional] A time in milliseconds to scan for (defaults to 2000), Or an optional object `{filters: ..., timeout : ..., active: bool}` (as would be passed to `NRF.requestDevice`) to filter devices by"] + ], + "typescript" : "findDevices(callback: (devices: BluetoothDevice[]) => void, options?: number | { filters?: NRFFilters, timeout?: number, active?: boolean }): void;" } Utility function to return a list of BLE devices detected in range. Behind the scenes, this uses `NRF.setScan(...)` and collates the results. @@ -1991,7 +1992,7 @@ prints something like: ``` [ BluetoothDevice { - "id": "e7:e0:57:ad:36:a2 random", + "id" : "e7:e0:57:ad:36:a2 random", "rssi": -45, "services": [ "4567" ], "serviceData" : { "0123" : [ 1 ] }, @@ -2961,6 +2962,17 @@ void jswrap_ble_amsCommand(JsVar *id) { #endif } +/*TYPESCRIPT +type NRFFilters = { + services?: string[]; + name?: string; + namePrefix?: string; + id?: string; + serviceData?: object; + manufacturerData?: object; +}; +*/ + /*JSON{ "type" : "staticmethod", "class" : "NRF", @@ -2970,6 +2982,7 @@ void jswrap_ble_amsCommand(JsVar *id) { "params" : [ ["options","JsVar","Options used to filter the device to use"] ], + "typescript" : "requestDevice(options?: { filters?: NRFFilters, timeout?: number, active?: boolean, phy?: string, extended?: boolean }): Promise;", "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } diff --git a/libs/pixljs/jswrap_pixljs.c b/libs/pixljs/jswrap_pixljs.c index 8e35fe4fd4..ef180543de 100644 --- a/libs/pixljs/jswrap_pixljs.c +++ b/libs/pixljs/jswrap_pixljs.c @@ -495,6 +495,70 @@ Display a menu on Pixl.js's screen, and set up the buttons to navigate through i DEPRECATED: Use `E.showMenu` */ +/*TYPESCRIPT +/** + * Menu item that holds a boolean value. + *\/ +type MenuBooleanItem = { + value: boolean; + format?: (value: boolean) => string; + onchange?: (value: boolean) => void; +}; + +/** + * Menu item that holds a numerical value. + *\/ +type MenuNumberItem = { + value: number; + format?: (value: number) => string; + onchange?: (value: number) => void; + step?: number; + min?: number; + max?: number; + wrap?: boolean; +}; + +/** + * Options passed to a menu. + *\/ +type MenuOptions = { + title?: string; + back?: () => void; + selected?: number; + fontHeight?: number; + x?: number; + y?: number; + x2?: number; + y2?: number; + cB?: number; + cF?: number; + cHB?: number; + cHF?: number; + predraw?: (g: Graphics) => void; + preflip?: (g: Graphics, less: boolean, more: boolean) => void; +}; + +/** + * Object containing data about a menu to pass to `E.showMenu`. + *\/ +type Menu = { + [key: string]: + | MenuOptions + | (() => void) + | MenuBooleanItem + | MenuNumberItem + | undefined; +}; + +/** + * Menu instance. + *\/ +type MenuInstance = { + draw: () => void; + move: (n: number) => void; + select: () => void; +}; +*/ /*JSON{ "type" : "staticmethod", @@ -504,7 +568,8 @@ DEPRECATED: Use `E.showMenu` "params" : [ ["menu","JsVar","An object containing name->function mappings to to be used in a menu"] ], - "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ] + "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], + "typescript": "showMenu(menu: Menu): MenuInstance;" } Display a menu on the screen, and set up the buttons to navigate through it. diff --git a/src/jswrap_array.c b/src/jswrap_array.c index a46f9f93c7..c299f737bf 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -24,7 +24,8 @@ /*JSON{ "type" : "class", "class" : "Array", - "check" : "jsvIsArray(var)" + "check" : "jsvIsArray(var)", + "typescript": "interface Array" } This is the built-in JavaScript class for arrays. @@ -41,7 +42,7 @@ Arrays can be defined with ```[]```, ```new Array()```, or ```new Array(length)` ], "return" : ["JsVar","An Array"] } -Create an Array. Either give it one integer argument (>=0) which is the length of the array, or any number of arguments +Create an Array. Either give it one integer argument (>=0) which is the length of the array, or any number of arguments */ JsVar *jswrap_array_constructor(JsVar *args) { assert(args); @@ -341,8 +342,9 @@ JsVar *jswrap_array_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { "generate" : "jswrap_array_forEach", "params" : [ ["function","JsVar","Function to be executed"], - ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] - ] + ["thisArg","JsVar","[optional] If specified, the function is called with 'this' set to thisArg (optional)"] + ], + "typescript": "forEach(callback: (item: T, index: number, array: T[]) => void, thisArg?: any): void;" } Executes a provided function once per array element. */ diff --git a/src/jswrap_modules.c b/src/jswrap_modules.c index d677b20074..c5c01cefc0 100644 --- a/src/jswrap_modules.c +++ b/src/jswrap_modules.c @@ -42,7 +42,11 @@ static JsVar *jswrap_modules_getModuleList() { "params" : [ ["moduleName","JsVar","A String containing the name of the given module"] ], - "return" : ["JsVar","The result of evaluating the string"] + "return" : ["JsVar","The result of evaluating the string"], + "typescript": [ + "declare function require(moduleName: T): Libraries[T];", + "declare function require>(moduleName: T): any;" + ] } Load the given module, and return the exported functions and variables. diff --git a/src/jswrap_promise.c b/src/jswrap_promise.c index d65f83f6b7..bd984ffe83 100644 --- a/src/jswrap_promise.c +++ b/src/jswrap_promise.c @@ -28,6 +28,7 @@ /*JSON{ "type" : "class", "class" : "Promise", + "typescript": "interface Promise", "ifndef" : "SAVE_ON_FLASH" } This is the built-in class for ES6 Promises @@ -203,7 +204,8 @@ void jspromise_reject(JsVar *promise, JsVar *data) { "params" : [ ["executor","JsVar","A function of the form `function (resolve, reject)`"] ], - "return" : ["JsVar","A Promise"] + "return" : ["JsVar","A Promise"], + "typescript": "new(executor: (resolve: (value: T) => void, reject: (reason?: any) => void) => void): Promise;" } Create a new Promise. The executor function is executed immediately (before the constructor even returns) and @@ -242,7 +244,8 @@ JsVar *jswrap_promise_constructor(JsVar *executor) { "params" : [ ["promises","JsVar","An array of promises"] ], - "return" : ["JsVar","A new Promise"] + "return" : ["JsVar","A new Promise"], + "typescript": "all(promises: Promise[]): Promise;" } Return a new promise that is resolved when all promises in the supplied array are resolved. @@ -299,7 +302,8 @@ JsVar *jswrap_promise_all(JsVar *arr) { "params" : [ ["promises","JsVar","Data to pass to the `.then` handler"] ], - "return" : ["JsVar","A new Promise"] + "return" : ["JsVar","A new Promise"], + "typescript": "resolve(promises: T): Promise;" } Return a new promise that is already resolved (at idle it'll call `.then`) @@ -406,9 +410,10 @@ static JsVar *jswrap_promise_get_chained_promise(JsVar *parent) { "generate" : "jswrap_promise_then", "params" : [ ["onFulfilled","JsVar","A callback that is called when this promise is resolved"], - ["onRejected","JsVar","A callback that is called when this promise is rejected (or nothing)"] + ["onRejected","JsVar","[optional] A callback that is called when this promise is rejected (or nothing)"] ], - "return" : ["JsVar","The original Promise"] + "return" : ["JsVar","The original Promise"], + "typescript": "then(onfulfilled?: ((value: T) => TResult1 | Promise) | undefined | null, onrejected?: ((reason: any) => TResult2 | Promise) | undefined | null): Promise;" } */ JsVar *jswrap_promise_then(JsVar *parent, JsVar *onFulfilled, JsVar *onRejected) { From ae9d4e2923baa5473fd78e917f0dc1286af755f7 Mon Sep 17 00:00:00 2001 From: qucchia Date: Sat, 23 Jul 2022 20:22:54 +0200 Subject: [PATCH 0204/1183] =?UTF-8?q?TypeScript:=20declare=20globals=20?= =?UTF-8?q?=E2=80=98g=E2=80=99=20and=20=E2=80=98WIDGETS=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/banglejs/jswrap_bangle.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index b08cb4b463..c6dddcf2c0 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -74,6 +74,18 @@ #include "unistroke.h" #endif +/*TYPESCRIPT +declare const g: Graphics; + +type WidgetArea = "tl" | "tr" | "bl" | "br"; +type Widget = { + area: WidgetArea; + width: number; + draw: (this: { x: number; y: number }) => void; +}; +declare const WIDGETS: { [key: string]: Widget }; +*/ + /*JSON{ "type": "class", "class" : "Bangle", From 11ddc79748d2596405a902a423cf31b9c798dff1 Mon Sep 17 00:00:00 2001 From: qucchia Date: Sat, 23 Jul 2022 20:32:02 +0200 Subject: [PATCH 0205/1183] =?UTF-8?q?Automatically=20declare=20=E2=80=98gl?= =?UTF-8?q?obals=E2=80=99=20correctly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_types.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 36b00bff02..8e3d326db3 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -279,7 +279,18 @@ require("./common.js").readAllWrapperFiles(function (objects, types) { .join("\n\n") + "\n\n// GLOBALS\n\n" + globals - .map((global) => `${getDocumentation(global)}\n${getDeclaration(global)}`) + .map((global) => + global.name === "global" + ? `declare const global: {\n` + + indent( + globals + .map((global) => `${global.name}: typeof ${global.name};`) + .concat("[key: string]: any;") + .join("\n") + ) + + "\n}" + : `${getDocumentation(global)}\n${getDeclaration(global)}` + ) .join("\n\n") + "\n\n// LIBRARIES\n\ntype Libraries = {\n" + indent( From bfaa2abf86952cf45c3501f7d920287aedb21607 Mon Sep 17 00:00:00 2001 From: qucchia Date: Sat, 23 Jul 2022 20:32:27 +0200 Subject: [PATCH 0206/1183] Fix incorrect callbacks in events --- scripts/build_types.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 8e3d326db3..fb8d45a1ec 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -32,9 +32,9 @@ function getDocumentation(object) { object.type === "event" ? [ "@param {string} event - The event to listen to.", - `@param {(${getArguments( + `@param {${getArguments( object - )}) => void} callback - A function that is executed when the event occurs.${ + )} => void} callback - A function that is executed when the event occurs.${ object.params ? " Its arguments are:" : "" }`, ].concat( From 3d18905e02c0152247c81e5dfe5d40d3dbb34bac Mon Sep 17 00:00:00 2001 From: qucchia Date: Sun, 24 Jul 2022 08:50:48 +0200 Subject: [PATCH 0207/1183] =?UTF-8?q?Document=20the=20=E2=80=98build=5Ftyp?= =?UTF-8?q?es=E2=80=99=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_types.js | 198 ++++++++++++++++++++++++++++++++++------- 1 file changed, 165 insertions(+), 33 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index fb8d45a1ec..56f0f00f2b 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -1,7 +1,10 @@ #!/usr/bin/node -const fs = require("fs"); - +/** + * Add two spaces at the beginning of every line. + * @param {string} string - The string to indent. + * @returns {string} The indented string. + */ function indent(string) { return string .split("\n") @@ -9,6 +12,11 @@ function indent(string) { .join("\n"); } +/** + * Return the parameter's description. + * @param {string | string[]} - The description from the JSON comment. + * @returns {string} The description. + */ function getParameterDescription(description) { return !description ? "" @@ -17,6 +25,11 @@ function getParameterDescription(description) { : description.join("\n"); } +/** + * Return the documentation of the function or variable. + * @param {object} object - The object holding the function or variable. + * @returns {string} The object's documentation. + */ function getDocumentation(object) { // See https://jsdoc.app/ for how JSDoc comments are formatted if (!object) return ""; @@ -83,6 +96,12 @@ function getDocumentation(object) { ); } +/** + * Convert a basic type to its corresponding TypeScript type. + * A "basic type" is any but an object or a function. + * @param {string} type - The basic type. + * @returns {string} The TypeScript type. + */ function getBasicType(type) { if (!type) return "any"; if (["int", "float", "int32"].includes(type)) return "number"; @@ -95,10 +114,15 @@ function getBasicType(type) { return type; } -function getArguments(object) { +/** + * Return the arguments of the method in TypeScript format. + * @param {object} method - The object containing the method's data. + * @returns {string} The argument list including brackets. + */ +function getArguments(method) { let args = []; - if ("params" in object) - args = object.params.map((param) => { + if ("params" in method) + args = method.params.map((param) => { // hack because digitalRead/Write can also take arrays/objects (but most use cases are Pins) if (param[0] == "pin" && param[1] == "JsLet") param[1] = "Pin"; if (param[0] === "function") param[0] = "func"; @@ -118,20 +142,30 @@ function getArguments(object) { return "(" + args.join(", ") + ")"; } -function getReturnType(object) { - if ("typescript" in object) return object.typescript[1]; - if ("return_object" in object) return getBasicType(object.return_object); - if ("return" in object) return getBasicType(object.return[0]); +/** + * Return the return type of the method in TypeScript format. + * @param {object} method - The object containing the method's data. + * @returns {string} The return type. + */ +function getReturnType(method) { + if ("return_object" in method) return getBasicType(method.return_object); + if ("return" in method) return getBasicType(method.return[0]); return "any"; } -function getDeclaration(object, c) { +/** + * Return the declaration of a function or variable. + * @param {object} object - The object containing the function or variable's data. + * @param {boolean} [property] - True if the object is a property of a class, etc. + * @returns {string} The function or variable's declaration. + */ +function getDeclaration(object, property) { if ("typescript" in object) return typeof object.typescript === "string" ? object.typescript : object.typescript.join("\n"); if (object.type === "event") { - if (c) { + if (property) { return `on(event: "${object.name}", callback: ${getArguments( object )} => void): void;`; @@ -145,7 +179,7 @@ function getDeclaration(object, c) { ) { // function const name = object.type === "constructor" ? "new" : object.name; - if (c) { + if (property) { return `${name}${getArguments(object)}: ${getReturnType(object)};`; } else { return `declare function ${name}${getArguments(object)}: ${getReturnType( @@ -158,7 +192,7 @@ function getDeclaration(object, c) { object.type === "object" ? object.instanceof : getBasicType(object.return_object || object.return[0]); - if (c) { + if (property) { return `${object.name}: ${type};`; } else { return `declare const ${object.name}: ${type};`; @@ -166,11 +200,21 @@ function getDeclaration(object, c) { } } -require("./common.js").readAllWrapperFiles(function (objects, types) { +/** + * Return classes and libraries. + * @param {object[]} objects - The list of objects. + * @returns {object} + * An object with class names as keys and the following as values: + * { + * library?: true, // whether it's a library or a class + * object?, // the object containing its data + * staticProperties: [], // a list of its static properties + * prototype: [], // a list of the prototype's properties + * cons?: // the class's constructor + * } + */ +function getClasses(objects) { const classes = {}; - const globals = []; - - // Handle classes and libraries first objects.forEach(function (object) { if (object.type == "class" || object.type == "library") { classes[object.class] = { @@ -181,41 +225,81 @@ require("./common.js").readAllWrapperFiles(function (objects, types) { }; } }); + return classes; +} +/** + * Return all the objects in an organised structure, so class are + * found inside their corresponding classes. + * @param {object[]} objects - The list of objects. + * @returns {[object, object[]]} + * An array. The first item is the classes object (see `getClasses`), + * and the second is an array of global objects. + */ +function getAll(objects) { + const classes = getClasses(objects); + const globals = []; + + /** + * @param {string} c - The name of the class. + * @returns {object} + * The class with the corresponding name (see `getClasses` for its + * contents), or a new one if it doesn't exist. + */ function getClass(c) { if (!classes[c]) classes[c] = { staticProperties: [], prototype: [] }; return classes[c]; } - // Handle contents objects.forEach(function (object) { - if (["include"].includes(object.type)) { - } else if (["class", "object", "library"].includes(object.type)) { - } else if (["init", "idle", "kill"].includes(object.type)) { - } else if (["event"].includes(object.type)) { - getClass(object.class).staticProperties.push(object); + if (["class", "object", "library"].includes(object.type)) { + // already handled in `getClases` + } else if (["include", "init", "idle", "kill"].includes(object.type)) { + // internal } else if (object.type === "constructor") { + // set as constructor getClass(object.class).cons = object; - } else if (["staticproperty", "staticmethod"].includes(object.type)) { + } else if ( + ["event", "staticproperty", "staticmethod"].includes(object.type) + ) { + // add to static properties getClass(object.class).staticProperties.push(object); } else if (["property", "method"].includes(object.type)) { + // add to prototype getClass(object.class)["prototype"].push(object); } else if ( ["function", "letiable", "object", "variable", "typescript"].includes( object.type ) ) { + // add to globals globals.push(object); } else console.warn("Unknown type " + object.type + " for ", object); }); + return [classes, globals]; +} - const file = - "// NOTE: This file has been automatically generated.\n\n" + - '/// \n\n' + +/** + * Return the declarations of custom types. + * @param {string[]} types - The list of types defined in comments. + * @returns {string} The joined declarations. + */ +function getTypeDeclarations(types) { + return ( "// TYPES\n" + types .map((type) => type.replace(/\\\//g, "/").replace(/\\\\/g, "\\")) - .join("") + + .join("") + ); +} + +/** + * Return the class declarations (not including libraries). + * @param {object} classes - The object of classes (see `getClasses`). + * @returns {string} The class declarations. + */ +function getClassDeclarations(classes) { + return ( "\n\n// CLASSES\n\n" + Object.entries(classes) .filter(([_, c]) => !c.library) @@ -276,7 +360,17 @@ require("./common.js").readAllWrapperFiles(function (objects, types) { ) + "\n}" ) - .join("\n\n") + + .join("\n\n") + ); +} + +/** + * Return the global declarations. + * @param {object[]} globals - The list of global objects. + * @returns {string} The global declarations. + */ +function getGlobalDeclarations(globals) { + return ( "\n\n// GLOBALS\n\n" + globals .map((global) => @@ -291,7 +385,17 @@ require("./common.js").readAllWrapperFiles(function (objects, types) { "\n}" : `${getDocumentation(global)}\n${getDeclaration(global)}` ) - .join("\n\n") + + .join("\n\n") + ); +} + +/** + * Return the library declarations. + * @param {object} classes - The object of classes and libraries (see `getClasses`). + * @returns {string} The library declarations. + */ +function getLibraryDeclarations(classes) { + return ( "\n\n// LIBRARIES\n\ntype Libraries = {\n" + indent( Object.entries(classes) @@ -313,6 +417,34 @@ require("./common.js").readAllWrapperFiles(function (objects, types) { ) .join("\n\n") ) + - "\n}"; - fs.writeFileSync("../BangleApps/typescript/types/main.d.ts", file); -}); + "\n}" + ); +} + +/** + * Build TypeScript declarations from the source code's comments. + * @returns {Promise} Promise that is resolved with the contents of the file to write. + */ +function buildTypes() { + return new Promise((resolve) => { + require("./common.js").readAllWrapperFiles(function (objects, types) { + const [classes, globals] = getAll(objects); + + resolve( + "// NOTE: This file has been automatically generated.\n\n" + + '/// \n\n' + + getTypeDeclarations(types) + + getClassDeclarations(classes) + + getGlobalDeclarations(globals) + + getLibraryDeclarations(classes) + ); + }); + }); +} + +buildTypes().then((content) => + require("fs").writeFileSync( + "../BangleApps/typescript/types/main.d.ts", + content + ) +); From 46316c17128c37af6d1714a40e7365f87a63684a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 25 Jul 2022 11:25:48 +0100 Subject: [PATCH 0208/1183] Fix 'console.log([1,2,3].splice(0, 1.0))' (fix #2245) --- ChangeLog | 1 + src/jswrap_array.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 051a812a72..deb7df0293 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,7 @@ Bangle.js 2: Fix `NRF.setAdvertising({},{scannable:false})` Bangle.js 2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) nRF52: Change from hard -> softfp calling convention (saves a few bytes, more compatible with compiled code) + Fix 'console.log([1,2,3].splice(0, 1.0))' (fix #2245) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jswrap_array.c b/src/jswrap_array.c index a46f9f93c7..5dcf559ae7 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -532,7 +532,7 @@ JsVar *jswrap_array_splice(JsVar *parent, JsVarInt index, JsVar *howManyVar, JsV if (index<0) index=0; if (index>len) index=len; JsVarInt howMany = len; // how many to delete! - if (jsvIsInt(howManyVar)) howMany = jsvGetInteger(howManyVar); + if (jsvIsNumeric(howManyVar)) howMany = jsvGetInteger(howManyVar); if (howMany > len-index) howMany = len-index; JsVarInt newItems = jsvGetArrayLength(elements); JsVarInt shift = newItems-howMany; From 44ea01597d897f7e43fad6689d4da4ef074ddc44 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 25 Jul 2022 11:35:09 +0100 Subject: [PATCH 0209/1183] explicit python 2.7 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 114e59fda4..c52062d73b 100755 --- a/Makefile +++ b/Makefile @@ -748,7 +748,7 @@ endif docs: @echo Generating Board docs - $(Q)python scripts/build_docs.py $(WRAPPERSOURCES) $(DEFINES) -B$(BOARD) + $(Q)python2.7 scripts/build_docs.py $(WRAPPERSOURCES) $(DEFINES) -B$(BOARD) @echo functions.html created $(WRAPPERFILE): scripts/build_jswrapper.py $(WRAPPERSOURCES) From 2344d53fc42e5cd620d9d9e8cd4b2a0c0793f175 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 26 Jul 2022 12:18:21 +0100 Subject: [PATCH 0210/1183] force python version --- scripts/build_docs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_docs.py b/scripts/build_docs.py index c489c495e8..f11d91e382 100755 --- a/scripts/build_docs.py +++ b/scripts/build_docs.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python2.7 # This file is part of Espruino, a JavaScript interpreter for Microcontrollers # From 42c64e64b3d3018ae3d3d66dc69abd454c85a2fd Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 26 Jul 2022 12:30:05 +0100 Subject: [PATCH 0211/1183] Bangle.js 2: Fix bluetooth .connect ERR 7 (remove request to use secondary phy as well) --- targets/nrf5x/bluetooth.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/targets/nrf5x/bluetooth.c b/targets/nrf5x/bluetooth.c index a54f7c6155..8db9967d36 100644 --- a/targets/nrf5x/bluetooth.c +++ b/targets/nrf5x/bluetooth.c @@ -3299,7 +3299,9 @@ void jsble_central_connect(ble_gap_addr_t peer_addr, JsVar *options) { m_scan_param.window = MSEC_TO_UNITS(90, UNIT_0_625_MS); // Scan window. m_scan_param.timeout = 4; // 4 second timeout. #if NRF_SD_BLE_API_VERSION>5 - m_scan_param.scan_phys = BLE_GAP_PHYS_SUPPORTED; + // It seems we could force connect on coded phy with: + // m_scan_param.extended = 1; + // m_scan_param.scan_phys = BLE_GAP_PHY_CODED; BLE_GAP_PHYS_SUPPORTED results in INVALID_PARAM #endif ble_gap_conn_params_t gap_conn_params; From 18a7ff445382c1f6381a906c07519aa4f575132d Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 18:02:54 +0200 Subject: [PATCH 0212/1183] TypeScript: Array --- src/jswrap_array.c | 89 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/src/jswrap_array.c b/src/jswrap_array.c index c299f737bf..8b50d7eb28 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -25,7 +25,7 @@ "type" : "class", "class" : "Array", "check" : "jsvIsArray(var)", - "typescript": "interface Array" + "typescript" : "interface Array" } This is the built-in JavaScript class for arrays. @@ -40,7 +40,15 @@ Arrays can be defined with ```[]```, ```new Array()```, or ```new Array(length)` "params" : [ ["args","JsVarArray","The length of the array OR any number of items to add to the array"] ], - "return" : ["JsVar","An Array"] + "return" : ["JsVar","An Array"], + "typescript" : [ + "new(arrayLength?: number): any[];", + "new(arrayLength: number): T[];", + "new(...items: T[]): T[];", + "(arrayLength?: number): any[];", + "(arrayLength: number): T[];", + "(...items: T[]): T[];" + ] } Create an Array. Either give it one integer argument (>=0) which is the length of the array, or any number of arguments */ @@ -77,7 +85,8 @@ JsVar *jswrap_array_constructor(JsVar *args) { "params" : [ ["radix","JsVar","unused"] ], - "return" : ["JsVar","A String representing the array"] + "return" : ["JsVar","A String representing the array"], + "typescript" : "toString(): string;" } Convert the Array to a string */ @@ -87,7 +96,8 @@ Convert the Array to a string "class" : "Array", "name" : "length", "generate" : "jswrap_object_length", - "return" : ["JsVar","The value of the array"] + "return" : ["JsVar","The value of the array"], + "typescript" : "length: number;" } Find the length of the array */ @@ -101,7 +111,8 @@ Find the length of the array ["value","JsVar","The value to check for"], ["startIndex","int","(optional) the index to search from, or 0 if not specified"] ], - "return" : ["JsVar","the index of the value in the array, or -1"] + "return" : ["JsVar","the index of the value in the array, or -1"], + "typescript" : "indexOf(value: T, startIndex?: number): number;" } Return the index of the value in the array, or -1 */ @@ -122,7 +133,8 @@ JsVar *jswrap_array_indexOf(JsVar *parent, JsVar *value, JsVarInt startIdx) { ["value","JsVar","The value to check for"], ["startIndex","int","(optional) the index to search from, or 0 if not specified"] ], - "return" : ["bool","`true` if the array includes the value, `false` otherwise"] + "return" : ["bool","`true` if the array includes the value, `false` otherwise"], + "typescript" : "includes(value: T, startIndex?: number): boolean;" } Return `true` if the array includes the value, `false` otherwise */ @@ -161,7 +173,8 @@ bool jswrap_array_includes(JsVar *arr, JsVar *value, JsVarInt startIdx) { "params" : [ ["separator","JsVar","The separator"] ], - "return" : ["JsVar","A String representing the Joined array"] + "return" : ["JsVar","A String representing the Joined array"], + "typescript" : "join(separator?: string): string;" } Join all elements of this array together into one string, using 'separator' between them. eg. ```[1,2,3].join(' ')=='1 2 3'``` */ @@ -185,7 +198,8 @@ JsVar *jswrap_array_join(JsVar *parent, JsVar *filler) { "params" : [ ["arguments","JsVarArray","One or more arguments to add"] ], - "return" : ["int","The new size of the array"] + "return" : ["int","The new size of the array"], + "typescript" : "push(...arguments: T[]): number;" } Push a new value onto the end of this array' @@ -214,7 +228,8 @@ JsVarInt jswrap_array_push(JsVar *parent, JsVar *args) { "class" : "Array", "name" : "pop", "generate_full" : "jsvSkipNameAndUnLock(jsvArrayPop(parent))", - "return" : ["JsVar","The value that is popped off"] + "return" : ["JsVar","The value that is popped off"], + "typescript" : "pop(): T | undefined;" } Remove and return the value on the end of this array. @@ -327,7 +342,8 @@ static JsVar *_jswrap_array_iterate_with_callback( ["function","JsVar","Function used to map one item to another"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], - "return" : ["JsVar","An array containing the results"] + "return" : ["JsVar","An array containing the results"], + "typescript" : "map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];" } Return an array which is made from the following: ```A.map(function) = [function(A[0]), function(A[1]), ...]``` */ @@ -344,7 +360,7 @@ JsVar *jswrap_array_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { ["function","JsVar","Function to be executed"], ["thisArg","JsVar","[optional] If specified, the function is called with 'this' set to thisArg (optional)"] ], - "typescript": "forEach(callback: (item: T, index: number, array: T[]) => void, thisArg?: any): void;" + "typescript" : "forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;" } Executes a provided function once per array element. */ @@ -361,7 +377,11 @@ void jswrap_array_forEach(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { ["function","JsVar","Function to be executed"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], - "return" : ["JsVar","An array containing the results"] + "return" : ["JsVar","An array containing the results"], + "typescript" : [ + "filter(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];", + "filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];" + ] } Return an array which contains only those elements for which the callback function returns 'true' */ @@ -378,7 +398,11 @@ JsVar *jswrap_array_filter(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { "params" : [ ["function","JsVar","Function to be executed"] ], - "return" : ["JsVar","The array element where `function` returns `true`, or `undefined`"] + "return" : ["JsVar","The array element where `function` returns `true`, or `undefined`"], + "typescript" : [ + "find(predicate: (this: void, value: T, index: number, obj: T[]) => value is S): S | undefined;", + "find(predicate: (value: T, index: number, obj: T[]) => unknown): T | undefined;" + ] } Return the array element where `function` returns `true`, or `undefined` if it doesn't returns `true` for any element. @@ -400,7 +424,8 @@ JsVar *jswrap_array_find(JsVar *parent, JsVar *funcVar) { "params" : [ ["function","JsVar","Function to be executed"] ], - "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"] + "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"], + "typescript" : "findIndex(predicate: (value: T, index: number, obj: T[]) => unknown): number;" } Return the array element's index where `function` returns `true`, or `-1` if it doesn't returns `true` for any element. @@ -424,7 +449,8 @@ JsVar *jswrap_array_findIndex(JsVar *parent, JsVar *funcVar) { ["function","JsVar","Function to be executed"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], - "return" : ["JsVar","A boolean containing the result"] + "return" : ["JsVar","A boolean containing the result"], + "typescript" : "some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;" } Return 'true' if the callback returns 'true' for any of the elements in the array */ @@ -441,7 +467,8 @@ JsVar *jswrap_array_some(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { ["function","JsVar","Function to be executed"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], - "return" : ["JsVar","A boolean containing the result"] + "return" : ["JsVar","A boolean containing the result"], + "typescript" : "every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;" } Return 'true' if the callback returns 'true' for every element in the array */ @@ -459,7 +486,8 @@ JsVar *jswrap_array_every(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { ["callback","JsVar","Function used to reduce the array"], ["initialValue","JsVar","if specified, the initial value to pass to the function"] ], - "return" : ["JsVar","The value returned by the last function called"] + "return" : ["JsVar","The value returned by the last function called"], + "typescript" : "reduce(callback: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;" } Execute `previousValue=initialValue` and then `previousValue = callback(previousValue, currentValue, index, array)` for each element in the array, and finally return previousValue. */ @@ -523,7 +551,8 @@ JsVar *jswrap_array_reduce(JsVar *parent, JsVar *funcVar, JsVar *initialValue) { ["howMany","JsVar","An integer indicating the number of old array elements to remove. If howMany is 0, no elements are removed."], ["elements","JsVarArray","One or more items to add to the array"] ], - "return" : ["JsVar","An array containing the removed elements. If only one element is removed, an array of one element is returned."] + "return" : ["JsVar","An array containing the removed elements. If only one element is removed, an array of one element is returned."], + "typescript" : "splice(index: number, howMany?: number, ...elements: T[]): T[];" } Both remove and add items to an array */ @@ -609,7 +638,8 @@ JsVar *jswrap_array_splice(JsVar *parent, JsVarInt index, JsVar *howManyVar, JsV "params" : [ ], - "return" : ["JsVar","The element that was removed"] + "return" : ["JsVar","The element that was removed"], + "typescript" : "shift(): T | undefined;" } Remove and return the first element of the array. @@ -638,7 +668,8 @@ JsVar *jswrap_array_shift(JsVar *parent) { "params" : [ ["elements","JsVarArray","One or more items to add to the beginning of the array"] ], - "return" : ["int","The new array length"] + "return" : ["int","The new array length"], + "typescript" : "unshift(...elements: T[]): number;" } Add one or more items to the start of the array, and return its new length. @@ -662,7 +693,8 @@ JsVarInt jswrap_array_unshift(JsVar *parent, JsVar *elements) { ["start","int","Start index"], ["end","JsVar","End index (optional)"] ], - "return" : ["JsVar","A new array"] + "return" : ["JsVar","A new array"], + "typescript" : "slice(start?: number, end?: number): T[];" } Return a copy of a portion of this array (in a new array) */ @@ -721,7 +753,8 @@ JsVar *jswrap_array_slice(JsVar *parent, JsVarInt start, JsVar *endVar) { "params" : [ ["var","JsVar","The variable to be tested"] ], - "return" : ["bool","True if var is an array, false if not."] + "return" : ["bool","True if var is an array, false if not."], + "typescript" : "isArray(arg: any): arg is any[];" } Returns true if the provided object is an array */ @@ -823,7 +856,8 @@ NO_INLINE static void _jswrap_array_sort(JsvIterator *head, int n, JsVar *compar "params" : [ ["var","JsVar","A function to use to compare array elements (or undefined)"] ], - "return" : ["JsVar","This array object"] + "return" : ["JsVar","This array object"], + "typescript" : "sort(compareFn?: (a: T, b: T) => number): T[];" } Do an in-place quicksort of the array */ @@ -870,7 +904,8 @@ JsVar *jswrap_array_sort (JsVar *array, JsVar *compareFn) { "params" : [ ["args","JsVarArray","Any items to add to the array"] ], - "return" : ["JsVar","An Array"] + "return" : ["JsVar","An Array"], + "typescript" : "concat(...args: (T | T[])[]): T[];" } Create a new array, containing the elements from this one and any arguments, if any argument is an array then those elements will be added. */ @@ -908,7 +943,8 @@ JsVar *jswrap_array_concat(JsVar *parent, JsVar *args) { ["start","int","Optional. The index to start from (or 0). If start is negative, it is treated as length+start where length is the length of the array"], ["end","JsVar","Optional. The index to end at (or the array length). If end is negative, it is treated as length+end."] ], - "return" : ["JsVar","This array"] + "return" : ["JsVar","This array"], + "typescript" : "fill(value: T, start: number, end?: number): T[];" } Fill this array with the given value, for every index `>= start` and `< end` */ @@ -988,7 +1024,8 @@ void _jswrap_array_reverse_block(JsVar *parent, JsvIterator *it, int items) { "name" : "reverse", "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_array_reverse", - "return" : ["JsVar","The array, but reversed."] + "return" : ["JsVar","The array, but reversed."], + "typescript" : "reverse(): T[];" } Reverse all elements in this array (in place) */ From 0bf81d849daab8084005b7582cb927857a9610d3 Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:04:41 +0200 Subject: [PATCH 0213/1183] TypeScript: ArrayBuffer --- scripts/build_types.js | 30 +++++------ src/jswrap_arraybuffer.c | 105 ++++++++++++++++++++++++++++----------- 2 files changed, 91 insertions(+), 44 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 56f0f00f2b..c5bb5dc68f 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -319,20 +319,22 @@ function getClassDeclarations(classes) { ) .join("\n\n") ) + - `\n}\n\n${c.object?.typescript || "interface " + name} {\n` + - indent( - c.prototype - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") - ) + - `\n}\n\n${getDocumentation( - c.object - )}\ndeclare const ${name}: ${name}Constructor` + `\n}\n\n` + + (name.endsWith("Array") && !name.startsWith("Array") + ? `type ${name} = ArrayBufferView<${name}>;\n` + : `${c.object?.typescript || "interface " + name} {\n` + + indent( + c.prototype + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + `\n}\n\n${getDocumentation(c.object)}`) + + `\ndeclare const ${name}: ${name}Constructor` : // other class `${getDocumentation(c.object)}\ndeclare class ${ c.object?.typescript || name diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index d784064c45..48b50af4ed 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -19,6 +19,21 @@ #include "jsnative.h" #include "jsinteractive.h" +/*TYPESCRIPT +interface ArrayLike { + readonly length: number; + readonly [n: number]: T; +} + +type TypedArrayConstructor = ((length: number) => T) & + ((array: ArrayLike) => T) & + (( + buffer: ArrayBuffer, + byteOffset?: number, + length?: number + ) => T); +*/ + /*JSON{ "type" : "class", "class" : "ArrayBuffer", @@ -33,7 +48,8 @@ you may also find `DataView` useful. /*JSON{ "type" : "class", - "class" : "ArrayBufferView" + "class" : "ArrayBufferView", + "typescript" : "ArrayBufferView" } This is the built-in JavaScript class that is the prototype for: @@ -193,7 +209,8 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "params" : [ ["byteLength","int","The length in Bytes"] ], - "return" : ["JsVar","An ArrayBuffer object"] + "return" : ["JsVar","An ArrayBuffer object"], + "typescript" : "new(byteLength: number): ArrayBuffer;" } Create an Array Buffer object */ @@ -251,7 +268,8 @@ The length, in bytes, of the `ArrayBuffer` ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -266,7 +284,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. @@ -283,7 +302,8 @@ Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -298,7 +318,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -313,7 +334,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -329,7 +351,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -344,7 +367,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -359,7 +383,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -374,7 +399,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -389,7 +415,8 @@ Create a typed array based on the given input. Either an existing Array Buffer, ["length","int","The length (ONLY IF the first argument was an ArrayBuffer)"] ], "return" : ["JsVar","A typed array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "new: TypedArrayConstructor;" } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -454,7 +481,8 @@ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *a "name" : "buffer", "generate_full" : "jsvLock(jsvGetFirstChild(parent))", "return" : ["JsVar","An ArrayBuffer object"], - "return_object" : "ArrayBuffer" + "return_object" : "ArrayBuffer", + "typescript" : "readonly buffer: T;" } The buffer this view references */ @@ -463,7 +491,8 @@ The buffer this view references "class" : "ArrayBufferView", "name" : "byteLength", "generate_full" : "(JsVarInt)(parent->varData.arraybuffer.length * JSV_ARRAYBUFFER_GET_SIZE(parent->varData.arraybuffer.type))", - "return" : ["int","The Length"] + "return" : ["int","The Length"], + "typescript" : "readonly byteLength: number;" } The length, in bytes, of the `ArrayBufferView` */ @@ -472,7 +501,8 @@ The length, in bytes, of the `ArrayBufferView` "class" : "ArrayBufferView", "name" : "byteOffset", "generate_full" : "parent->varData.arraybuffer.byteOffset", - "return" : ["int","The byte Offset"] + "return" : ["int","The byte Offset"], + "typescript" : "readonly byteOffset: number;" } The offset, in bytes, to the first byte of the view within the backing `ArrayBuffer` */ @@ -485,7 +515,8 @@ The offset, in bytes, to the first byte of the view within the backing `ArrayBuf "params" : [ ["arr","JsVar","Floating point index to access"], ["offset","int32","The offset in this array at which to write the values (optional)"] - ] + ], + "typescript" : "set(arr: ArrayLike, offset: number): void" } Copy the contents of `array` into this one, mapping `this[x+offset]=array[x];` */ @@ -548,7 +579,8 @@ void jswrap_arraybufferview_set(JsVar *parent, JsVar *arr, int offset) { ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], "return" : ["JsVar","An array containing the results"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "map(callbackfn: (value: number, index: number, array: T) => number, thisArg?: any): T;" } Return an array which is made from the following: ```A.map(function) = [function(A[0]), function(A[1]), ...]``` @@ -616,7 +648,8 @@ JsVar *jswrap_arraybufferview_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) ["end","JsVar","Element to end at, exclusive. If negative, it is relative to the end of the array. If not specified the whole array is included"] ], "return" : ["JsVar","An `ArrayBufferView` of the same type as this one, referencing the same data"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "subarray(begin?: number, end?: number): T;" } Returns a smaller part of this array which references the same data (it doesn't copy it). */ @@ -665,7 +698,8 @@ JsVar *jswrap_arraybufferview_subarray(JsVar *parent, JsVarInt begin, JsVar *end ["value","JsVar","The value to check for"], ["startIndex","int","(optional) the index to search from, or 0 if not specified"] ], - "return" : ["JsVar","the index of the value in the array, or -1"] + "return" : ["JsVar","the index of the value in the array, or -1"], + "typescript" : "indexOf(value: number, startIndex?: number): number;" } Return the index of the value in the array, or `-1` */ @@ -679,7 +713,8 @@ Return the index of the value in the array, or `-1` ["value","JsVar","The value to check for"], ["startIndex","int","(optional) the index to search from, or 0 if not specified"] ], - "return" : ["bool","`true` if the array includes the value, `false` otherwise"] + "return" : ["bool","`true` if the array includes the value, `false` otherwise"], + "typescript" : "includes(value: number, startIndex?: number): boolean;" } Return `true` if the array includes the value, `false` otherwise */ @@ -691,7 +726,8 @@ Return `true` if the array includes the value, `false` otherwise "params" : [ ["separator","JsVar","The separator"] ], - "return" : ["JsVar","A String representing the Joined array"] + "return" : ["JsVar","A String representing the Joined array"], + "typescript" : "join(separator?: string): string;" } Join all elements of this array together into one string, using 'separator' between them. eg. ```[1,2,3].join(' ')=='1 2 3'``` */ @@ -705,7 +741,8 @@ Join all elements of this array together into one string, using 'separator' betw ["var","JsVar","A function to use to compare array elements (or undefined)"] ], "return" : ["JsVar","This array object"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "sort(compareFn?: (a: number, b: number) => number): this;" } Do an in-place quicksort of the array */ @@ -741,7 +778,8 @@ JsVar *jswrap_arraybufferview_sort(JsVar *array, JsVar *compareFn) { "params" : [ ["function","JsVar","Function to be executed"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] - ] + ], + "typescript" : "forEach(callbackfn: (value: number, index: number, array: T) => void, thisArg?: any): void;" } Executes a provided function once per array element. */ @@ -755,7 +793,8 @@ Executes a provided function once per array element. ["callback","JsVar","Function used to reduce the array"], ["initialValue","JsVar","if specified, the initial value to pass to the function"] ], - "return" : ["JsVar","The value returned by the last function called"] + "return" : ["JsVar","The value returned by the last function called"], + "typescript" : "reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: T) => number, initialValue?: number): number;" } Execute `previousValue=initialValue` and then `previousValue = callback(previousValue, currentValue, index, array)` for each element in the array, and finally return previousValue. */ @@ -771,7 +810,8 @@ Execute `previousValue=initialValue` and then `previousValue = callback(previous ["end","JsVar","Optional. The index to end at (or the array length). If end is negative, it is treated as length+end."] ], "return" : ["JsVar","This array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "fill(value: number, start?: number, end?: number): T;" } Fill this array with the given value, for every index `>= start` and `< end` */ @@ -785,7 +825,8 @@ Fill this array with the given value, for every index `>= start` and `< end` ["function","JsVar","Function to be executed"], ["thisArg","JsVar","if specified, the function is called with 'this' set to thisArg (optional)"] ], - "return" : ["JsVar","An array containing the results"] + "return" : ["JsVar","An array containing the results"], + "typescript" : "filter(predicate: (value: number, index: number, array: T) => any, thisArg?: any): T;" } Return an array which contains only those elements for which the callback function returns 'true' */ @@ -798,7 +839,8 @@ Return an array which contains only those elements for which the callback functi "params" : [ ["function","JsVar","Function to be executed"] ], - "return" : ["JsVar","The array element where `function` returns `true`, or `undefined`"] + "return" : ["JsVar","The array element where `function` returns `true`, or `undefined`"], + "typescript" : "find(predicate: (value: number, index: number, obj: T) => boolean, thisArg?: any): number | undefined;" } Return the array element where `function` returns `true`, or `undefined` if it doesn't returns `true` for any element. */ @@ -811,7 +853,8 @@ Return the array element where `function` returns `true`, or `undefined` if it d "params" : [ ["function","JsVar","Function to be executed"] ], - "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"] + "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"], + "typescript" : "findIndex(predicate: (value: number, index: number, obj: T) => boolean, thisArg?: any): number;" } Return the array element's index where `function` returns `true`, or `-1` if it doesn't returns `true` for any element. */ @@ -822,7 +865,8 @@ Return the array element's index where `function` returns `true`, or `-1` if it "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_array_reverse", "return" : ["JsVar","This array"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "reverse(): T" } Reverse the contents of this `ArrayBufferView` in-place */ @@ -837,7 +881,8 @@ Reverse the contents of this `ArrayBufferView` in-place ["end","JsVar","End index (optional)"] ], "return" : ["JsVar","A new array"], - "return_object" : "Array" + "return_object" : "Array", + "typescript" : "slice(start?: number, end?: number): number[];" } Return a copy of a portion of this array (in a new array). From 2aee90ef801a8ff2c98d596bde2bf3d740dae039 Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:04:54 +0200 Subject: [PATCH 0214/1183] TypeScript: DataView --- src/jswrap_dataview.c | 51 ++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/src/jswrap_dataview.c b/src/jswrap_dataview.c index f06dd9b254..ba534a9fa5 100644 --- a/src/jswrap_dataview.c +++ b/src/jswrap_dataview.c @@ -39,7 +39,8 @@ This class helps ], "return" : ["JsVar","A `DataView` object"], "return_object" : "DataView", - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "new(buffer: ArrayBuffer, byteOffset?: number, byteLength?: number): DataView;" } Create a `DataView` object that can be used to access the data in an `ArrayBuffer`. @@ -122,7 +123,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getFloat32(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -135,7 +137,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getFloat64(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -148,7 +151,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getInt8(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -161,7 +165,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getInt16(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -174,7 +179,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getInt32(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -187,7 +193,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getUint8(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -200,7 +207,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getUint16(byteOffset: number, littleEndian?: boolean): number;" } */ /*JSON{ @@ -213,7 +221,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], "return" : ["JsVar","the index of the value in the array, or -1"], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "getUint32(byteOffset: number, littleEndian?: boolean): number;" } */ @@ -229,7 +238,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -242,7 +252,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -255,7 +266,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setInt8(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -268,7 +280,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -281,7 +294,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -294,7 +308,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setUint8(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -307,7 +322,8 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ /*JSON{ @@ -320,6 +336,7 @@ void jswrap_dataview_set(JsVar *dataview, JsVarDataArrayBufferViewType type, int ["value","JsVar","The value to write"], ["littleEndian","bool","(optional) Whether to read in little endian - if false or undefined data is read as big endian"] ], - "ifndef" : "SAVE_ON_FLASH" + "ifndef" : "SAVE_ON_FLASH", + "typescript" : "setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;" } */ From 8730bb8fa53f74df8555434126f25be0ed09c37b Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:13:36 +0200 Subject: [PATCH 0215/1183] TypeScript: Date --- src/jswrap_date.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 35152c8464..404a7fb6eb 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -264,7 +264,12 @@ JsVar *jswrap_date_from_milliseconds(JsVarFloat time) { ["args","JsVarArray","Either nothing (current time), one numeric argument (milliseconds since 1970), a date string (see `Date.parse`), or [year, month, day, hour, minute, second, millisecond] "] ], "return" : ["JsVar","A Date object"], - "return_object" : "Date" + "return_object" : "Date", + "typescript" : [ + "new(): Date;", + "new(value: number | string): Date;", + "new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;" + ] } Creates a date object */ @@ -322,7 +327,8 @@ int jswrap_date_getTimezoneOffset(JsVar *parent) { "class" : "Date", "name" : "getIsDST", "generate" : "jswrap_date_getIsDST", - "return" : ["int32","true if daylight savings time is in effect"] + "return" : ["int32","true if daylight savings time is in effect"], + "typescript" : "getIsDST(): boolean" } This returns a boolean indicating whether daylight savings time is in effect. @@ -491,7 +497,8 @@ int jswrap_date_getFullYear(JsVar *parent) { ["secondsValue","JsVar","optional - number of seconds, 0..59"], ["millisecondsValue","JsVar","optional - number of milliseconds, 0..999"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "setHours(hoursValue: number, minutesValue?: number, secondsValue?: number, millisecondsValue?: number): number;" } 0..23 */ @@ -519,7 +526,8 @@ JsVarFloat jswrap_date_setHours(JsVar *parent, int hoursValue, JsVar *minutesVal ["secondsValue","JsVar","optional - number of seconds, 0..59"], ["millisecondsValue","JsVar","optional - number of milliseconds, 0..999"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "setMinutes(minutesValue: number, secondsValue?: number, millisecondsValue?: number): number;" } 0..59 */ @@ -544,7 +552,8 @@ JsVarFloat jswrap_date_setMinutes(JsVar *parent, int minutesValue, JsVar *second ["secondsValue","int","number of seconds, 0..59"], ["millisecondsValue","JsVar","optional - number of milliseconds, 0..999"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "setSeconds(secondsValue: number, millisecondsValue?: number): number;" } 0..59 */ @@ -609,7 +618,8 @@ JsVarFloat jswrap_date_setDate(JsVar *parent, int dayValue) { ["yearValue","int","The month, between 0 and 11"], ["dayValue","JsVar","optional - the day, between 0 and 31"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "setMonth(yearValue: number, dayValue?: number): number;" } Month of the year 0..11 */ @@ -635,7 +645,8 @@ JsVarFloat jswrap_date_setMonth(JsVar *parent, int monthValue, JsVar *dayValue) ["monthValue","JsVar","optional - the month, between 0 and 11"], ["dayValue","JsVar","optional - the day, between 0 and 31"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "setFullYear(yearValue: number, monthValue?: number, dayValue?: number): number;" } */ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthValue, JsVar *dayValue) { @@ -660,7 +671,8 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal "class" : "Date", "name" : "toString", "generate" : "jswrap_date_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" } Converts to a String, eg: `Fri Jun 20 2014 14:52:20 GMT+0000` @@ -689,7 +701,8 @@ JsVar *jswrap_date_toString(JsVar *parent) { "class" : "Date", "name" : "toUTCString", "generate" : "jswrap_date_toUTCString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toUTCString(): string;" } Converts to a String, eg: `Fri, 20 Jun 2014 14:52:20 GMT` @@ -707,7 +720,8 @@ JsVar *jswrap_date_toUTCString(JsVar *parent) { "class" : "Date", "name" : "toISOString", "generate" : "jswrap_date_toISOString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toISOString(): string;" } Converts to a ISO 8601 String, eg: `2014-06-20T14:52:20.123Z` @@ -718,7 +732,8 @@ Converts to a ISO 8601 String, eg: `2014-06-20T14:52:20.123Z` "class" : "Date", "name" : "toJSON", "generate" : "jswrap_date_toISOString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toJSON(): string;" } Calls `Date.toISOString` to output this date to JSON */ @@ -734,7 +749,8 @@ JsVar *jswrap_date_toISOString(JsVar *parent) { "class" : "Date", "name" : "toLocalISOString", "generate" : "jswrap_date_toLocalISOString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toLocalISOString(): string;" } Converts to a ISO 8601 String (with timezone information), eg: `2014-06-20T14:52:20.123-0500` */ @@ -815,7 +831,8 @@ static bool _parse_time(TimeInDay *time, int initialChars) { "params" : [ ["str","JsVar","A String"] ], - "return" : ["float","The number of milliseconds since 1970"] + "return" : ["float","The number of milliseconds since 1970"], + "typescript" : "parse(str: string): number;" } Parse a date string and return milliseconds since 1970. Data can be either '2011-10-20T14:48:00', '2011-10-20' or 'Mon, 25 Dec 1995 13:30:00 +0430' */ From 0f3007093924d4f66d21e80081dc3c77fcf99255 Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:16:40 +0200 Subject: [PATCH 0216/1183] TypeScript: Error --- src/jswrap_error.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/jswrap_error.c b/src/jswrap_error.c index 88a26eead9..e087cf979c 100644 --- a/src/jswrap_error.c +++ b/src/jswrap_error.c @@ -69,7 +69,8 @@ JsVar *_jswrap_error_constructor(JsVar *msg, char *type) { "params" : [ ["message","JsVar","An optional message string"] ], - "return" : ["JsVar","An Error object"] + "return" : ["JsVar","An Error object"], + "typescript" : "new(message?: string): Error;" } Creates an Error object */ @@ -84,7 +85,8 @@ JsVar *jswrap_error_constructor(JsVar *msg) { "params" : [ ["message","JsVar","An optional message string"] ], - "return" : ["JsVar","A SyntaxError object"] + "return" : ["JsVar","A SyntaxError object"], + "typescript" : "new(message?: string): SyntaxError;" } Creates a SyntaxError object */ @@ -99,7 +101,8 @@ JsVar *jswrap_syntaxerror_constructor(JsVar *msg) { "params" : [ ["message","JsVar","An optional message string"] ], - "return" : ["JsVar","A TypeError object"] + "return" : ["JsVar","A TypeError object"], + "typescript" : "new(message?: string): TypeError;" } Creates a TypeError object */ @@ -114,7 +117,8 @@ JsVar *jswrap_typeerror_constructor(JsVar *msg) { "params" : [ ["message","JsVar","An optional message string"] ], - "return" : ["JsVar","An InternalError object"] + "return" : ["JsVar","An InternalError object"], + "typescript" : "new(message?: string): InternalError;" } Creates an InternalError object */ @@ -130,7 +134,8 @@ JsVar *jswrap_internalerror_constructor(JsVar *msg) { "params" : [ ["message","JsVar","An optional message string"] ], - "return" : ["JsVar","A ReferenceError object"] + "return" : ["JsVar","A ReferenceError object"], + "typescript" : "new(message?: string): ReferenceError;" } Creates a ReferenceError object */ @@ -143,35 +148,40 @@ JsVar *jswrap_referenceerror_constructor(JsVar *msg) { "class" : "Error", "name" : "toString", "generate" : "jswrap_error_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" }*/ /*JSON{ "type" : "method", "class" : "SyntaxError", "name" : "toString", "generate" : "jswrap_error_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" }*/ /*JSON{ "type" : "method", "class" : "TypeError", "name" : "toString", "generate" : "jswrap_error_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" }*/ /*JSON{ "type" : "method", "class" : "InternalError", "name" : "toString", "generate" : "jswrap_error_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" }*/ /*JSON{ "type" : "method", "class" : "ReferenceError", "name" : "toString", "generate" : "jswrap_error_toString", - "return" : ["JsVar","A String"] + "return" : ["JsVar","A String"], + "typescript" : "toString(): string;" }*/ JsVar *jswrap_error_toString(JsVar *parent) { JsVar *str = jsvObjectGetChild(parent, "type", 0); From 889d4711e8c53f9ab46a21d9d308211f1b28570e Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:32:43 +0200 Subject: [PATCH 0217/1183] TypeScript: set return type to void if none is specified (Used to be any) --- scripts/build_types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index c5bb5dc68f..0b62faece8 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -150,7 +150,7 @@ function getArguments(method) { function getReturnType(method) { if ("return_object" in method) return getBasicType(method.return_object); if ("return" in method) return getBasicType(method.return[0]); - return "any"; + return "void"; } /** From 695de55e1997c995eeca68066927c971a290eee8 Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:58:02 +0200 Subject: [PATCH 0218/1183] TypeScript: replace String with string --- scripts/build_types.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/build_types.js b/scripts/build_types.js index 0b62faece8..39a1d3159f 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -106,6 +106,7 @@ function getBasicType(type) { if (!type) return "any"; if (["int", "float", "int32"].includes(type)) return "number"; if (type == "pin") return "Pin"; + if (type == "String") return "string"; if (type == "bool") return "boolean"; if (type == "JsVarArray") return "any"; if (type == "JsVar") return "any"; From 35391021048a46085cce3a85ba560f63162c9270 Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 19:58:17 +0200 Subject: [PATCH 0219/1183] =?UTF-8?q?TypeScript:=20add=20=E2=80=98static?= =?UTF-8?q?=E2=80=99=20to=20all=20static=20method=20overloads?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_types.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 39a1d3159f..ec4119bf9f 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -345,10 +345,13 @@ function getClassDeclarations(classes) { .concat([c.cons]) .filter((property) => property) .map((property) => - `${getDocumentation(property)}\nstatic ${getDeclaration( + `${getDocumentation(property)}\n${getDeclaration( property, true - )}`.trim() + ) + .split("\n") + .map((dec) => "static " + dec) + .join("\n")}`.trim() ) .join("\n\n") + "\n\n" + From ebdefd2b2101bd9e2ff1426f81122447a0f5719e Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 20:19:47 +0200 Subject: [PATCH 0220/1183] TypeScript: Espruino --- src/jswrap_espruino.c | 136 ++++++++++++++++++++++++++++++++---------- 1 file changed, 104 insertions(+), 32 deletions(-) diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 1ebebcb779..62ad926fb6 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -79,7 +79,8 @@ a Watchdog timer reset. "name" : "errorFlag", "params" : [ ["errorFlags","JsVar","An array of new error flags, as would be returned by `E.getErrorFlags()`. Error flags that were present before won't be reported."] - ] + ], + "typescript" : "on(event: \"errorFlag\", callback: (errorFlags: ErrorFlag[]) => void): void;" } This event is called when an error is created by Espruino itself (rather than JS code) which changes the state of the error flags reported by @@ -191,7 +192,8 @@ int nativeCallGetCType() { ["sig","JsVar","The signature of the call, `returnType (arg1,arg2,...)`. Allowed types are `void`,`bool`,`int`,`double`,`Pin`,`JsVar`"], ["data","JsVar","(Optional) A string containing the function itself. If not supplied then 'addr' is used as an absolute address."] ], - "return" : ["JsVar","The native function"] + "return" : ["JsVar","The native function"], + "typescript" : "nativeCall(addr: number, sig: string, data?: string): any;" } ADVANCED: This is a great way to crash Espruino if you're not sure what you are doing @@ -279,7 +281,8 @@ JsVarFloat jswrap_espruino_clip(JsVarFloat x, JsVarFloat min, JsVarFloat max) { "params" : [ ["arr","JsVar","The array to sum"] ], - "return" : ["float","The sum of the given buffer"] + "return" : ["float","The sum of the given buffer"], + "typescript" : "sum(arr: string | number[] | ArrayBuffer): number;" } Sum the contents of the given Array, String or ArrayBuffer and return the result */ @@ -310,7 +313,8 @@ JsVarFloat jswrap_espruino_sum(JsVar *arr) { ["arr","JsVar","The array to work out the variance for"], ["mean","float","The mean value of the array"] ], - "return" : ["float","The variance of the given buffer"] + "return" : ["float","The variance of the given buffer"], + "typescript" : "variance(arr: string | number[] | ArrayBuffer, mean: number): number;" } Work out the variance of the contents of the given Array, String or ArrayBuffer and return the result. This is equivalent to `v=0;for (i in arr) v+=Math.pow(mean-arr[i],2)` */ @@ -344,7 +348,8 @@ JsVarFloat jswrap_espruino_variance(JsVar *arr, JsVarFloat mean) { ["arr2","JsVar","An array to convolve"], ["offset","int32","The mean value of the array"] ], - "return" : ["float","The variance of the given buffer"] + "return" : ["float","The variance of the given buffer"], + "typescript" : "convolve(arr1: string | number[] | ArrayBuffer, arr2: string | number[] | ArrayBuffer, offset: number): number;" } Convolve arr1 with arr2. This is equivalent to `v=0;for (i in arr1) v+=arr1[i] * arr2[(i+offset) % arr2.length]` */ @@ -477,7 +482,8 @@ short FFT(short int dir,long m,FFTDATATYPE *x,FFTDATATYPE *y) ["arrReal","JsVar","An array of real values"], ["arrImage","JsVar","An array of imaginary values (or if undefined, all values will be taken to be 0)"], ["inverse","bool","Set this to true if you want an inverse FFT - otherwise leave as 0"] - ] + ], + "typescript" : "FFT(arrReal: string | number[] | ArrayBuffer, arrImage?: string | number[] | ArrayBuffer, inverse?: boolean): any;" } Performs a Fast Fourier Transform (FFT) in 32 bit floats on the supplied data and writes it back into the original arrays. Note that if only one array is supplied, the data written back is the modulus of the complex @@ -569,7 +575,8 @@ void jswrap_espruino_FFT(JsVar *arrReal, JsVar *arrImag, bool inverse) { "params" : [ ["timeout","float","The timeout in seconds before a watchdog reset"], ["isAuto","JsVar","If undefined or true, the watchdog is kicked automatically. If not, you must call `E.kickWatchdog()` yourself"] - ] + ], + "typescript" : "enableWatchdog(timeout: number, isAuto?: boolean): void;" } Enable the watchdog timer. This will reset Espruino if it isn't able to return to the idle loop within the timeout. @@ -636,13 +643,23 @@ JsVar *jswrap_espruino_getErrorFlagArray(JsErrorFlags flags) { return arr; } +/*TYPESCRIPT +type ErrorFlag = + | "FIFO_FULL" + | "BUFFER_FULL" + | "CALLBACK" + | "LOW_MEMORY" + | "MEMORY" + | "UART_OVERFLOW"; +*/ /*JSON{ "type" : "staticmethod", "ifndef" : "SAVE_ON_FLASH", "class" : "E", "name" : "getErrorFlags", "generate" : "jswrap_espruino_getErrorFlags", - "return" : ["JsVar","An array of error flags"] + "return" : ["JsVar","An array of error flags"], + "typescript" : "getErrorFlags(): ErrorFlag[]" } Get and reset the error flags. Returns an array that can contain: @@ -665,12 +682,20 @@ JsVar *jswrap_espruino_getErrorFlags() { } +/*TYPESCRIPT +type Flag = + | "deepSleep" + | "pretokenise" + | "unsafeFlash" + | "unsyncFiles"; +*/ /*JSON{ "type" : "staticmethod", "class" : "E", "name" : "getFlags", "generate" : "jsfGetFlags", - "return" : ["JsVar","An object containing flag names and their values"] + "return" : ["JsVar","An object containing flag names and their values"], + "typescript" : "getFlags(): { [key in Flag]: boolean }" } Get Espruino's interpreter flags that control the way it handles your JavaScript code. @@ -686,13 +711,15 @@ Get Espruino's interpreter flags that control the way it handles your JavaScript "generate" : "jsfSetFlags", "params" : [ ["flags","JsVar","An object containing flag names and boolean values. You need only specify the flags that you want to change."] - ] + ], + "typescript" : "setFlags(flags: { [key in Flag]?: boolean }): void" } Set the Espruino interpreter flags that control the way it handles your JavaScript code. Run `E.getFlags()` and check its description for a list of available flags and their values. */ +// TODO Improve TypeScript declaration /*JSON{ "type" : "staticmethod", "class" : "E", @@ -703,7 +730,8 @@ Run `E.getFlags()` and check its description for a list of available flags and t ["source","JsVar","The source file/stream that will send content."], ["destination","JsVar","The destination file/stream that will receive content from the source."], ["options","JsVar",["An optional object `{ chunkSize : int=64, end : bool=true, complete : function }`","chunkSize : The amount of data to pipe from source to destination at a time","complete : a function to call when the pipe activity is complete","end : call the 'end' function on the destination when the source is finished"]] - ] + ], + "typescript" : "pipe(source: any, destination: any, options?: { chunkSize?: number, end?: boolean, complete?: () => void }): void" }*/ /*JSON{ @@ -715,7 +743,8 @@ Run `E.getFlags()` and check its description for a list of available flags and t ["str","JsVar","The string to convert to an ArrayBuffer"] ], "return" : ["JsVar","An ArrayBuffer that uses the given string"], - "return_object" : "ArrayBufferView" + "return_object" : "ArrayBufferView", + "typescript" : "toArrayBuffer(str: string): ArrayBuffer;" } Create an ArrayBuffer from the given string. This is done via a reference, not a copy - so it is very fast and memory efficient. @@ -735,7 +764,8 @@ JsVar *jswrap_espruino_toArrayBuffer(JsVar *str) { ["args","JsVarArray","The arguments to convert to a String"] ], "return" : ["JsVar","A String (or `undefined` if a Flat String cannot be created)"], - "return_object" : "String" + "return_object" : "String", + "typescript" : "toString(...args: any[]): string | undefined;" } Returns a 'flat' string representing the data in the arguments, or return `undefined` if a flat string cannot be created. @@ -791,6 +821,16 @@ JsVar *jswrap_espruino_toString(JsVar *args) { return str; } +/*TYPESCRIPT +type Uint8ArrayResolvable = + | number + | string + | Uint8ArrayResolvable[] + | ArrayBuffer + | ArrayBufferView + | { data: Uint8ArrayResolvable, count: number } + | { callback: () => Uint8ArrayResolvable } +*/ /*JSON{ "type" : "staticmethod", "class" : "E", @@ -800,7 +840,8 @@ JsVar *jswrap_espruino_toString(JsVar *args) { ["args","JsVarArray","The arguments to convert to a Uint8Array"] ], "return" : ["JsVar","A Uint8Array"], - "return_object" : "Uint8Array" + "return_object" : "Uint8Array", + "typescript" : "toUint8Array(...args: Uint8ArrayResolvable[]): Uint8Array;" } This creates a Uint8Array from the given arguments. These are handled as follows: @@ -917,7 +958,8 @@ JsVar *jswrap_espruino_memoryArea(int addr, int len) { "params" : [ ["code","JsVar","The code to execute (as a string)"], ["alwaysExec","bool","Whether to always execute the code (even after a reset)"] - ] + ], + "typescript" : "setBootCode(code: string, alwaysExec?: boolean): void;" } This writes JavaScript code into Espruino's flash memory, to be executed on startup. It differs from `save()` in that `save()` saves the whole state of @@ -951,7 +993,8 @@ void jswrap_espruino_setBootCode(JsVar *code, bool alwaysExec) { "params" : [ ["options","JsVar","Platform-specific options for setting clock speed"] ], - "return" : ["int","The actual frequency the clock has been set to"] + "return" : ["int","The actual frequency the clock has been set to"], + "typescript" : "setClock(options: number | { M: number, N: number, P: number, Q: number, latency?: number, PCLK?: number, PCLK2?: number }): number;" } This sets the clock frequency of Espruino's processor. It will return `0` if it is unimplemented or the clock speed cannot be changed. @@ -1000,7 +1043,8 @@ int jswrap_espruino_setClock(JsVar *options) { "params" : [ ["device","JsVar",""], ["options","JsVar","(optional) object of options, see below"] - ] + ], + "typescript" : "setConsole(device: \"Serial1\" | \"USB\" | \"Bluetooth\" | \"Telnet\" | \"Terminal\" | Serial | null, options?: { force?: boolean }): void;" } Changes the device that the JS console (otherwise known as the REPL) is attached to. If the console is on a device, that @@ -1060,8 +1104,8 @@ void jswrap_espruino_setConsole(JsVar *deviceVar, JsVar *options) { "class" : "E", "name" : "getConsole", "generate" : "jswrap_espruino_getConsole", - "return" : ["JsVar","The current console device as a string, or just `null` if the console is null"] - + "return" : ["JsVar","The current console device as a string, or just `null` if the console is null"], + "typescript" : "getConsole(): string | null" } Returns the current console device - see `E.setConsole` for more information. */ @@ -1247,8 +1291,15 @@ void jswrap_e_dumpVariables() { "generate" : "jsvDefragment" } BETA: defragment memory! - */ +*/ +/*TYPESCRIPT +type VariableSizeInformation = { + name: string; + size: number; + more?: VariableSizeInformation; +}; +*/ /*JSON{ "type" : "staticmethod", "ifndef" : "SAVE_ON_FLASH", @@ -1259,7 +1310,11 @@ BETA: defragment memory! ["v","JsVar","A variable to get the size of"], ["depth","int","The depth that detail should be provided for. If depth<=0 or undefined, a single integer will be returned"] ], - "return" : ["JsVar","Information about the variable size - see below"] + "return" : ["JsVar","Information about the variable size - see below"], + "typescript" : [ + "getSizeOf(v: any, depth?: 0): number;", + "getSizeOf(v: any, depth: number): VariableSizeInformation;" + ] } Return the number of variable blocks used by the supplied variable. This is useful if you're running out of memory and you want to be able to see what @@ -1361,7 +1416,8 @@ JsVarInt jswrap_espruino_getAddressOf(JsVar *v, bool flatAddress) { ["to","JsVar","An ArrayBuffer to write elements too"], ["map","JsVar","An array or `function(value,index)` to use to map one element to another, or `undefined` to provide no mapping"], ["bits","int","If specified, the number of bits per element (MSB first) - otherwise use a 1:1 mapping. If negative, use LSB first."] - ] + ], + "typescript" : "mapInPlace(from: ArrayBuffer, to: ArrayBuffer, map?: number[] | ((value: number, index: number) => number) | undefined, bits?: number): void;" } Take each element of the `from` array, look it up in `map` (or call `map(value,index)` if it is a function), and write it into the corresponding @@ -1479,7 +1535,11 @@ void jswrap_espruino_mapInPlace(JsVar *from, JsVar *to, JsVar *map, JsVarInt bit ["needle","JsVar","The key to search for"], ["returnKey","bool","If true, return the key, else return the value itself"] ], - "return" : ["JsVar","The value in the Object matching 'needle', or if `returnKey==true` the key's name - or undefined"] + "return" : ["JsVar","The value in the Object matching 'needle', or if `returnKey==true` the key's name - or undefined"], + "typescript" : [ + "lookupNoCase(haystack: any[] | object | Function, needle: string, returnKey?: false): any;", + "lookupNoCase(haystack: any[] | object | Function, needle: T, returnKey: true): T | undefined;" + ] } Search in an Object, Array, or Function */ @@ -1585,7 +1645,11 @@ JsVar *jswrap_espruino_CRC32(JsVar *data) { ["bri","float","The brightness, as a value between 0 and 1"], ["asArray","bool","If true, return an array of [R,G,B] values betwen 0 and 255"] ], - "return" : ["JsVar","A 24 bit number containing bytes representing red, green, and blue `0xBBGGRR`. Or if `asArray` is true, an array `[R,G,B]`"] + "return" : ["JsVar","A 24 bit number containing bytes representing red, green, and blue `0xBBGGRR`. Or if `asArray` is true, an array `[R,G,B]`"], + "typescript" : [ + "HSBtoRGB(hue: number, sat: number, bri: number, asArray?: false): number;", + "HSBtoRGB(hue: number, sat: number, bri: number, asArray: true): [number, number, number];" + ] } Convert hue, saturation and brightness to red, green and blue (packed into an integer if `asArray==false` or an array if `asArray==true`). @@ -1648,7 +1712,8 @@ JsVar *jswrap_espruino_HSBtoRGB(JsVarFloat hue, JsVarFloat sat, JsVarFloat bri, "generate" : "jswrap_espruino_setPassword", "params" : [ ["password","JsVar","The password - max 20 chars"] - ] + ], + "typescript" : "setPassword(password: string): void;" } Set a password on the console (REPL). When powered on, Espruino will then demand a password before the console can be used. If you want to @@ -1718,7 +1783,8 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { "generate" : "jswrap_espruino_setDST", "params" : [ ["params","JsVarArray","An array containing the settings for DST"] - ] + ], + "typescript" : "setDST(dstOffset: number, timezone: number, startDowNumber: number, startDow: number, startMonth: number, startDayOffset: number, startTimeOfDay: number, endDowNumber: number, endDow: number, endMonth: number, endDayOffset: number, endTimeOfDay: number): void" } Set the daylight savings time parameters to be used with `Date` objects. @@ -1770,7 +1836,8 @@ void jswrap_espruino_setDST(JsVar *params) { ["baseAddress","JsVar","The base address (added to every address in `registers`)"], ["registers","JsVar","An object containing `{name:address}`"] ], - "return" : ["JsVar","An object where each field is memory-mapped to a register."] + "return" : ["JsVar","An object where each field is memory-mapped to a register."], + "typescript" : "memoryMap(baseAddress: number, registers: { [key in T]: number }): { [key in T]: number };" } Create an object where every field accesses a specific 32 bit address in the microcontroller's memory. This is perfect for accessing on-chip peripherals. @@ -1808,7 +1875,8 @@ JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers) { "params" : [ ["callspec","JsVar","The arguments this assembly takes - eg `void(int)`"], ["assemblycode","JsVarArray","One of more strings of assembler code"] - ] + ], + "typescript" : "asm(callspec: string, ...assemblycode: string[]): any;" } Provide assembly to Espruino. @@ -1832,7 +1900,8 @@ void jswrap_espruino_asm(JsVar *callspec, JsVar *args) { "generate" : "jswrap_espruino_compiledC", "params" : [ ["code","JsVar","A Templated string of C code"] - ] + ], + "typescript": "compiledC(code: string): any;" } Provides the ability to write C code inside your JavaScript file. @@ -1884,7 +1953,8 @@ void jswrap_espruino_reboot() { "generate" : "jswrap_espruino_setUSBHID", "params" : [ ["opts","JsVar","An object containing at least reportDescriptor, an array representing the report descriptor. Pass undefined to disable HID."] - ] + ], + "typescript" : "setUSBHID(opts?: { reportDescriptor: any[] }): void;" } USB HID will only take effect next time you unplug and re-plug your Espruino. If you're disconnecting it from power you'll have to make sure you have `save()`d after calling @@ -1922,7 +1992,8 @@ void jswrap_espruino_setUSBHID(JsVar *arr) { "params" : [ ["data","JsVar","An array of bytes to send as a USB HID packet"] ], - "return" : ["bool","1 on success, 0 on failure"] + "return" : ["bool","1 on success, 0 on failure"], + "typescript" : "sendUSBHID(data: string | ArrayBuffer | number[]): boolean;" } */ bool jswrap_espruino_sendUSBHID(JsVar *arr) { @@ -2054,7 +2125,8 @@ int jswrap_espruino_getRTCPrescaler(bool calibrate) { ["lookup","JsVar","An array containing a mapping of character code -> replacement string"], ["replaceFn","JsVar","If not in lookup, `replaceFn(charCode)` is called and the result used if it's a function, *or* if it's a string, the string value is used"] ], - "return" : ["JsVar","A string containing all UTF8 sequences flattened to 8 bits"] + "return" : ["JsVar","A string containing all UTF8 sequences flattened to 8 bits"], + "typescript" : "decodeUTF8(str: string, lookup: string[], replaceFn: string | ((charCode: number) => string)): string;" } Decode a UTF8 string. From c56a798d70d0b4c2aeab0d92368547b3e223a30e Mon Sep 17 00:00:00 2001 From: qucchia Date: Tue, 26 Jul 2022 23:37:43 +0200 Subject: [PATCH 0221/1183] TypeScript: Storage --- src/jswrap_storage.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/jswrap_storage.c b/src/jswrap_storage.c index e6420bf327..1698e2be5a 100644 --- a/src/jswrap_storage.c +++ b/src/jswrap_storage.c @@ -86,7 +86,8 @@ void jswrap_storage_eraseAll() { "generate" : "jswrap_storage_erase", "params" : [ ["name","JsVar","The filename - max 28 characters (case sensitive)"] - ] + ], + "typescript" : "erase(name: string): void;" } Erase a single file from the flash storage area. @@ -107,7 +108,8 @@ void jswrap_storage_erase(JsVar *name) { ["offset","int","(optional) The offset in bytes to start from"], ["length","int","(optional) The length to read in bytes (if <=0, the entire file is read)"] ], - "return" : ["JsVar","A string of data, or `undefined` if the file is not found"] + "return" : ["JsVar","A string of data, or `undefined` if the file is not found"], + "typescript" : "read(name: string, offset?: number, length?: number): string | undefined;" } Read a file from the flash storage area that has been written with `require("Storage").write(...)`. @@ -138,7 +140,8 @@ JsVar *jswrap_storage_read(JsVar *name, int offset, int length) { ["name","JsVar","The filename - max 28 characters (case sensitive)"], ["noExceptions","bool","If true and the JSON is not valid, just return `undefined` - otherwise an `Exception` is thrown"] ], - "return" : ["JsVar","An object containing parsed JSON from the file, or undefined"] + "return" : ["JsVar","An object containing parsed JSON from the file, or undefined"], + "typescript" : "readJSON(name: string, noExceptions: boolean): any;" } Read a file from the flash storage area that has been written with `require("Storage").write(...)`, @@ -172,7 +175,8 @@ JsVar *jswrap_storage_readJSON(JsVar *name, bool noExceptions) { "params" : [ ["name","JsVar","The filename - max 28 characters (case sensitive)"] ], - "return" : ["JsVar","An ArrayBuffer containing data from the file, or undefined"] + "return" : ["JsVar","An ArrayBuffer containing data from the file, or undefined"], + "typescript" : "readArrayBuffer(name: string): ArrayBuffer | undefined;" } Read a file from the flash storage area that has been written with `require("Storage").write(...)`, @@ -205,7 +209,8 @@ JsVar *jswrap_storage_readArrayBuffer(JsVar *name) { ["offset","int","[optional] The offset within the file to write"], ["size","int","[optional] The size of the file (if a file is to be created that is bigger than the data)"] ], - "return" : ["bool","True on success, false on failure"] + "return" : ["bool","True on success, false on failure"], + "typescript" : "write(name: string | ArrayBuffer | ArrayBufferView | number[] | object, data: any, offset?: number, size?: number): boolean;" } Write/create a file in the flash storage area. This is nonvolatile and will not disappear when the device resets @@ -268,7 +273,8 @@ bool jswrap_storage_write(JsVar *name, JsVar *data, JsVarInt offset, JsVarInt _s ["name","JsVar","The filename - max 28 characters (case sensitive)"], ["data","JsVar","The JSON data to write"] ], - "return" : ["bool","True on success, false on failure"] + "return" : ["bool","True on success, false on failure"], + "typescript" : "writeJSON(name: string, data: any): boolean;" } Write/create a file in the flash storage area. This is nonvolatile and will not disappear when the device resets @@ -298,7 +304,8 @@ bool jswrap_storage_writeJSON(JsVar *name, JsVar *data) { ["regex","JsVar","(optional) If supplied, filenames are checked against this regular expression (with `String.match(regexp)`) to see if they match before being returned"], ["filter","JsVar","(optional) If supplied, File Types are filtered based on this: `{sf:true}` or `{sf:false}` for whether to show StorageFile"] ], - "return" : ["JsVar","An array of filenames"] + "return" : ["JsVar","An array of filenames"], + "typescript" : "list(regex?: RegExp, filter?: { sf: boolean }): string[];" } List all files in the flash storage area. An array of Strings is returned. @@ -343,7 +350,8 @@ JsVar *jswrap_storage_list(JsVar *regex, JsVar *filter) { "params" : [ ["regex","JsVar","(optional) If supplied, filenames are checked against this regular expression (with `String.match(regexp)`) to see if they match before being hashed"] ], - "return" : ["int","A hash of the files matching"] + "return" : ["int","A hash of the files matching"], + "typescript" : "hash(regex: RegExp): number;" } List all files in the flash storage area matching the specfied regex (ignores StorageFiles), and then hash their filenames *and* file locations. @@ -487,7 +495,8 @@ void jswrap_storage_optimise() { ["mode","JsVar","The open mode - must be either `'r'` for read,`'w'` for write , or `'a'` for append"] ], "return" : ["JsVar","An object containing {read,write,erase}"], - "return_object" : "StorageFile" + "return_object" : "StorageFile", + "typescript" : "open(name: string, mode: \"r\" | \"w\" | \"a\"): StorageFile;" } Open a file in the Storage area. This can be used for appending data (normal read/write operations only write the entire file). @@ -818,7 +827,8 @@ int jswrap_storagefile_getLength(JsVar *f) { "generate" : "jswrap_storagefile_write", "params" : [ ["data","JsVar","The data to write. This should not include `'\\xFF'` (character code 255)"] - ] + ], + "typescript" : "write(data: string): void;" } Append the given data to a file. You should not attempt to append `"\xFF"` (character code 255). */ From cc428a98ad3a649f10c533b3636dd6c2df27d580 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 09:25:01 +0200 Subject: [PATCH 0222/1183] TypeScript: Fix ArrayBuffer --- scripts/build_types.js | 140 ++++++++++++++++++++++----------------- src/jswrap_arraybuffer.c | 68 ++++++++++++++----- 2 files changed, 131 insertions(+), 77 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index ec4119bf9f..b632c540ae 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -294,6 +294,85 @@ function getTypeDeclarations(types) { ); } +/** + * Get the declaration of a builtin class, that is, that exists in + * vanilla JavaScript, e.g. String, Array. + * @param {string} name - The class's name. + * @param {object} c - The class's data. + * @returns {string} The class's declaration. + */ +function getBuiltinClassDeclaration(name, c) { + return ( + `interface ${name}Constructor {\n` + + indent( + c.staticProperties + .concat([c.cons]) + .filter((property) => property) + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .join("\n\n") + ) + + `\n}\n\n` + + (name.endsWith("Array") && !name.startsWith("Array") // is a typed array? + ? `type ${name} = ArrayBufferView<${name}>;\n` + : `${c.object?.typescript || "interface " + name} {\n` + + indent( + c.prototype + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .concat(name === "Array" ? ["[index: number]: T"] : []) + .join("\n\n") + ) + + `\n}\n\n${getDocumentation(c.object)}`) + + `\ndeclare const ${name}: ${name}Constructor` + ); +} + +/** + * Get the declaration of a class that is not builtin. + * @param {string} name - The class's name. + * @param {object} c - The class's data. + * @returns {string} The class's declaration. + */ +function getOtherClassDeclaration(name, c) { + return ( + `${getDocumentation(c.object)}\ndeclare class ${ + c.object?.typescript || name + } {\n` + + indent( + c.staticProperties + .concat([c.cons]) + .filter((property) => property) + .map((property) => + `${getDocumentation(property)}\n${getDeclaration(property, true) + .split("\n") + .map((dec) => "static " + dec) + .join("\n")}`.trim() + ) + .join("\n\n") + + "\n\n" + + c.prototype + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + true + )}`.trim() + ) + .concat(name === "ArrayBufferView" ? ["[index: number]: number"] : []) + .join("\n\n") + ) + + "\n}" + ); +} + /** * Return the class declarations (not including libraries). * @param {object} classes - The object of classes (see `getClasses`). @@ -306,65 +385,8 @@ function getClassDeclarations(classes) { .filter(([_, c]) => !c.library) .map(([name, c]) => name in global - ? // builtin class (String, Boolean, etc) - `interface ${name}Constructor {\n` + - indent( - c.staticProperties - .concat([c.cons]) - .filter((property) => property) - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") - ) + - `\n}\n\n` + - (name.endsWith("Array") && !name.startsWith("Array") - ? `type ${name} = ArrayBufferView<${name}>;\n` - : `${c.object?.typescript || "interface " + name} {\n` + - indent( - c.prototype - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") - ) + - `\n}\n\n${getDocumentation(c.object)}`) + - `\ndeclare const ${name}: ${name}Constructor` - : // other class - `${getDocumentation(c.object)}\ndeclare class ${ - c.object?.typescript || name - } {\n` + - indent( - c.staticProperties - .concat([c.cons]) - .filter((property) => property) - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - ) - .split("\n") - .map((dec) => "static " + dec) - .join("\n")}`.trim() - ) - .join("\n\n") + - "\n\n" + - c.prototype - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") - ) + - "\n}" + ? getBuiltinClassDeclaration(name, c) + : getOtherClassDeclaration(name, c) ) .join("\n\n") ); diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index 48b50af4ed..049b9daff5 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -24,14 +24,6 @@ interface ArrayLike { readonly length: number; readonly [n: number]: T; } - -type TypedArrayConstructor = ((length: number) => T) & - ((array: ArrayLike) => T) & - (( - buffer: ArrayBuffer, - byteOffset?: number, - length?: number - ) => T); */ /*JSON{ @@ -269,7 +261,11 @@ The length, in bytes, of the `ArrayBuffer` ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Uint8Array;", + "new(array: ArrayLike): Uint8Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -285,7 +281,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Uint8ClampedArray;", + "new(array: ArrayLike): Uint8ClampedArray;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8ClampedArray;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. @@ -303,7 +303,11 @@ Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Int8Array;", + "new(array: ArrayLike): Int8Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -319,7 +323,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Uint16Array;", + "new(array: ArrayLike): Uint16Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -335,7 +343,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Int16Array;", + "new(array: ArrayLike): Int16Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -352,7 +364,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Uint24Array;", + "new(array: ArrayLike): Uint24Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint24Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -368,7 +384,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Uint32Array;", + "new(array: ArrayLike): Uint32Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -384,7 +404,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Int32Array;", + "new(array: ArrayLike): Int32Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -400,7 +424,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Float32Array;", + "new(array: ArrayLike): Float32Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ @@ -416,7 +444,11 @@ Create a typed array based on the given input. Either an existing Array Buffer, ], "return" : ["JsVar","A typed array"], "return_object" : "ArrayBufferView", - "typescript" : "new: TypedArrayConstructor;" + "typescript" : [ + "new(length: number): Float64Array;", + "new(array: ArrayLike): Float64Array;", + "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;" + ] } Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ From 4268e697e2581527b89c3f91a7b85d5afe251b5c Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 09:27:04 +0200 Subject: [PATCH 0223/1183] TypeScript: Pixl --- libs/pixljs/jswrap_pixljs.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/libs/pixljs/jswrap_pixljs.c b/libs/pixljs/jswrap_pixljs.c index ef180543de..d0b5117e0c 100644 --- a/libs/pixljs/jswrap_pixljs.c +++ b/libs/pixljs/jswrap_pixljs.c @@ -488,7 +488,8 @@ bool jswrap_pixljs_idle() { "params" : [ ["menu","JsVar","An object containing name->function mappings to to be used in a menu"] ], - "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ] + "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], + "typescript" : "menu(menu: Menu): MenuInstance;" } Display a menu on Pixl.js's screen, and set up the buttons to navigate through it. @@ -542,11 +543,13 @@ type MenuOptions = { * Object containing data about a menu to pass to `E.showMenu`. *\/ type Menu = { + ""?: MenuOptions; [key: string]: | MenuOptions | (() => void) | MenuBooleanItem | MenuNumberItem + | { value: string; onchange?: () => void } | undefined; }; @@ -569,7 +572,10 @@ type MenuInstance = { ["menu","JsVar","An object containing name->function mappings to to be used in a menu"] ], "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], - "typescript": "showMenu(menu: Menu): MenuInstance;" + "typescript": [ + "showMenu(menu: Menu): MenuInstance;", + "showMenu(): void;" + ] } Display a menu on the screen, and set up the buttons to navigate through it. @@ -623,7 +629,8 @@ See http://www.espruino.com/graphical_menu for more detailed information. ["message","JsVar","A message to display. Can include newlines"], ["title","JsVar","(optional) a title for the message"] ], - "ifdef" : "PIXLJS" + "ifdef" : "PIXLJS", + "typescript" : "showMessage(message: string, title?: string): void;" } A utility function for displaying a full screen message on the screen. @@ -645,7 +652,11 @@ E.showMessage("These are\nLots of\nLines","My Title") ["options","JsVar","(optional) an object of options (see below)"] ], "return" : ["JsVar","A promise that is resolved when 'Ok' is pressed"], - "ifdef" : "PIXLJS" + "ifdef" : "PIXLJS", + "typescript" : [ + "showPrompt(message: string, options?: { title?: string, buttons?: { [key: string]: T } }): Promise;", + "showPrompt(): void;" + ] } Displays a full screen prompt on the screen, with the buttons @@ -691,7 +702,8 @@ The second `options` argument can contain: ["options","JsVar","(optional) a title for the message"] ], "return" : ["JsVar","A promise that is resolved when 'Ok' is pressed"], - "ifdef" : "PIXLJS" + "ifdef" : "PIXLJS", + "typescript" : "showAlert(message?: string, options?: string): Promise;" } Displays a full screen prompt on the screen, with a single 'Ok' button. From 362cdac768819b389056a3a6d4d7a0a9f84d80f4 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 27 Jul 2022 08:27:34 +0100 Subject: [PATCH 0224/1183] docs --- src/jswrap_array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jswrap_array.c b/src/jswrap_array.c index 9fc8dd7e52..7b8f289b07 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -96,7 +96,7 @@ Convert the Array to a string "class" : "Array", "name" : "length", "generate" : "jswrap_object_length", - "return" : ["JsVar","The value of the array"], + "return" : ["JsVar","The length of the array"], "typescript" : "length: number;" } Find the length of the array From f3d137b72de39802cb13d4e83728db022f462b6c Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 10:35:33 +0200 Subject: [PATCH 0225/1183] Allow TYPESCRIPT comments to include additional metadata --- scripts/build_types.js | 35 ++++++++++++++++++++++++++--------- scripts/common.js | 12 +++++++++++- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index b632c540ae..aa36502ba3 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -282,14 +282,18 @@ function getAll(objects) { /** * Return the declarations of custom types. - * @param {string[]} types - The list of types defined in comments. + * @param {object[]} types - The list of types defined in comments. + * Of the form { declaration: string, implementation: string }. * @returns {string} The joined declarations. */ function getTypeDeclarations(types) { return ( "// TYPES\n" + types - .map((type) => type.replace(/\\\//g, "/").replace(/\\\\/g, "\\")) + .filter((type) => !type.class) + .map((type) => + type.declaration.replace(/\\\//g, "/").replace(/\\\\/g, "\\") + ) .join("") ); } @@ -299,9 +303,10 @@ function getTypeDeclarations(types) { * vanilla JavaScript, e.g. String, Array. * @param {string} name - The class's name. * @param {object} c - The class's data. + * @param {object[]} types * @returns {string} The class's declaration. */ -function getBuiltinClassDeclaration(name, c) { +function getBuiltinClassDeclaration(name, c, types) { return ( `interface ${name}Constructor {\n` + indent( @@ -329,6 +334,7 @@ function getBuiltinClassDeclaration(name, c) { )}`.trim() ) .concat(name === "Array" ? ["[index: number]: T"] : []) + .concat(types.map((type) => type.declaration)) .join("\n\n") ) + `\n}\n\n${getDocumentation(c.object)}`) + @@ -340,9 +346,10 @@ function getBuiltinClassDeclaration(name, c) { * Get the declaration of a class that is not builtin. * @param {string} name - The class's name. * @param {object} c - The class's data. + * @param {object[]} types * @returns {string} The class's declaration. */ -function getOtherClassDeclaration(name, c) { +function getOtherClassDeclaration(name, c, types) { return ( `${getDocumentation(c.object)}\ndeclare class ${ c.object?.typescript || name @@ -367,6 +374,7 @@ function getOtherClassDeclaration(name, c) { )}`.trim() ) .concat(name === "ArrayBufferView" ? ["[index: number]: number"] : []) + .concat(types.map((type) => type.declaration)) .join("\n\n") ) + "\n}" @@ -376,17 +384,26 @@ function getOtherClassDeclaration(name, c) { /** * Return the class declarations (not including libraries). * @param {object} classes - The object of classes (see `getClasses`). + * @param {object[]} types * @returns {string} The class declarations. */ -function getClassDeclarations(classes) { +function getClassDeclarations(classes, types) { return ( "\n\n// CLASSES\n\n" + Object.entries(classes) .filter(([_, c]) => !c.library) .map(([name, c]) => name in global - ? getBuiltinClassDeclaration(name, c) - : getOtherClassDeclaration(name, c) + ? getBuiltinClassDeclaration( + name, + c, + types.filter((type) => type.class === name) + ) + : getOtherClassDeclaration( + name, + c, + types.filter((type) => type.class === name) + ) ) .join("\n\n") ); @@ -456,13 +473,13 @@ function getLibraryDeclarations(classes) { function buildTypes() { return new Promise((resolve) => { require("./common.js").readAllWrapperFiles(function (objects, types) { - const [classes, globals] = getAll(objects); + const [classes, globals] = getAll(objects, types); resolve( "// NOTE: This file has been automatically generated.\n\n" + '/// \n\n' + getTypeDeclarations(types) + - getClassDeclarations(classes) + + getClassDeclarations(classes, types) + getGlobalDeclarations(globals) + getLibraryDeclarations(classes) ); diff --git a/scripts/common.js b/scripts/common.js index c21ccebdc5..cd2dcf6b5e 100644 --- a/scripts/common.js +++ b/scripts/common.js @@ -94,7 +94,17 @@ exports.readWrapperFile = function(filename) { var comments = contents.match( /\/\*TYPESCRIPT(?:(?!\*\/).|[\n\r])*\*\//g ); if (comments) comments.forEach(function(comment) { comment = comment.slice(12,-2); - types.push(comment); + var j = {}; + var declaration = comment; + if (comment[0] === "{") { + var endOfJson = comment.indexOf("\n}")+2; + var json = comment.substr(0,endOfJson); + j = new Builtin(JSON.parse(json)); + declaration = comment.substr(endOfJson).trim(); + } + j.declaration = declaration; + j.implementation = filename; + types.push(j); }); return [builtins, types]; } From 3bc538721600c2a1f0288ad25dc0227fdb5fe301 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 10:35:47 +0200 Subject: [PATCH 0226/1183] TypeScript: if a return type is Promise, convert to Promise (Used to be Promise) --- scripts/build_types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index aa36502ba3..13ebfa2403 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -111,7 +111,7 @@ function getBasicType(type) { if (type == "JsVarArray") return "any"; if (type == "JsVar") return "any"; if (type == "Array") return "any[]"; - if (type == "Promise") return "Promise"; + if (type == "Promise") return "Promise"; return type; } From 28cdf48523f5d594a68c6851474c34ba345210bd Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 10:53:17 +0200 Subject: [PATCH 0227/1183] common.js: Give useful information when an error occurs Prints the file name and JSON when an error occurs while parsing it. --- scripts/common.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/common.js b/scripts/common.js index cd2dcf6b5e..b948cfdc15 100644 --- a/scripts/common.js +++ b/scripts/common.js @@ -86,10 +86,16 @@ exports.readWrapperFile = function(filename) { var endOfJson = comment.indexOf("\n}")+2; var json = comment.substr(0,endOfJson); var description = comment.substr(endOfJson).trim(); - var j = new Builtin(JSON.parse(json)); - if (description.length) j.description = description; - j.implementation = filename; - builtins.push(j); + try { + var j = new Builtin(JSON.parse(json)); + if (description.length) j.description = description; + j.implementation = filename; + builtins.push(j); + } catch(e) { + console.log("Error in ", filename); + console.log(json); + console.log(e); + } }); var comments = contents.match( /\/\*TYPESCRIPT(?:(?!\*\/).|[\n\r])*\*\//g ); if (comments) comments.forEach(function(comment) { From 7435ff4a635422a08363d9afd277f60582558965 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 10:54:28 +0200 Subject: [PATCH 0228/1183] TypeScript: Bangle --- libs/banglejs/jswrap_bangle.c | 251 ++++++++++++++++++++++++++++------ 1 file changed, 206 insertions(+), 45 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index c6dddcf2c0..3be4a5f513 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -93,6 +93,12 @@ declare const WIDGETS: { [key: string]: Widget }; } Class containing utility functions for the [Bangle.js Smart Watch](http://www.espruino.com/Bangle.js) */ +/*TYPESCRIPT{ + "class" : "Bangle" +} +static CLOCK: boolean; +static strokes: undefined | { [key: string]: Unistroke }; +*/ /*JSON{ @@ -105,12 +111,22 @@ Class containing utility functions for the [Bangle.js Smart Watch](http://www.es The Bangle.js's vibration motor. */ +/*TYPESCRIPT +type AccelData = { + x: number; + y: number; + z: number; + diff: number; + mag: number; +}; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "accel", "params" : [["xyz","JsVar",""]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript": "on(event: \"accel\", callback: (xyz: AccelData) => void): void;" } Accelerometer data available with `{x,y,z,diff,mag}` object as a parameter. @@ -131,12 +147,21 @@ You can also retrieve the most recent reading with `Bangle.getAccel()`. } Called whenever a step is detected by Bangle.js's pedometer. */ +/*TYPESCRIPT +type HealthStatus = { + movement: number; + steps: number; + bpm: number; + bpmConfidence: number; +}; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "health", "params" : [["info","JsVar","An object containing the last 10 minutes health data"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"health\", callback: (info: HealthStatus) => void): void;" } See `Bangle.getHealthStatus()` for more information. This is used for health tracking to allow Bangle.js to record historical exercise data. @@ -169,12 +194,24 @@ To tweak when this happens, see the `twist*` options in `Bangle.setOptions()` } Is the battery charging or not? */ +/*TYPESCRIPT +type CompassData = { + x: number; + y: number; + z: number; + dx: number; + dy: number; + dz: number; + heading: number; +}; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "mag", "params" : [["xyz","JsVar",""]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"mag\", callback: (xyz: CompassData) => void): void;" } Magnetometer/Compass data available with `{x,y,z,dx,dy,dz,heading}` object as a parameter @@ -195,19 +232,34 @@ You can also retrieve the most recent reading with `Bangle.getCompass()`. ["nmea","JsVar","A string containing the raw NMEA data from the GPS"], ["dataLoss","bool","This is set to true if some lines of GPS data have previously been lost (eg because system was too busy to queue up a GPS-raw event)"] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"GPS-raw\", callback: (nmea: string, dataLoss: boolean) => void): void;" } Raw NMEA GPS / u-blox data messages received as a string To get this event you must turn the GPS on with `Bangle.setGPSPower(1)`. */ +/*TYPESCRIPT +type GPSFix = { + lat: number; + lon: number; + alt: number; + speed: number; + course: number; + time: Date; + satellites: number; + fix: number; + hdop: number +}; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "GPS", "params" : [["fix","JsVar","An object with fix info (see below)"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"GPS\", callback: (fix: GPSFix) => void): void;" } GPS data, as an object. Contains: @@ -239,7 +291,8 @@ with `Bangle.setGPSPower(1)`. "class" : "Bangle", "name" : "HRM", "params" : [["hrm","JsVar","An object with heart rate info (see below)"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"HRM\", callback: (hrm: { bpm: number, confidence: number, raw: Uint8Array }) => void): void;" } Heat rate data, as an object. Contains: @@ -258,7 +311,8 @@ with `Bangle.setHRMPower(1)`. "class" : "Bangle", "name" : "HRM-raw", "params" : [["hrm","JsVar","A object containing instant readings from the heart rate sensor"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"HRM-raw\", callback: (hrm: { raw: number, filt: number, bpm: number, confidence: number }) => void): void;" } Called when heart rate sensor data is available - see `Bangle.setHRMPower(1)`. @@ -272,12 +326,20 @@ Called when heart rate sensor data is available - see `Bangle.setHRMPower(1)`. } ``` */ +/*TYPESCRIPT +type PressureData = { + temperature: number; + pressure: number; + altitude: number; +} +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "pressure", "params" : [["e","JsVar","An object containing `{temperature,pressure,altitude}`"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"pressure\", callback: (e: PressureData) => void): void;" } When `Bangle.setBarometerPower(true)` is called, this event is fired containing barometer readings. @@ -301,12 +363,16 @@ Has the screen been turned on or off? Can be used to stop tasks that are no long } Has the screen been locked? Also see `Bangle.isLocked()` */ +/*TYPESCRIPT +type TapAxis = -2 | -1 | 0 | 1 | 2; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "tap", "params" : [["data","JsVar","`{dir, double, x, y, z}`"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"tap\", callback: (data: { dir: \"left\" | \"right\" | \"top\" | \"bottom\" | \"front\" | \"back\", double: boolean, x: TapAxis, y: TapAxis, z: TapAxis }) => void): void;" } If the watch is tapped, this event contains information on the way it was tapped. @@ -326,7 +392,8 @@ If the watch is tapped, this event contains information on the way it was tapped "class" : "Bangle", "name" : "gesture", "params" : [["xyz","JsVar","An Int8Array of XYZXYZXYZ data"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"gesture\", callback: (xyz: Int8Array) => void): void;" } Emitted when a 'gesture' (fast movement) is detected */ @@ -336,7 +403,8 @@ Emitted when a 'gesture' (fast movement) is detected "name" : "aiGesture", "params" : [["gesture","JsVar","The name of the gesture (if '.tfnames' exists, or the index. 'undefined' if not matching"], ["weights","JsVar","An array of floating point values output by the model"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"aiGesture\", callback: (gesture: string | undefined, weights: number[]) => void): void;" } Emitted when a 'gesture' (fast movement) is detected, and a Tensorflow model is in storage in the `".tfmodel"` file. @@ -344,18 +412,25 @@ storage in the `".tfmodel"` file. If a `".tfnames"` file is specified as a comma-separated list of names, it will be used to decode `gesture` from a number into a string. */ +/*TYPESCRIPT +type SwipeCallback = (directionLR: -1 | 0 | 1, directionUD?: -1 | 0 | 1) => void; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "swipe", "params" : [["directionLR","int","`-1` for left, `1` for right, `0` for up/down"], ["directionUD","int","`-1` for up, `1` for down, `0` for left/right (Bangle.js 2 only)"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"swipe\", callback: SwipeCallback): void;" } Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down) Bangle.js 1 is only capable of detecting left/right swipes as it only contains a 2 zone touchscreen. */ +/*TYPESCRIPT +type TouchCallback = (button: number, xy?: { x: number, y: number }) => void; +*/ /*JSON{ "type" : "event", "class" : "Bangle", @@ -364,16 +439,27 @@ Bangle.js 1 is only capable of detecting left/right swipes as it only contains a ["button","int","`1` for left, `2` for right"], ["xy","JsVar","Object of form `{x,y}` containing touch coordinates (if the device supports full touch). Clipped to 0..175 (LCD pixel coordinates) on firmware 2v13 and later."] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"touch\", callback: TouchCallback): void;" } Emitted when the touchscreen is pressed */ +/*TYPESCRIPT +type DragCallback = (event: { + x: number; + y: number; + dx: number; + dy: number; + b: 1 | 0; +}) => void; +*/ /*JSON{ "type" : "event", "class" : "Bangle", "name" : "drag", "params" : [["event","JsVar","Object of form `{x,y,dx,dy,b}` containing touch coordinates, difference in touch coordinates, and an integer `b` containing number of touch points (currently 1 or 0)"]], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "on(event: \"drag\", callback: DragCallback): void;" } Emitted when the touchscreen is dragged or released @@ -388,7 +474,8 @@ or smaller than 0. Coordinates from the `touch` event are clipped. "class" : "Bangle", "name" : "stroke", "params" : [["event","JsVar","Object of form `{xy:Uint8Array([x1,y1,x2,y2...])}` containing touch coordinates"]], - "ifdef" : "BANGLEJS2" + "ifdef" : "BANGLEJS2", + "typescript" : "on(event: \"stroke\", callback: (event: { xy: Uint8Array, stroke?: string }) => void): void;" } Emitted when the touchscreen is dragged for a large enough distance to count as a gesture. @@ -1811,6 +1898,13 @@ void jswrap_banglejs_setLCDBrightness(JsVarFloat v) { jswrap_banglejs_setLCDPowerBacklight(1); } +/*TYPESCRIPT +type LCDMode = + | "direct" + | "doublebuffered" + | "120x120" + | "80x80" +*/ /*JSON{ "type" : "staticmethod", "class" : "Bangle", @@ -1819,7 +1913,8 @@ void jswrap_banglejs_setLCDBrightness(JsVarFloat v) { "params" : [ ["mode","JsVar","The LCD mode (See below)"] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setLCDMode(mode?: LCDMode): void;" } This function can be used to change the way graphics is handled on Bangle.js. @@ -1906,7 +2001,8 @@ void jswrap_banglejs_setLCDMode(JsVar *mode) { "name" : "getLCDMode", "generate" : "jswrap_banglejs_getLCDMode", "return" : ["JsVar","The LCD mode as a String"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getLCDMode(): LCDMode;" } The current LCD mode. @@ -2011,6 +2107,27 @@ void jswrap_banglejs_setPollInterval(JsVarFloat interval) { jswrap_banglejs_setPollInterval_internal((uint16_t)interval); } +/*TYPESCRIPT +type BangleOptions = { + wakeOnBTN1: boolean; + wakeOnBTN2: boolean; + wakeOnBTN3: boolean; + wakeOnFaceUp: boolean; + wakeOnTouch: boolean; + wakeOnTwist: boolean; + twistThreshold: number; + twistMaxY: number; + twistTimeout: number; + gestureStartThresh: number; + gestureEndThresh: number; + gestureInactiveCount: number; + gestureMinLength: number; + powerSave: boolean; + lockTimeout: number; + lcdPowerTimeout: number; + backlightTimeout: number; +}; +*/ /*JSON{ "type" : "staticmethod", "class" : "Bangle", @@ -2019,7 +2136,8 @@ void jswrap_banglejs_setPollInterval(JsVarFloat interval) { "params" : [ ["options","JsVar",""] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setOptions(options: { [key in keyof BangleOptions]?: BangleOptions[key] }): void;" } Set internal options used for gestures, etc... @@ -2122,7 +2240,8 @@ void jswrap_banglejs_setOptions(JsVar *options) { "name" : "getOptions", "generate" : "jswrap_banglejs_getOptions", "return" : ["JsVar","The current state of all options"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getOptions(): BangleOptions;" } Return the current state of options as set by `Bangle.setOptions` */ @@ -2294,7 +2413,8 @@ void jswrap_banglejs_lcdWr(JsVarInt cmd, JsVar *data) { ["appID","JsVar","A string with the app's name in, used to ensure one app can't turn off something another app is using"] ], "return" : ["bool","Is HRM on?"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setHRMPower(isOn: boolean, appID: string): boolean;" } Set the power to the Heart rate monitor @@ -2366,7 +2486,8 @@ void gpsClearLine() { ["appID","JsVar","A string with the app's name in, used to ensure one app can't turn off something another app is using"] ], "return" : ["bool","Is the GPS on?"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setGPSPower(isOn: boolean, appID: string): boolean;" } Set the power to the GPS. @@ -2429,7 +2550,8 @@ int jswrap_banglejs_isGPSOn() { "name" : "getGPSFix", "generate" : "jswrap_banglejs_getGPSFix", "return" : ["JsVar","A GPS fix object with `{lat,lon,...}`"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getGPSFix(): GPSFix;" } Get the last available GPS fix info (or `undefined` if GPS is off). @@ -2454,7 +2576,8 @@ JsVar *jswrap_banglejs_getGPSFix() { ["appID","JsVar","A string with the app's name in, used to ensure one app can't turn off something another app is using"] ], "return" : ["bool","Is the Compass on?"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setCompassPower(isOn: boolean, appID: string): boolean;" } Set the power to the Compass @@ -2549,7 +2672,8 @@ void jswrap_banglejs_resetCompass() { ["appID","JsVar","A string with the app's name in, used to ensure one app can't turn off something another app is using"] ], "return" : ["bool","Is the Barometer on?"], - "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)" + "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", + "typescript" : "setBarometerPower(isOn: boolean, appID: string): boolean;" } Set the power to the barometer IC. Once enbled, `Bangle.pressure` events are fired each time a new barometer reading is available. @@ -2679,7 +2803,8 @@ void jswrap_banglejs_setStepCount(JsVarInt count) { "name" : "getCompass", "generate" : "jswrap_banglejs_getCompass", "return" : ["JsVar","An object containing magnetometer readings (as below)"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getCompass(): CompassData;" } Get the most recent Magnetometer/Compass reading. Data is in the same format as the `Bangle.on('mag',` event. @@ -2726,7 +2851,8 @@ JsVar *jswrap_banglejs_getCompass() { "name" : "getAccel", "generate" : "jswrap_banglejs_getAccel", "return" : ["JsVar","An object containing accelerometer readings (as below)"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getAccel(): AccelData & { td: number };" } Get the most recent accelerometer reading. Data is in the same format as the `Bangle.on('accel',` event. @@ -2758,7 +2884,8 @@ JsVar *jswrap_banglejs_getAccel() { "params" : [ ["range","JsVar","What time period to return data for, see below:"] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getHealthStatus(range?: \"current\" | \"last\" | \"day\"): HealthStatus;" } `range` is one of: @@ -3908,6 +4035,7 @@ modifies beep & buzz behaviour accordingly (the bootloader doesn't need to do it). */ +// TODO Improve TypeScript declaration /*JSON{ "type" : "staticmethod", "class" : "Bangle", @@ -3984,7 +4112,11 @@ void jswrap_banglejs_accelWr(JsVarInt reg, JsVarInt data) { ["cnt","int","If specified, returns an array of the given length (max 128). If not (or 0) it returns a number"] ], "return" : ["JsVar",""], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : [ + "accelRd(reg: number, cnt?: 0): number;", + "accelRd(reg: number, cnt: number): number[];" + ] } Reads a register from the accelerometer @@ -4030,7 +4162,11 @@ void jswrap_banglejs_barometerWr(JsVarInt reg, JsVarInt data) { ["cnt","int","If specified, returns an array of the given length (max 128). If not (or 0) it returns a number"] ], "return" : ["JsVar",""], - "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)" + "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", + "typescript" : [ + "barometerRd(reg: number, cnt?: 0): number;", + "barometerRd(reg: number, cnt: number): number[];" + ] } Reads a register from the barometer IC */ @@ -4072,7 +4208,11 @@ void jswrap_banglejs_compassWr(JsVarInt reg, JsVarInt data) { ["cnt","int","If specified, returns an array of the given length (max 128). If not (or 0) it returns a number"] ], "return" : ["JsVar",""], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : [ + "compassRd(reg: number, cnt?: 0): number;", + "compassRd(reg: number, cnt: number): number[];" + ] } Read a register on the Magnetometer/Compass */ @@ -4113,7 +4253,11 @@ void jswrap_banglejs_hrmWr(JsVarInt reg, JsVarInt data) { ["cnt","int","If specified, returns an array of the given length (max 128). If not (or 0) it returns a number"] ], "return" : ["JsVar",""], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : [ + "hrmRd(reg: number, cnt?: 0): number;", + "hrmRd(reg: number, cnt: number): number[];" + ] } Read a register on the Heart rate monitor */ @@ -4157,7 +4301,8 @@ void jswrap_banglejs_ioWr(JsVarInt mask, bool on) { "name" : "getPressure", "generate" : "jswrap_banglejs_getPressure", "return" : ["JsVar","A promise that will be resolved with `{temperature, pressure, altitude}`"], - "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)" + "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", + "typescript" : "getPressure(): PressureData;" } Read temperature, pressure and altitude data. A promise is returned which will be resolved with `{temperature, pressure, altitude}`. @@ -4365,7 +4510,8 @@ JsVar *jswrap_banglejs_getPressure() { ["latlong","JsVar","`{lat:..., lon:...}`"] ], "return" : ["JsVar","{x:..., y:...}"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "project(latlong: { lat: number, lon: number }): { x: number, y: number };" } Perform a Spherical [Web Mercator projection](https://en.wikipedia.org/wiki/Web_Mercator_projection) of latitude and longitude into `x` and `y` coordinates, which are roughly @@ -4412,8 +4558,8 @@ static NO_INLINE void _jswrap_banglejs_setVibration() { "name" : "beep", "generate" : "jswrap_banglejs_beep", "params" : [ - ["time","int","Time in ms (default 200)"], - ["freq","int","Frequency in hz (default 4000)"] + ["time","int","[optional] Time in ms (default 200)"], + ["freq","int","[optional] Frequency in hz (default 4000)"] ], "return" : ["JsVar","A promise, completed when beep is finished"], "return_object":"Promise", @@ -4648,7 +4794,8 @@ void jswrap_banglejs_softOff() { "name" : "getLogo", "generate" : "jswrap_banglejs_getLogo", "return" : ["JsVar", "An image to be used with `g.drawImage` (as a String)" ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "getLogo(): string;" } * On platforms with an LCD of >=8bpp this is 222 x 104 x 2 bits @@ -4840,8 +4987,11 @@ to select an application to launch. ["menu","JsVar","An object containing name->function mappings to to be used in a menu"] ], "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], - "typescript": "showMenu(menu: Menu): MenuInstance;", - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript": [ + "showMenu(menu: Menu): MenuInstance;", + "showMenu(): void;" + ] } Display a menu on the screen, and set up the buttons to navigate through it. @@ -4919,7 +5069,8 @@ E.showMenu(menu); ["message","JsVar","A message to display. Can include newlines"], ["options","JsVar","(optional) a title for the message, or an object of options `{title:string, img:image_string}`"] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "showMessage(message: string, title?: string | { title?: string, img?: string }): void;" } A utility function for displaying a full screen message on the screen. @@ -4952,7 +5103,11 @@ E.showMessage("Lots of text will wrap automatically",{ ["options","JsVar","(optional) an object of options (see below)"] ], "return" : ["JsVar","A promise that is resolved when 'Ok' is pressed"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : [ + "showPrompt(message: string, options?: { title?: string, buttons?: { [key: string]: T } }): Promise;", + "showPrompt(): void;" + ] } Displays a full screen prompt on the screen, with the buttons @@ -5005,7 +5160,11 @@ The second `options` argument can contain: ["options","JsVar","An object containing `{ h, c, draw, select }` (see below) "] ], "return" : ["JsVar", "A menu object with `draw()` and `drawItem(itemNo)` functions" ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : [ + "showScroller(options?: { h: number, c: number, draw: (idx: number, rect: { x: number, y: number, w: number, h: number }) => void, select: (idx: number) => void, back?: () => void }): { draw: () => void, drawItem: (itemNo: number) => void };", + "showScroller(): void;" + ] } Display a scrollable menu on the screen, and set up the buttons/touchscreen to navigate through it and select items. @@ -5076,7 +5235,8 @@ To remove the scroller, just call `E.showScroller()` ["options","JsVar","(optional) a title for the message"] ], "return" : ["JsVar","A promise that is resolved when 'Ok' is pressed"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "showAlert(message?: string, options?: string): Promise;" } Displays a full screen prompt on the screen, with a single 'Ok' button. @@ -5139,7 +5299,6 @@ expect an LED, this is an object that behaves like a pin, but which just display a circle on the display */ - /*JSON{ "type" : "staticmethod", "class" : "Bangle", @@ -5149,7 +5308,8 @@ a circle on the display ["type","JsVar","The type of UI input: 'updown', 'leftright', 'clock', 'clockupdown' or undefined to cancel. Can also be an object (see below)"], ["callback","JsVar","A function with one argument which is the direction"] ], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "setUI(type?: \"updown\" | \"leftright\" | \"clock\" | \"clockupdown\" | { mode: \"custom\"; back?: () => void; touch?: TouchCallback; swipe?: SwipeCallback; drag?: DragCallback; btn?: (n: number) => void, clock?: boolean }, callback?: (direction?: -1 | 1) => void): void;" } This puts Bangle.js into the specified UI input mode, and calls the callback provided when there is user input. @@ -5237,7 +5397,8 @@ void jswrap_banglejs_factoryReset() { "name" : "appRect", "generate" : "jswrap_banglejs_appRect", "return" : ["JsVar","An object of the form `{x,y,w,h,x2,y2}`"], - "ifdef" : "BANGLEJS" + "ifdef" : "BANGLEJS", + "typescript" : "appRect: { x: number, y: number, w: number, h: number, x2: number, y2: number };" } Returns the rectangle on the screen that is currently reserved for the app. From 83f1c338ed38d0546463645a16a2fcc4e2c10b13 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 12:51:48 +0200 Subject: [PATCH 0229/1183] TypeScript: Graphics --- libs/banglejs/jswrap_bangle.c | 2 +- libs/graphics/jswrap_graphics.c | 202 +++++++++++++++++++++++++------- 2 files changed, 162 insertions(+), 42 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 3be4a5f513..823560f685 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -75,7 +75,7 @@ #endif /*TYPESCRIPT -declare const g: Graphics; +declare const g: Graphics; type WidgetArea = "tl" | "tr" | "bl" | "br"; type Widget = { diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 8314f84f6b..b6f0e8cc56 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -412,7 +412,8 @@ NO_INLINE void _jswrap_drawImageSimple(JsGraphics *gfx, int xPos, int yPos, GfxD /*JSON{ "type" : "class", - "class" : "Graphics" + "class" : "Graphics", + "typescript" : "Graphics" } This class provides Graphics operations that can be applied to a surface. @@ -454,7 +455,8 @@ a full update of the screen. "type" : "property", "class" : "Graphics", "name" : "buffer", - "return" : ["JsVar","An ArrayBuffer (or not defined on Graphics instances not created with `Graphics.createArrayBuffer`)"] + "return" : ["JsVar","An ArrayBuffer (or not defined on Graphics instances not created with `Graphics.createArrayBuffer`)"], + "typescript" : "buffer: IsBuffer extends true ? ArrayBuffer : undefined" } On Graphics instances with an offscreen buffer, this is an `ArrayBuffer` that provides access to the underlying @@ -527,7 +529,8 @@ void jswrap_graphics_init() { "class" : "Graphics", "name" : "getInstance", "generate" : "jswrap_graphics_getInstance", - "return" : ["JsVar","An instance of `Graphics` or undefined"] + "return" : ["JsVar","An instance of `Graphics` or undefined"], + "typescript" : "getInstance(): Graphics | undefined" } On devices like Pixl.js or HYSTM boards that contain a built-in display this will return an instance of the graphics class that can be used to @@ -562,7 +565,8 @@ static bool isValidBPP(int bpp) { ]] ], "return" : ["JsVar","The new Graphics object"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "createArrayBuffer(width: number, height: number, bpp: number, options?: { zigzag?: boolean, vertical_byte?: boolean, msb?: boolean, color_order?: \"rgb\" | \"rbg\" | \"brg\" | \"bgr\" | \"grb\" | \"gbr\" }): Graphics;" } Create a Graphics object that renders to an Array Buffer. This will have a field called 'buffer' that can get used to get at the buffer itself */ @@ -641,7 +645,8 @@ JsVar *jswrap_graphics_createArrayBuffer(int width, int height, int bpp, JsVar * ["callback","JsVar","A function of the form ```function(x,y,col)``` that is called whenever a pixel needs to be drawn, or an object with: ```{setPixel:function(x,y,col),fillRect:function(x1,y1,x2,y2,col)}```. All arguments are already bounds checked."] ], "return" : ["JsVar","The new Graphics object"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "createCallback(width: number, height: number, bpp: number, callback: ((x: number, y: number, col: number) => void) | { setPixel: (x: number, y: number, col: number) => void; fillRect: (x1: number, y1: number, x2: number, y2: number, col: number) => void }): Graphics;" } Create a Graphics object that renders by calling a JavaScript callback function to draw pixels */ @@ -722,6 +727,18 @@ JsVar *jswrap_graphics_createSDL(int width, int height, int bpp) { #endif +/*TYPESCRIPT +type ImageObject = { + width: number; + height: number; + bpp?: number; + buffer: ArrayBuffer | string; + transparent?: number; + palette?: Uint16Array; +}; + +type Image = string | ImageObject | ArrayBuffer | Graphics; +*/ /*JSON{ "type" : "staticmethod", "class" : "Graphics", @@ -731,7 +748,8 @@ JsVar *jswrap_graphics_createSDL(int width, int height, int bpp) { "params" : [ ["str","JsVar","A String containing a newline-separated image - space is 0, anything else is 1"] ], - "return" : ["JsVar","An Image object that can be used with `Graphics.drawImage`"] + "return" : ["JsVar","An Image object that can be used with `Graphics.drawImage`"], + "typescript" : "createImage(str: string): ImageObject;" } Create a simple Black and White image for use with `Graphics.drawImage`. @@ -887,7 +905,7 @@ JsVar *jswrap_graphics_reset(JsVar *parent) { "name" : "clear", "generate" : "jswrap_graphics_clear", "params" : [ - ["reset","bool","If `true`, resets the state of Graphics to the default (eg. Color, Font, etc) as if calling `Graphics.reset`"] + ["reset","bool","[optional] If `true`, resets the state of Graphics to the default (eg. Color, Font, etc) as if calling `Graphics.reset`"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" @@ -983,7 +1001,11 @@ JsVar *_jswrap_graphics_fillRect_col(JsVar *parent, JsVar *opt, int y1, int x2, ["y2","int32","The bottom Y coordinate"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "fillRect(x1: number, y1: number, x2: number, y2: number): Graphics;", + "fillRect(rect: { x: number, y: number, x2: number, y2: number } | { x: number, y: number, w: number, h: number }): Graphics;" + ] } Fill a rectangular area in the Foreground Color @@ -1009,7 +1031,11 @@ JsVar *jswrap_graphics_fillRect(JsVar *parent, JsVar *opt, int y1, int x2, int y ["y2","int32","The bottom Y coordinate"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "clearRect(x1: number, y1: number, x2: number, y2: number): Graphics;", + "clearRect(rect: { x: number, y: number, x2: number, y2: number } | { x: number, y: number, w: number, h: number }): Graphics;" + ] } Fill a rectangular area in the Background Color @@ -1032,7 +1058,11 @@ JsVar *jswrap_graphics_clearRect(JsVar *parent, JsVar *opt, int y1, int x2, int ["y2","int32","The bottom Y coordinate"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "drawRect(x1: number, y1: number, x2: number, y2: number): Graphics;", + "drawRect(rect: { x: number, y: number, x2: number, y2: number } | { x: number, y: number, w: number, h: number }): Graphics;" + ] } Draw an unfilled rectangle 1px wide in the Foreground Color */ @@ -1177,6 +1207,9 @@ int jswrap_graphics_getPixel(JsVar *parent, int x, int y) { return (int)graphicsGetPixel(&gfx, x, y); } +/*TYPESCRIPT +type ColorResolvable = number | `#${string}`; +*/ /*JSON{ "type" : "method", "class" : "Graphics", @@ -1188,7 +1221,8 @@ int jswrap_graphics_getPixel(JsVar *parent, int x, int y) { ["col","JsVar","The color (if `undefined`, the foreground color is useD)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "setPixel(x: number, y: number, col?: ColorResolvable): Graphics;" } Set a pixel's color */ @@ -1215,7 +1249,11 @@ JsVar *jswrap_graphics_setPixel(JsVar *parent, int x, int y, JsVar *color) { ["g","JsVar","Green (between 0 and 1)"], ["b","JsVar","Blue (between 0 and 1)"] ], - "return" : ["int","The color index represented by the arguments"] + "return" : ["int","The color index represented by the arguments"], + "typescript" : [ + "toColor(r: number, g: number, b: number): number;", + "toColor(col: ColorResolvable): number;" + ] } Work out the color value to be used in the current bit depth based on the arguments. @@ -1377,7 +1415,8 @@ unsigned int jswrap_graphics_toColor(JsVar *parent, JsVar *r, JsVar *g, JsVar *b ["col_b","JsVar","Color to blend to (either a single integer color value, or a string)"], ["amt","JsVar","The amount to blend. 0=col_a, 1=col_b, 0.5=halfway between (and so on)"] ], - "return" : ["int","The color index represented by the blended colors"] + "return" : ["int","The color index represented by the blended colors"], + "typescript" : "blendColor(col_a: ColorResolvable, col_b: ColorResolvable, amt: number): number;" } Blend between two colors, and return the result. @@ -1409,7 +1448,11 @@ unsigned int jswrap_graphics_blendColor(JsVar *parent, JsVar *ca, JsVar *cb, JsV ["b","JsVar","[optional] Blue (between 0 and 1)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "setColor(r: number, g: number, b: number): number;", + "setColor(col: ColorResolvable): number;" + ] } Set the color to use for subsequent drawing operations. @@ -1440,7 +1483,11 @@ be a floating point value, and `g` and `b` are ignored. ["b","JsVar","Blue (between 0 and 1)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "setBgColor(r: number, g: number, b: number): number;", + "setBgColor(col: ColorResolvable): number;" + ] } Set the background color to use for subsequent drawing operations. @@ -1609,7 +1656,8 @@ JsVar *jswrap_graphics_setFontSizeX(JsVar *parent, int size, bool isVectorFont) ["height","int32","The height as an integer (max 255). Bits 8-15 represent the scale factor (eg. `2<<8` is twice the size). Bits 16-23 represent the BPP (0,1=1 bpp, 2=2 bpp, 4=4 bpp)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "setFontCustom(bitmap: ArrayBuffer, firstChar: number, width: number | string, height: number): Graphics;" } Make subsequent calls to `drawString` use a Custom Font of the given height. See the [Fonts page](http://www.espruino.com/Fonts) for more information about custom fonts and how to create them. @@ -1669,7 +1717,8 @@ JsVar *jswrap_graphics_setFontCustom(JsVar *parent, JsVar *bitmap, int firstChar ["rotation","int32","Rotation of the text. 0=normal, 1=90 degrees clockwise, 2=180, 3=270"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "setFontAlign(x: -1 | 0 | 1, y?: -1 | 0 | 1, rotation?: 0 | 1 | 2 | 3): Graphics;" } Set the alignment for subsequent calls to `drawString` */ @@ -1692,6 +1741,36 @@ JsVar *jswrap_graphics_setFontAlign(JsVar *parent, int x, int y, int r) { #endif } +/*TYPESCRIPT +type FontName = + | "4x4" + | "4x4Numeric" + | "4x5" + | "4x5Numeric" + | "4x8Numeric" + | "5x7Numeric7Seg" + | "5x9Numeric7Seg" + | "6x8" + | "6x12" + | "7x11Numeric7Seg" + | "8x12" + | "8x16" + | "Dennis8" + | "Cherry6x10" + | "Copasectic40x58Numeric" + | "Dylex7x13" + | "HaxorNarrow7x17" + | "Sinclair" + | "Teletext10x18Mode7" + | "Teletext5x9Ascii" + | "Teletext5x9Mode7" + | "Vector"; + +type FontNameWithScaleFactor = + | FontName + | `${FontName}:${number}` + | `${FontName}:${number}x${number}`; +*/ /*JSON{ "type" : "method", "class" : "Graphics", @@ -1703,7 +1782,11 @@ JsVar *jswrap_graphics_setFontAlign(JsVar *parent, int x, int y, int r) { ["size","int","The size of the font (or undefined)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : [ + "setFont(name: FontNameWithScaleFactor): Graphics;", + "setFont(name: FontName, size: number): Graphics;" + ] } Set the font by name. Various forms are available: @@ -1798,7 +1881,8 @@ JsVar *jswrap_graphics_setFont(JsVar *parent, JsVar *fontId, int size) { "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_graphics_getFont", "return" : ["JsVar","Get the name of the current font"], - "return_object" : "String" + "return_object" : "String", + "typescript" : "getFont(): FontNameWithScaleFactor | \"Custom\"" } Get the font by name - can be saved and used with `Graphics.setFont`. @@ -1850,7 +1934,8 @@ JsVar *jswrap_graphics_getFont(JsVar *parent) { "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_graphics_getFonts", "return" : ["JsVar","And array of font names"], - "return_object" : "Array" + "return_object" : "Array", + "typescript" : "getFonts(): FontName[];" } Return an array of all fonts currently in the Graphics library. @@ -2036,7 +2121,8 @@ JsVarInt _jswrap_graphics_stringWidth(JsGraphics *gfx, JsVar *var, int lineStart "params" : [ ["str","JsVar","The string"] ], - "return" : ["int","The length of the string in pixels"] + "return" : ["int","The length of the string in pixels"], + "typescript" : "stringWidth(str: string): number;" } Return the size in pixels of a string of text in the current font */ @@ -2053,7 +2139,8 @@ JsVarInt jswrap_graphics_stringWidth(JsVar *parent, JsVar *var) { "params" : [ ["str","JsVar","The string"] ], - "return" : ["JsVar","An object containing `{width,height}` of the string"] + "return" : ["JsVar","An object containing `{width,height}` of the string"], + "typescript" : "stringMetrics(str: string): { width: number, height: number };" } Return the width and height in pixels of a string of text in the current font */ @@ -2078,7 +2165,8 @@ JsVar* jswrap_graphics_stringMetrics(JsVar *parent, JsVar *var) { ["str","JsVar","The string"], ["maxWidth","int","The width in pixels"] ], - "return" : ["JsVar","An array of lines that are all less than `maxWidth`"] + "return" : ["JsVar","An array of lines that are all less than `maxWidth`"], + "typescript" : "wrapString(str: string, maxWidth: number): string[];" } Wrap a string to the given pixel width using the current font, and return the lines as an array. @@ -2187,7 +2275,8 @@ JsVar *jswrap_graphics_wrapString(JsVar *parent, JsVar *str, int maxWidth) { ["solid","bool","For bitmap fonts, should empty pixels be filled with the background color?"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "drawString(str: string, x: number, y: number, solid?: boolean): Graphics;" } Draw a string of text in the current font. @@ -2511,7 +2600,8 @@ JsVar *jswrap_graphics_moveTo(JsVar *parent, int x, int y) { ["closed","bool","Draw another line between the last element of the array and the first"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "drawPoly(poly: number[], closed?: boolean): Graphics;" } Draw a polyline (lines between each of the points in `poly`) in the current foreground color @@ -2528,7 +2618,8 @@ Draw a polyline (lines between each of the points in `poly`) in the current fore ["closed","bool","Draw another line between the last element of the array and the first"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "drawPolyAA(poly: number[], closed?: boolean): Graphics;" } Draw an **antialiased** polyline (lines between each of the points in `poly`) in the current foreground color @@ -2594,7 +2685,8 @@ JsVar *jswrap_graphics_drawPoly_X(JsVar *parent, JsVar *poly, bool closed, bool ["poly","JsVar","An array of vertices, of the form ```[x1,y1,x2,y2,x3,y3,etc]```"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "fillPoly(poly: number[]): Graphics;" } Draw a filled polygon in the current foreground color. @@ -2625,7 +2717,8 @@ same pixels as `drawPoly` (drawing a line around the edge of the polygon). ["poly","JsVar","An array of vertices, of the form ```[x1,y1,x2,y2,x3,y3,etc]```"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "fillPolyAA(poly: number[]): Graphics;" } Draw a filled polygon in the current foreground color. @@ -2692,7 +2785,8 @@ JsVar *jswrap_graphics_fillPoly_X(JsVar *parent, JsVar *poly, bool antiAlias) { ["reflect","bool","Whether to reflect the image"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "setRotation(rotation: 0 | 1 | 2 | 3, reflect?: boolean): Graphics;" } Set the current rotation of the graphics device. */ @@ -2735,7 +2829,8 @@ JsVar *jswrap_graphics_setRotation(JsVar *parent, int rotation, bool reflect) { "params" : [ ["str","JsVar","The string"] ], - "return" : ["JsVar","An object containing `{width,height,bpp,transparent}` for the image"] + "return" : ["JsVar","An object containing `{width,height,bpp,transparent}` for the image"], + "typescript" : "imageMetrics(img: Image): { width: number, height: number, bpp: number, transparent: number, frames?: ArrayBuffer[] } | undefined;" } Return the width and height in pixels of an image (either Graphics, Image Object, Image String or ArrayBuffer). Returns `undefined` if image couldn't be decoded. @@ -2774,7 +2869,8 @@ JsVar *jswrap_graphics_imageMetrics(JsVar *parent, JsVar *var) { ["options","JsVar","options for scaling,rotation,etc (see below)"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "drawImage(image: Image, x: number, y: number, options?: { rotate?: number, scale?: number, frame?: number }): Graphics;" } Image can be: @@ -2989,7 +3085,8 @@ JsVar *jswrap_graphics_drawImage(JsVar *parent, JsVar *image, int xPos, int yPos ["options","JsVar","options for rendering - see below"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "drawImages(layers: { x: number, y: number, image: Image, scale?: number, rotate?: number, center?: boolean, repeat?: boolean, nobounds?: boolean }[], options?: { x: number, y: number, width: number, height: number }): Graphics;" } Draws multiple images *at once* - which avoids flicker on unbuffered systems like Bangle.js. Maximum layer count right now is 4. @@ -3120,7 +3217,11 @@ JsVar *jswrap_graphics_drawImages(JsVar *parent, JsVar *layersVar, JsVar *option "params" : [ ["type","JsVar","The type of image to return. Either `object`/undefined to return an image object, or `string` to return an image string"] ], - "return" : ["JsVar","An Image that can be used with `Graphics.drawImage`"] + "return" : ["JsVar","An Image that can be used with `Graphics.drawImage`"], + "typescript" : [ + "asImage(type?: \"object\"): ImageObject;", + "asImage(type: \"string\"): string;" + ] } Return this Graphics object as an Image that can be used with `Graphics.drawImage`. Check out [the Graphics reference page](http://www.espruino.com/Graphics#images-bitmaps) @@ -3228,7 +3329,8 @@ JsVar *jswrap_graphics_asImage(JsVar *parent, JsVar *imgType) { "params" : [ ["reset","bool","Whether to reset the modified area or not"] ], - "return" : ["JsVar","An object {x1,y1,x2,y2} containing the modified area, or undefined if not modified"] + "return" : ["JsVar","An object {x1,y1,x2,y2} containing the modified area, or undefined if not modified"], + "typescript" : "getModified(reset?: boolean): { x1: number, y1: number, x2: number, y2: number };" } Return the area of the Graphics canvas that has been modified, and optionally clear the modified area to 0. @@ -3298,7 +3400,8 @@ JsVar *jswrap_graphics_scroll(JsVar *parent, int xdir, int ydir) { ["options","JsVar","options - see below"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "blit(options: { x1: number, y1: number, x2: number, y2: number, w: number, h: number, setModified?: boolean }): Graphics;" } Blit one area of the screen (x1,y1 w,h) to another (x2,y2 w,h) @@ -3380,7 +3483,8 @@ JsVar *jswrap_graphics_blit(JsVar *parent, JsVar *options) { "name" : "asBMP", "#if" : "!defined(SAVE_ON_FLASH) && !defined(ESPRUINOBOARD)", "generate" : "jswrap_graphics_asBMP", - "return" : ["JsVar","A String representing the Graphics as a Windows BMP file (or 'undefined' if not possible)"] + "return" : ["JsVar","A String representing the Graphics as a Windows BMP file (or 'undefined' if not possible)"], + "typescript" : "asBMP(): string;" } Create a Windows BMP file from this Graphics instance, and return it as a String. */ @@ -3497,7 +3601,8 @@ JsVar *jswrap_graphics_asBMP(JsVar *parent) { "name" : "asURL", "#if" : "!defined(SAVE_ON_FLASH) && !defined(ESPRUINOBOARD)", "generate" : "jswrap_graphics_asURL", - "return" : ["JsVar","A String representing the Graphics as a URL (or 'undefined' if not possible)"] + "return" : ["JsVar","A String representing the Graphics as a URL (or 'undefined' if not possible)"], + "typescript" : "asURL(): string;" } Create a URL of the form `data:image/bmp;base64,...` that can be pasted into the browser. @@ -3545,7 +3650,8 @@ void jswrap_graphics_dump(JsVar *parent) { ["arr","JsVar","An array of three vertices, six enties in form of ```[x0,y0,x1,y1,x2,y2]```"], ["options","JsVar","number of points to calulate"] ], - "return" : ["JsVar", "Array with calculated points" ] + "return" : ["JsVar", "Array with calculated points" ], + "typescript" : "quadraticBezier(arr: [number, number, number, number, number, number], options?: number): number[];" } Calculate the square area under a Bezier curve. @@ -3617,7 +3723,8 @@ JsVar *jswrap_graphics_quadraticBezier( JsVar *parent, JsVar *arr, JsVar *option ["verts","JsVar","An array of vertices, of the form ```[x1,y1,x2,y2,x3,y3,etc]```"], ["transformation","JsVar","The transformation to apply, either an Object or an Array (see below)"] ], - "return" : ["JsVar", "Array of transformed vertices" ] + "return" : ["JsVar", "Array of transformed vertices" ], + "typescript" : "transformVertices(arr: number[], transformation: { x?: number, y?: number, scale?: number, rotate?: number } | [number, number, number, number, number, number]): number[];" } Transformation can be: @@ -3694,13 +3801,25 @@ JsVar *jswrap_graphics_transformVertices(JsVar *parent, JsVar *verts, JsVar *tra return result; } +/*TYPESCRIPT +type Theme = { + fg: number; + bg: number; + fg2: number; + bg2: number; + fgH: number; + bgH: number; + dark: boolean; +}; +*/ /*JSON{ "type" : "property", "class" : "Graphics", "name" : "theme", "#if" : "!defined(SAVE_ON_FLASH) && !defined(ESPRUINOBOARD)", "generate" : "jswrap_graphics_theme", - "return" : ["JsVar","An object containing the current 'theme' (see below)"] + "return" : ["JsVar","An object containing the current 'theme' (see below)"], + "typescript" : "theme: Theme;" } Returns an object of the form: @@ -3749,7 +3868,8 @@ JsVar *jswrap_graphics_theme(JsVar *parent) { ["theme","JsVar","An object of the form returned by `Graphics.theme`"] ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], - "return_object" : "Graphics" + "return_object" : "Graphics", + "typescript" : "setTheme(theme: { [key in keyof Theme]?: Theme[key] extends number ? ColorResolvable | Theme[key] }): Graphics;" } Set the global colour scheme. On Bangle.js, this is reloaded from `settings.json` for each new app loaded. From ba30e2f018d2823287bab1b6b235a111818a64e8 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 13:31:13 +0200 Subject: [PATCH 0230/1183] Typos --- CONTRIBUTING.md | 4 ++-- boards/RAK5010.py | 2 +- libs/banglejs/jswrap_bangle.c | 12 ++++++------ libs/graphics/jswrap_graphics.c | 10 +++++----- src/jswrap_array.c | 2 +- src/jswrap_arraybuffer.c | 26 +++++++++++++------------- src/jswrap_espruino.c | 18 +++++++++--------- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e34461c1cb..2691de4450 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ Improvements to Documentation are amazingly helpful, and are very rare so hugely ### Functions/Variables -If you want to change something in a [built-in function's documentation](http://www.espruino.com/Reference), look at the heading for the function on that page and there will be a right-arrow (⇒). +If you want to change something in a [built-in function's documentation](http://www.espruino.com/Reference), look at the heading for the function on that page and there will be a right-arrow (⇒). If you click on that it will bring you to the area of Espruino's source code where the function *and the documentation for it* are stored. You can then edit the documentation in that file (above the function) on GitHub and issue a pull request - it's in Markdown format. @@ -56,7 +56,7 @@ Please [see here](http://www.espruino.com/Writing+Modules) * Ensure that you are not contributing someone else's code, and that you are willing to add your code under Espruino's MPL Licence * Make sure that what you do doesn't break the Espruino board or the other boards we build for. We can't check all the boards for every commit, so if you break something you'll annoy a whole bunch of people. * Be aware that Espruino is designed for Microcontrollers - with very low amounts of flash and memory. Both are at a premium so don't statically allocate variables or do other stuff that will use up RAM. -* Don't add a whole bunch of indirection/abstraction for the sake of it - it'll probably just use of more of our precious memory. +* Don't add a whole bunch of indirection/abstraction for the sake of it - it'll probably just use more of our precious memory. * If you add a new API, try and make it familiar to Arduino/JavaScript users. * Please [RUN THE TESTS](tests/README.md) before and after your changes to check that there are no regressions * Finally, please issue us a pull request to [www.github.com/espruino](https://www.github.com/espruino/Espruino) via GitHub. It's way easier for us to incorporate, give credit, and track changes that way. diff --git a/boards/RAK5010.py b/boards/RAK5010.py index 13de731aa5..7a238534c6 100644 --- a/boards/RAK5010.py +++ b/boards/RAK5010.py @@ -43,7 +43,7 @@ 'DEFINES+=-DCONFIG_NFCT_PINS_AS_GPIOS', # Don't use NFC - the pins are used for GPS 'DEFINES += -DNRF_USB=1 -DUSB', # USB only works if connected at startup 'DEFINES+=-DESPR_REGOUT0_1_8V=1', # Force RAK5010 nRF52 voltage regulator to 1.8v, which stops glitches in modem serial comms - 'NRF_SDK15=1' + 'NRF_SDK15=1', 'DEFINES+=-DBLUETOOTH_NAME_PREFIX=\'"iTracker"\'', 'DFU_PRIVATE_KEY=targets/nrf5x_dfu/dfu_private_key.pem', 'DFU_SETTINGS=--application-version 0xff --hw-version 52 --sd-req 0x8C,0x91', diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 3be4a5f513..1ee080bc60 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -1835,7 +1835,7 @@ Bangle.setLCDPower(1); // keep screen on **When on full, the LCD draws roughly 40mA.** You can adjust -When brightness using `Bange.setLCDBrightness`. +When brightness using `Bangle.setLCDBrightness`. */ void jswrap_banglejs_setLCDPower(bool isOn) { #ifdef ESPR_BACKLIGHT_FADE @@ -2147,7 +2147,7 @@ Set internal options used for gestures, etc... * `wakeOnFaceUp` should the LCD turn on when the watch is turned face up? default = `false` * `wakeOnTouch` should the LCD turn on when the touchscreen is pressed? default = `false` * `wakeOnTwist` should the LCD turn on when the watch is twisted? default = `true` -* `twistThreshold` How much acceleration to register a twist of the watch strap? Can be negative for oppsite direction. default = `800` +* `twistThreshold` How much acceleration to register a twist of the watch strap? Can be negative for opposite direction. default = `800` * `twistMaxY` Maximum acceleration in Y to trigger a twist (low Y means watch is facing the right way up). default = `-800` * `twistTimeout` How little time (in ms) must a twist take from low->high acceleration? default = `1000` * `gestureStartThresh` how big a difference before we consider a gesture started? default = `sqr(800)` @@ -2157,7 +2157,7 @@ Set internal options used for gestures, etc... * `powerSave` after a minute of not being moved, Bangle.js will change the accelerometer poll interval down to 800ms (10x accelerometer samples). On movement it'll be raised to the default 80ms. If `Bangle.setPollInterval` is used this is disabled, and for it to work the poll interval must be either 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this automatic power saving, but will **not** change - the poll interval from its current value. If you desire a specific interval (eg the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` + the poll interval from its current value. If you desire a specific interval (e.g. the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` after setting `powerSave:false`. * `lockTimeout` how many milliseconds before the screen locks * `lcdPowerTimeout` how many milliseconds before the screen turns off @@ -2275,7 +2275,7 @@ int jswrap_banglejs_isLCDOn() { "ifdef" : "BANGLEJS" } This function can be used to lock or unlock Bangle.js -(eg whether buttons and touchscreen work or not) +(e.g. whether buttons and touchscreen work or not) */ void jswrap_banglejs_setLocked(bool isLocked) { #if defined(TOUCH_I2C) @@ -2675,7 +2675,7 @@ void jswrap_banglejs_resetCompass() { "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", "typescript" : "setBarometerPower(isOn: boolean, appID: string): boolean;" } -Set the power to the barometer IC. Once enbled, `Bangle.pressure` events +Set the power to the barometer IC. Once enabled, `Bangle.pressure` events are fired each time a new barometer reading is available. When on, the barometer draws roughly 50uA @@ -5327,7 +5327,7 @@ Currently supported interface types are: * 'clockupdown' - called for clocks. Sets `Bangle.CLOCK=1`, allows a button to start the launcher, but also provides up/down functionality * Bangle.js 1 BTN2 starts the launcher, BTN1/BTN3 call `cb(-1)` and `cb(1)` * Bangle.js 2 BTN1 starts the launcher, touchscreen tap in top/bottom right hand side calls `cb(-1)` and `cb(1)` -* `{mode:"custom", ...}` allows you to specify custom handlers for different interations. See below. +* `{mode:"custom", ...}` allows you to specify custom handlers for different interactions. See below. * `undefined` removes all user interaction code While you could use setWatch/etc manually, the benefit here is that you don't end up with multiple `setWatch` instances, and diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 8314f84f6b..6f59fdcf20 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -869,7 +869,7 @@ int jswrap_graphics_getBPP(JsVar *parent) { "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" } -Reset the state of Graphics to the defaults (eg. Color, Font, etc) +Reset the state of Graphics to the defaults (e.g. Color, Font, etc) that would have been used when Graphics was initialised. */ JsVar *jswrap_graphics_reset(JsVar *parent) { @@ -1503,7 +1503,7 @@ JsVarInt jswrap_graphics_getColorX(JsVar *parent, bool isForeground) { This sets the 'clip rect' that subsequent drawing operations are clipped to sit between. -These values are inclusive - eg `g.setClipRect(1,0,5,0)` will ensure that only +These values are inclusive - e.g. `g.setClipRect(1,0,5,0)` will ensure that only pixel rows 1,2,3,4,5 are touched on column 0. **Note:** For maximum flexibility on Bangle.js 1, the values here are not range checked. For normal @@ -2195,7 +2195,7 @@ Draw a string of text in the current font. g.drawString("Hello World", 10, 10); ``` -Images may also be embedded inside strings (eg to render Emoji or characters not in the current font). +Images may also be embedded inside strings (e.g. to render Emoji or characters not in the current font). To do this, just add `0` then the image string ([about Images](http://www.espruino.com/Graphics#images-bitmaps)) For example: @@ -2467,7 +2467,7 @@ JsVar *jswrap_graphics_drawLineAA(JsVar *parent, double x1, double y1, double x2 "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" } -Draw a line from the last position of lineTo or moveTo to this position +Draw a line from the last position of `lineTo` or `moveTo` to this position */ JsVar *jswrap_graphics_lineTo(JsVar *parent, int x, int y) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -3712,7 +3712,7 @@ Returns an object of the form: bg2 : 0x0007, // accented background colour fgH : 0xFFFF, // highlighted foreground colour bgH : 0x02F7, // highlighted background colour - dark : true, // Is background dark (eg. foreground should be a light colour) + dark : true, // Is background dark (e.g. foreground should be a light colour) } ``` diff --git a/src/jswrap_array.c b/src/jswrap_array.c index 8b50d7eb28..bc2f4dfcdf 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -176,7 +176,7 @@ bool jswrap_array_includes(JsVar *arr, JsVar *value, JsVarInt startIdx) { "return" : ["JsVar","A String representing the Joined array"], "typescript" : "join(separator?: string): string;" } -Join all elements of this array together into one string, using 'separator' between them. eg. ```[1,2,3].join(' ')=='1 2 3'``` +Join all elements of this array together into one string, using 'separator' between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` */ JsVar *jswrap_array_join(JsVar *parent, JsVar *filler) { if (!jsvIsIterable(parent)) return 0; diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index 049b9daff5..93a9ea297b 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -267,7 +267,7 @@ The length, in bytes, of the `ArrayBuffer` "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -287,7 +287,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8ClampedArray;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. e.g. after `a[0]=12345;`, `a[0]==255`. */ @@ -309,7 +309,7 @@ Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -329,7 +329,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -349,7 +349,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -370,7 +370,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint24Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -390,7 +390,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -410,7 +410,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -430,7 +430,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ /*JSON{ "type" : "constructor", @@ -450,7 +450,7 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (eg. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. */ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *arr, JsVarInt byteOffset, JsVarInt length) { @@ -558,7 +558,7 @@ void jswrap_arraybufferview_set(JsVar *parent, JsVar *arr, int offset) { return; } // Copy with the case where we copy from one arraybuffer to another but they use the - // same data. If we copy forward (eg `a.set(a.subarray(),1)`) then we + // same data. If we copy forward (e.g. `a.set(a.subarray(),1)`) then we // end up duplicating the same data, so we must copy in reverse. if (jsvIsArrayBuffer(parent) && jsvIsArrayBuffer(arr)) { JsVar *sa = jsvGetArrayBufferBackingString(parent, NULL); @@ -616,7 +616,7 @@ void jswrap_arraybufferview_set(JsVar *parent, JsVar *arr, int offset) { } Return an array which is made from the following: ```A.map(function) = [function(A[0]), function(A[1]), ...]``` - **Note:** This returns an `ArrayBuffer` of the same type it was called on. To get an `Array`, use `Array.map`, eg. `[].map.call(myArray, x=>x+1)` + **Note:** This returns an `ArrayBuffer` of the same type it was called on. To get an `Array`, use `Array.map`, e.g. `[].map.call(myArray, x=>x+1)` */ JsVar *jswrap_arraybufferview_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { if (!jsvIsArrayBuffer(parent)) { @@ -761,7 +761,7 @@ Return `true` if the array includes the value, `false` otherwise "return" : ["JsVar","A String representing the Joined array"], "typescript" : "join(separator?: string): string;" } -Join all elements of this array together into one string, using 'separator' between them. eg. ```[1,2,3].join(' ')=='1 2 3'``` +Join all elements of this array together into one string, using 'separator' between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` */ /*JSON{ "type" : "method", diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 62ad926fb6..7459def049 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -197,7 +197,7 @@ int nativeCallGetCType() { } ADVANCED: This is a great way to crash Espruino if you're not sure what you are doing -Create a native function that executes the code at the given address. Eg. `E.nativeCall(0x08012345,'double (double,double)')(1.1, 2.2)` +Create a native function that executes the code at the given address, e.g. `E.nativeCall(0x08012345,'double (double,double)')(1.1, 2.2)` If you're executing a thumb function, you'll almost certainly need to set the bottom bit of the address to 1. @@ -846,7 +846,7 @@ type Uint8ArrayResolvable = This creates a Uint8Array from the given arguments. These are handled as follows: * `Number` -> read as an integer, using the lowest 8 bits - * `String` -> use each character's numeric value (eg. `String.charCodeAt(...)`) + * `String` -> use each character's numeric value (e.g. `String.charCodeAt(...)`) * `Array` -> Call itself on each element * `ArrayBuffer` or Typed Array -> use the lowest 8 bits of each element * `Object`: @@ -1021,7 +1021,7 @@ The Pico's default is `{M:8, N:336, P:4, Q:7, PCLK1:2, PCLK2:4}`, use while keeping the peripherals running at the same speed (omitting PCLK1/2 will lead to the peripherals changing speed too). -On STM32F4 boards (eg. Espruino Pico), the USB clock needs to be kept at 48Mhz +On STM32F4 boards (e.g. Espruino Pico), the USB clock needs to be kept at 48Mhz or USB will fail to work. You'll also experience USB instability if the processor clock falls much below 48Mhz. @@ -1065,7 +1065,7 @@ any other *hardware* `Serial` device, or `null` to disable the console completel ``` { force : bool // default false, force the console onto this device so it does not move - // if false, changes in connection state (eg USB/Bluetooth) can move + // if false, changes in connection state (e.g. USB/Bluetooth) can move // the console automatically. } ``` @@ -1194,7 +1194,7 @@ Show fragmentation. * ` ` is free space * `#` is a normal variable -* `L` is a locked variable (address used, cannopt be moved) +* `L` is a locked variable (address used, cannot be moved) * `=` represents data in a Flat String (must be contiguous) */ void jswrap_e_dumpFragmentation() { @@ -1322,7 +1322,7 @@ is taking up most of the available space. If `depth>0` and the variable can be recursed into, an array listing all property names (including internal Espruino names) and their sizes is returned. If -`depth>1` there is also a `more` field that inspects the objects's children's +`depth>1` there is also a `more` field that inspects the objects' children's children. For instance `E.getSizeOf(function(a,b) { })` returns `5`. @@ -1600,7 +1600,7 @@ Set the seed for the random number generator used by `Math.random()`. "return" : ["int32","A random number"] } Unlike 'Math.random()' which uses a pseudo-random number generator, this -method reads from the internal voltage reference several times, xoring and +method reads from the internal voltage reference several times, XOR-ing and rotating to try and make a relatively random value from the noise in the signal. */ @@ -1725,7 +1725,7 @@ To remove the password, call this function with no arguments. could conceivably try every password in a dictionary. **Note:** This password is stored in memory in plain text. If someone is able -to execute arbitrary JavaScript code on the device (eg, you use `eval` on input +to execute arbitrary JavaScript code on the device (e.g., you use `eval` on input from unknown sources) or read the device's firmware then they may be able to obtain it. */ @@ -1873,7 +1873,7 @@ JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers) { "name" : "asm", "generate" : "jswrap_espruino_asm", "params" : [ - ["callspec","JsVar","The arguments this assembly takes - eg `void(int)`"], + ["callspec","JsVar","The arguments this assembly takes - e.g. `void(int)`"], ["assemblycode","JsVarArray","One of more strings of assembler code"] ], "typescript" : "asm(callspec: string, ...assemblycode: string[]): any;" From c5bb94bf7ad52656c4e7d509bb692575b5620f07 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 15:32:19 +0200 Subject: [PATCH 0231/1183] Limit documentation comments to 80 characters (#2244) --- libs/banglejs/jswrap_bangle.c | 398 +++++++----- libs/bluetooth/jswrap_bluetooth.c | 600 ++++++++++-------- libs/compression/jswrap_heatshrink.c | 12 +- libs/crypto/jswrap_crypto.c | 14 +- libs/filesystem/jswrap_file.c | 47 +- libs/filesystem/jswrap_fs.c | 39 +- libs/graphics/jswrap_graphics.c | 247 +++---- libs/graphics/jswrap_terminal.c | 5 +- libs/hexbadge/jswrap_hexbadge.c | 9 +- libs/math/jswrap_math.c | 6 +- libs/microbit/jswrap_microbit.c | 31 +- libs/misc/jswrap_unistroke.c | 4 +- libs/neopixel/jswrap_neopixel.c | 40 +- libs/network/cc3000/jswrap_cc3000.c | 12 +- libs/network/esp8266/jswrap_esp8266_network.c | 15 +- libs/network/http/jswrap_http.c | 91 ++- libs/network/js/jswrap_jsnetwork.c | 8 +- libs/network/jswrap_net.c | 64 +- libs/network/jswrap_wifi.c | 243 ++++--- libs/network/telnet/jswrap_telnet.c | 6 +- libs/network/wiznet/jswrap_wiznet.c | 17 +- libs/pixljs/jswrap_pixljs.c | 33 +- libs/puckjs/jswrap_puck.c | 180 +++--- libs/trigger/jswrap_trigger.c | 6 +- libs/wio_lte/jswrap_wio_lte.c | 6 +- src/jswrap_array.c | 40 +- src/jswrap_arraybuffer.c | 179 ++++-- src/jswrap_dataview.c | 3 +- src/jswrap_date.c | 20 +- src/jswrap_error.c | 4 +- src/jswrap_espruino.c | 477 ++++++++------ src/jswrap_flash.c | 35 +- src/jswrap_functions.c | 19 +- src/jswrap_interactive.c | 148 +++-- src/jswrap_io.c | 148 +++-- src/jswrap_json.c | 9 +- src/jswrap_modules.c | 4 +- src/jswrap_object.c | 49 +- src/jswrap_onewire.c | 3 +- src/jswrap_pin.c | 24 +- src/jswrap_process.c | 65 +- src/jswrap_promise.c | 14 +- src/jswrap_regexp.c | 9 +- src/jswrap_serial.c | 105 +-- src/jswrap_spi_i2c.c | 69 +- src/jswrap_storage.c | 236 ++++--- src/jswrap_string.c | 19 +- src/jswrap_waveform.c | 18 +- targets/esp32/jswrap_esp32.c | 24 +- targets/esp8266/jswrap_esp8266.c | 63 +- targets/esp8266/jswrap_nodemcu.c | 3 +- 51 files changed, 2327 insertions(+), 1593 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 4ec5098c68..7565f62836 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -91,7 +91,8 @@ declare const WIDGETS: { [key: string]: Widget }; "class" : "Bangle", "ifdef" : "BANGLEJS" } -Class containing utility functions for the [Bangle.js Smart Watch](http://www.espruino.com/Bangle.js) +Class containing utility functions for the [Bangle.js Smart +Watch](http://www.espruino.com/Bangle.js) */ /*TYPESCRIPT{ "class" : "Bangle" @@ -163,8 +164,8 @@ type HealthStatus = { "ifdef" : "BANGLEJS", "typescript" : "on(event: \"health\", callback: (info: HealthStatus) => void): void;" } -See `Bangle.getHealthStatus()` for more information. This is used for health tracking to -allow Bangle.js to record historical exercise data. +See `Bangle.getHealthStatus()` for more information. This is used for health +tracking to allow Bangle.js to record historical exercise data. */ /*JSON{ "type" : "event", @@ -181,7 +182,8 @@ Has the watch been moved so that it is face-up, or not face up? "name" : "twist", "ifdef" : "BANGLEJS" } -This event happens when the watch has been twisted around it's axis - for instance as if it was rotated so someone could look at the time. +This event happens when the watch has been twisted around it's axis - for +instance as if it was rotated so someone could look at the time. To tweak when this happens, see the `twist*` options in `Bangle.setOptions()` */ @@ -213,14 +215,15 @@ type CompassData = { "ifdef" : "BANGLEJS", "typescript" : "on(event: \"mag\", callback: (xyz: CompassData) => void): void;" } -Magnetometer/Compass data available with `{x,y,z,dx,dy,dz,heading}` object as a parameter +Magnetometer/Compass data available with `{x,y,z,dx,dy,dz,heading}` object as a +parameter * `x/y/z` raw x,y,z magnetometer readings * `dx/dy/dz` readings based on calibration since magnetometer turned on -* `heading` in degrees based on calibrated readings (will be NaN if magnetometer hasn't been rotated around 360 degrees) +* `heading` in degrees based on calibrated readings (will be NaN if magnetometer + hasn't been rotated around 360 degrees) -To get this event you must turn the compass on -with `Bangle.setCompassPower(1)`. +To get this event you must turn the compass on with `Bangle.setCompassPower(1)`. You can also retrieve the most recent reading with `Bangle.getCompass()`. */ @@ -237,8 +240,7 @@ You can also retrieve the most recent reading with `Bangle.getCompass()`. } Raw NMEA GPS / u-blox data messages received as a string -To get this event you must turn the GPS on -with `Bangle.setGPSPower(1)`. +To get this event you must turn the GPS on with `Bangle.setGPSPower(1)`. */ /*TYPESCRIPT type GPSFix = { @@ -278,13 +280,12 @@ GPS data, as an object. Contains: If a value such as `lat` is not known because there is no fix, it'll be `NaN`. -`hdop` is a value from the GPS receiver that gives a rough idea of accuracy -of lat/lon based on the geometry of the satellites in range. Multiply by 5 to -get a value in meters. This is just a ballpark estimation and should -not be considered remotely accurate. +`hdop` is a value from the GPS receiver that gives a rough idea of accuracy of +lat/lon based on the geometry of the satellites in range. Multiply by 5 to get a +value in meters. This is just a ballpark estimation and should not be considered +remotely accurate. -To get this event you must turn the GPS on -with `Bangle.setGPSPower(1)`. +To get this event you must turn the GPS on with `Bangle.setGPSPower(1)`. */ /*JSON{ "type" : "event", @@ -303,8 +304,8 @@ Heat rate data, as an object. Contains: } ``` -To get this event you must turn the heart rate monitor on -with `Bangle.setHRMPower(1)`. +To get this event you must turn the heart rate monitor on with +`Bangle.setHRMPower(1)`. */ /*JSON{ "type" : "event", @@ -341,7 +342,8 @@ type PressureData = { "ifdef" : "BANGLEJS", "typescript" : "on(event: \"pressure\", callback: (e: PressureData) => void): void;" } -When `Bangle.setBarometerPower(true)` is called, this event is fired containing barometer readings. +When `Bangle.setBarometerPower(true)` is called, this event is fired containing +barometer readings. Same format as `Bangle.getPressure()` */ @@ -352,7 +354,8 @@ Same format as `Bangle.getPressure()` "params" : [["on","bool","`true` if screen is on"]], "ifdef" : "BANGLEJS" } -Has the screen been turned on or off? Can be used to stop tasks that are no longer useful if nothing is displayed. Also see `Bangle.isLCDOn()` +Has the screen been turned on or off? Can be used to stop tasks that are no +longer useful if nothing is displayed. Also see `Bangle.isLCDOn()` */ /*JSON{ "type" : "event", @@ -374,9 +377,11 @@ type TapAxis = -2 | -1 | 0 | 1 | 2; "ifdef" : "BANGLEJS", "typescript" : "on(event: \"tap\", callback: (data: { dir: \"left\" | \"right\" | \"top\" | \"bottom\" | \"front\" | \"back\", double: boolean, x: TapAxis, y: TapAxis, z: TapAxis }) => void): void;" } -If the watch is tapped, this event contains information on the way it was tapped. +If the watch is tapped, this event contains information on the way it was +tapped. -`dir` reports the side of the watch that was tapped (not the direction it was tapped in). +`dir` reports the side of the watch that was tapped (not the direction it was +tapped in). ``` { @@ -406,11 +411,11 @@ Emitted when a 'gesture' (fast movement) is detected "ifdef" : "BANGLEJS", "typescript" : "on(event: \"aiGesture\", callback: (gesture: string | undefined, weights: number[]) => void): void;" } -Emitted when a 'gesture' (fast movement) is detected, and a Tensorflow model is in -storage in the `".tfmodel"` file. +Emitted when a 'gesture' (fast movement) is detected, and a Tensorflow model is +in storage in the `".tfmodel"` file. -If a `".tfnames"` file is specified as a comma-separated list of names, it will be used -to decode `gesture` from a number into a string. +If a `".tfnames"` file is specified as a comma-separated list of names, it will +be used to decode `gesture` from a number into a string. */ /*TYPESCRIPT type SwipeCallback = (directionLR: -1 | 0 | 1, directionUD?: -1 | 0 | 1) => void; @@ -424,9 +429,11 @@ type SwipeCallback = (directionLR: -1 | 0 | 1, directionUD?: -1 | 0 | 1) => void "ifdef" : "BANGLEJS", "typescript" : "on(event: \"swipe\", callback: SwipeCallback): void;" } -Emitted when a swipe on the touchscreen is detected (a movement from left->right, right->left, down->up or up->down) +Emitted when a swipe on the touchscreen is detected (a movement from +left->right, right->left, down->up or up->down) -Bangle.js 1 is only capable of detecting left/right swipes as it only contains a 2 zone touchscreen. +Bangle.js 1 is only capable of detecting left/right swipes as it only contains a +2 zone touchscreen. */ /*TYPESCRIPT type TouchCallback = (button: number, xy?: { x: number, y: number }) => void; @@ -463,11 +470,11 @@ type DragCallback = (event: { } Emitted when the touchscreen is dragged or released -The touchscreen extends past the edge of the screen and while -`x` and `y` coordinates are arranged such that they align with -the LCD's pixels, if your finger goes towards the edge of the -screen, `x` and `y` could end up larger than 175 (the screen's maximum pixel coordinates) -or smaller than 0. Coordinates from the `touch` event are clipped. +The touchscreen extends past the edge of the screen and while `x` and `y` +coordinates are arranged such that they align with the LCD's pixels, if your +finger goes towards the edge of the screen, `x` and `y` could end up larger than +175 (the screen's maximum pixel coordinates) or smaller than 0. Coordinates from +the `touch` event are clipped. */ /*JSON{ "type" : "event", @@ -477,10 +484,12 @@ or smaller than 0. Coordinates from the `touch` event are clipped. "ifdef" : "BANGLEJS2", "typescript" : "on(event: \"stroke\", callback: (event: { xy: Uint8Array, stroke?: string }) => void): void;" } -Emitted when the touchscreen is dragged for a large enough distance to count as a gesture. +Emitted when the touchscreen is dragged for a large enough distance to count as +a gesture. -If Bangle.strokes is defined and populated with data from `Unistroke.new`, the `event` argument will also -contain a `stroke` field containing the most closely matching stroke name. +If Bangle.strokes is defined and populated with data from `Unistroke.new`, the +`event` argument will also contain a `stroke` field containing the most closely +matching stroke name. For example: @@ -1820,13 +1829,12 @@ static void jswrap_banglejs_setLCDPowerBacklight(bool isOn) { } This function can be used to turn Bangle.js's LCD off or on. -This function resets the Bangle's 'activity timer' (like -pressing a button or the screen would) so after a time period -of inactivity set by `Bangle.setLCDTimeout` the screen will -turn off. +This function resets the Bangle's 'activity timer' (like pressing a button or +the screen would) so after a time period of inactivity set by +`Bangle.setLCDTimeout` the screen will turn off. -If you want to keep the screen on permanently (until apps -are changed) you can do: +If you want to keep the screen on permanently (until apps are changed) you can +do: ``` Bangle.setLCDTimeout(0); // turn off the timeout @@ -1834,8 +1842,8 @@ Bangle.setLCDPower(1); // keep screen on ``` -**When on full, the LCD draws roughly 40mA.** You can adjust -When brightness using `Bangle.setLCDBrightness`. +**When on full, the LCD draws roughly 40mA.** You can adjust When brightness +using `Bangle.setLCDBrightness`. */ void jswrap_banglejs_setLCDPower(bool isOn) { #ifdef ESPR_BACKLIGHT_FADE @@ -1876,9 +1884,9 @@ void jswrap_banglejs_setLCDPower(bool isOn) { This function can be used to adjust the brightness of Bangle.js's display, and hence prolong its battery life. -Due to hardware design constraints, software PWM has to be used which -means that the display may flicker slightly when Bluetooth is active -and the display is not at full power. +Due to hardware design constraints, software PWM has to be used which means that +the display may flicker slightly when Bluetooth is active and the display is not +at full power. **Power consumption** @@ -1920,12 +1928,23 @@ This function can be used to change the way graphics is handled on Bangle.js. Available options for `Bangle.setLCDMode` are: -* `Bangle.setLCDMode()` or `Bangle.setLCDMode("direct")` (the default) - The drawable area is 240x240 16 bit. Unbuffered, so draw calls take effect immediately. Terminal and vertical scrolling work (horizontal scrolling doesn't). -* `Bangle.setLCDMode("doublebuffered")` - The drawable area is 240x160 16 bit, terminal and scrolling will not work. `g.flip()` must be called for draw operations to take effect. -* `Bangle.setLCDMode("120x120")` - The drawable area is 120x120 8 bit, `g.getPixel`, terminal, and full scrolling work. Uses an offscreen buffer stored on Bangle.js, `g.flip()` must be called for draw operations to take effect. -* `Bangle.setLCDMode("80x80")` - The drawable area is 80x80 8 bit, `g.getPixel`, terminal, and full scrolling work. Uses an offscreen buffer stored on Bangle.js, `g.flip()` must be called for draw operations to take effect. - -You can also call `Bangle.setLCDMode()` to return to normal, unbuffered `"direct"` mode. +* `Bangle.setLCDMode()` or `Bangle.setLCDMode("direct")` (the default) - The + drawable area is 240x240 16 bit. Unbuffered, so draw calls take effect + immediately. Terminal and vertical scrolling work (horizontal scrolling + doesn't). +* `Bangle.setLCDMode("doublebuffered")` - The drawable area is 240x160 16 bit, + terminal and scrolling will not work. `g.flip()` must be called for draw + operations to take effect. +* `Bangle.setLCDMode("120x120")` - The drawable area is 120x120 8 bit, + `g.getPixel`, terminal, and full scrolling work. Uses an offscreen buffer + stored on Bangle.js, `g.flip()` must be called for draw operations to take + effect. +* `Bangle.setLCDMode("80x80")` - The drawable area is 80x80 8 bit, `g.getPixel`, + terminal, and full scrolling work. Uses an offscreen buffer stored on + Bangle.js, `g.flip()` must be called for draw operations to take effect. + +You can also call `Bangle.setLCDMode()` to return to normal, unbuffered +`"direct"` mode. */ void jswrap_banglejs_setLCDMode(JsVar *mode) { #ifdef LCD_CONTROLLER_ST7789_8BIT @@ -2065,11 +2084,16 @@ void jswrap_banglejs_setLCDOffset(int y) { } This function can be used to turn Bangle.js's LCD power saving on or off. -With power saving off, the display will remain in the state you set it with `Bangle.setLCDPower`. +With power saving off, the display will remain in the state you set it with +`Bangle.setLCDPower`. -With power saving on, the display will turn on if a button is pressed, the watch is turned face up, or the screen is updated (see `Bangle.setOptions` for configuration). It'll turn off automatically after the given timeout. +With power saving on, the display will turn on if a button is pressed, the watch +is turned face up, or the screen is updated (see `Bangle.setOptions` for +configuration). It'll turn off automatically after the given timeout. -**Note:** This function also sets the Backlight and Lock timeout (the time at which the touchscreen/buttons start being ignored). To set both separately, use `Bangle.setOptions` +**Note:** This function also sets the Backlight and Lock timeout (the time at +which the touchscreen/buttons start being ignored). To set both separately, use +`Bangle.setOptions` */ void jswrap_banglejs_setLCDTimeout(JsVarFloat timeout) { if (!isfinite(timeout)) @@ -2092,11 +2116,13 @@ void jswrap_banglejs_setLCDTimeout(JsVarFloat timeout) { ], "ifdef" : "BANGLEJS" } -Set how often the watch should poll for new acceleration/gyro data and kick the Watchdog timer. It isn't -recommended that you make this interval much larger than 1000ms, but values up to 4000ms are allowed. +Set how often the watch should poll for new acceleration/gyro data and kick the +Watchdog timer. It isn't recommended that you make this interval much larger +than 1000ms, but values up to 4000ms are allowed. -Calling this will set `Bangle.setOptions({powerSave: false})` - disabling the dynamic adjustment of -poll interval to save battery power when Bangle.js is stationary. +Calling this will set `Bangle.setOptions({powerSave: false})` - disabling the +dynamic adjustment of poll interval to save battery power when Bangle.js is +stationary. */ void jswrap_banglejs_setPollInterval(JsVarFloat interval) { if (!isfinite(interval) || interval<10 || interval>ACCEL_POLL_INTERVAL_MAX) { @@ -2142,28 +2168,50 @@ type BangleOptions = { Set internal options used for gestures, etc... * `wakeOnBTN1` should the LCD turn on when BTN1 is pressed? default = `true` -* `wakeOnBTN2` (Bangle.js 1) should the LCD turn on when BTN2 is pressed? default = `true` -* `wakeOnBTN3` (Bangle.js 1) should the LCD turn on when BTN3 is pressed? default = `true` -* `wakeOnFaceUp` should the LCD turn on when the watch is turned face up? default = `false` -* `wakeOnTouch` should the LCD turn on when the touchscreen is pressed? default = `false` -* `wakeOnTwist` should the LCD turn on when the watch is twisted? default = `true` -* `twistThreshold` How much acceleration to register a twist of the watch strap? Can be negative for opposite direction. default = `800` -* `twistMaxY` Maximum acceleration in Y to trigger a twist (low Y means watch is facing the right way up). default = `-800` -* `twistTimeout` How little time (in ms) must a twist take from low->high acceleration? default = `1000` -* `gestureStartThresh` how big a difference before we consider a gesture started? default = `sqr(800)` -* `gestureEndThresh` how small a difference before we consider a gesture ended? default = `sqr(2000)` -* `gestureInactiveCount` how many samples do we keep after a gesture has ended? default = `4` -* `gestureMinLength` how many samples must a gesture have before we notify about it? default = `10` -* `powerSave` after a minute of not being moved, Bangle.js will change the accelerometer poll interval down to 800ms (10x accelerometer samples). - On movement it'll be raised to the default 80ms. If `Bangle.setPollInterval` is used this is disabled, and for it to work the poll interval - must be either 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this automatic power saving, but will **not** change - the poll interval from its current value. If you desire a specific interval (e.g. the default 80ms) you must set it manually with `Bangle.setPollInterval(80)` - after setting `powerSave:false`. +* `wakeOnBTN2` (Bangle.js 1) should the LCD turn on when BTN2 is pressed? + default = `true` +* `wakeOnBTN3` (Bangle.js 1) should the LCD turn on when BTN3 is pressed? + default = `true` +* `wakeOnFaceUp` should the LCD turn on when the watch is turned face up? + default = `false` +* `wakeOnTouch` should the LCD turn on when the touchscreen is pressed? default + = `false` +* `wakeOnTwist` should the LCD turn on when the watch is twisted? default = + `true` +* `twistThreshold` How much acceleration to register a twist of the watch strap? + Can be negative for opposite direction. default = `800` +* `twistMaxY` Maximum acceleration in Y to trigger a twist (low Y means watch is + facing the right way up). default = `-800` +* `twistTimeout` How little time (in ms) must a twist take from low->high + acceleration? default = `1000` +* `gestureStartThresh` how big a difference before we consider a gesture + started? default = `sqr(800)` +* `gestureEndThresh` how small a difference before we consider a gesture ended? + default = `sqr(2000)` +* `gestureInactiveCount` how many samples do we keep after a gesture has ended? + default = `4` +* `gestureMinLength` how many samples must a gesture have before we notify about + it? default = `10` +* `powerSave` after a minute of not being moved, Bangle.js will change the + accelerometer poll interval down to 800ms (10x accelerometer samples). On + movement it'll be raised to the default 80ms. If `Bangle.setPollInterval` is + used this is disabled, and for it to work the poll interval must be either + 80ms or 800ms. default = `true`. Setting `powerSave:false` will disable this + automatic power saving, but will **not** change the poll interval from its + current value. If you desire a specific interval (e.g. the default 80ms) you + must set it manually with `Bangle.setPollInterval(80)` after setting + `powerSave:false`. * `lockTimeout` how many milliseconds before the screen locks * `lcdPowerTimeout` how many milliseconds before the screen turns off -* `backlightTimeout` how many milliseconds before the screen's backlight turns off -* `hrmPollInterval` set the requested poll interval (in milliseconds) for the heart rate monitor. On Bangle.js 2 only 10,20,40,80,160,200 ms are supported, and polling rate may not be exact. The algorithm's filtering is tuned for 20-40ms poll intervals, so higher/lower intervals may effect the reliability of the BPM reading. -* `seaLevelPressure` (Bangle.js 2) Normally 1013.25 millibars - this is used for calculating altitude with the pressure sensor +* `backlightTimeout` how many milliseconds before the screen's backlight turns + off +* `hrmPollInterval` set the requested poll interval (in milliseconds) for the + heart rate monitor. On Bangle.js 2 only 10,20,40,80,160,200 ms are supported, + and polling rate may not be exact. The algorithm's filtering is tuned for + 20-40ms poll intervals, so higher/lower intervals may effect the reliability + of the BPM reading. +* `seaLevelPressure` (Bangle.js 2) Normally 1013.25 millibars - this is used for + calculating altitude with the pressure sensor Where accelerations are used they are in internal units, where `8192 = 1g` @@ -2274,8 +2322,8 @@ int jswrap_banglejs_isLCDOn() { ], "ifdef" : "BANGLEJS" } -This function can be used to lock or unlock Bangle.js -(e.g. whether buttons and touchscreen work or not) +This function can be used to lock or unlock Bangle.js (e.g. whether buttons and +touchscreen work or not) */ void jswrap_banglejs_setLocked(bool isLocked) { #if defined(TOUCH_I2C) @@ -2675,8 +2723,8 @@ void jswrap_banglejs_resetCompass() { "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", "typescript" : "setBarometerPower(isOn: boolean, appID: string): boolean;" } -Set the power to the barometer IC. Once enabled, `Bangle.pressure` events -are fired each time a new barometer reading is available. +Set the power to the barometer IC. Once enabled, `Bangle.pressure` events are +fired each time a new barometer reading is available. When on, the barometer draws roughly 50uA */ @@ -2806,16 +2854,17 @@ void jswrap_banglejs_setStepCount(JsVarInt count) { "ifdef" : "BANGLEJS", "typescript" : "getCompass(): CompassData;" } -Get the most recent Magnetometer/Compass reading. Data is in the same format as the `Bangle.on('mag',` event. +Get the most recent Magnetometer/Compass reading. Data is in the same format as +the `Bangle.on('mag',` event. Returns an `{x,y,z,dx,dy,dz,heading}` object * `x/y/z` raw x,y,z magnetometer readings * `dx/dy/dz` readings based on calibration since magnetometer turned on -* `heading` in degrees based on calibrated readings (will be NaN if magnetometer hasn't been rotated around 360 degrees) +* `heading` in degrees based on calibrated readings (will be NaN if magnetometer + hasn't been rotated around 360 degrees) -To get this event you must turn the compass on -with `Bangle.setCompassPower(1)`.*/ +To get this event you must turn the compass on with `Bangle.setCompassPower(1)`.*/ JsVar *jswrap_banglejs_getCompass() { #ifdef MAG_I2C JsVar *o = jsvNewObject(); @@ -2854,12 +2903,14 @@ JsVar *jswrap_banglejs_getCompass() { "ifdef" : "BANGLEJS", "typescript" : "getAccel(): AccelData & { td: number };" } -Get the most recent accelerometer reading. Data is in the same format as the `Bangle.on('accel',` event. +Get the most recent accelerometer reading. Data is in the same format as the +`Bangle.on('accel',` event. * `x` is X axis (left-right) in `g` * `y` is Y axis (up-down) in `g` * `z` is Z axis (in-out) in `g` -* `diff` is difference between this and the last reading in `g` (calculated by comparing vectors, not magnitudes) +* `diff` is difference between this and the last reading in `g` (calculated by + comparing vectors, not magnitudes) * `td` is the elapsed * `mag` is the magnitude of the acceleration in `g` */ @@ -2890,14 +2941,16 @@ JsVar *jswrap_banglejs_getAccel() { `range` is one of: -* `undefined` or `'current'` - health data so far in the last 10 minutes is returned, +* `undefined` or `'current'` - health data so far in the last 10 minutes is + returned, * `'last'` - health data during the last 10 minutes * `'day'` - the health data so far for the day `getHealthStatus` returns an object containing: -* `movement` is the 32 bit sum of all `acc.diff` readings since power on (and rolls over). It is the difference in accelerometer values as `g*8192` +* `movement` is the 32 bit sum of all `acc.diff` readings since power on (and + rolls over). It is the difference in accelerometer values as `g*8192` * `steps` is the number of steps during this period * `bpm` the best BPM reading from HRM sensor during this period * `bpmConfidence` best BPM confidence (0-100%) during this period @@ -4031,8 +4084,8 @@ bool jswrap_banglejs_gps_character(char ch) { "ifdef" : "BANGLEJS" } Feature flag - If true, this Bangle.js firmware reads `setting.json` and -modifies beep & buzz behaviour accordingly (the bootloader -doesn't need to do it). +modifies beep & buzz behaviour accordingly (the bootloader doesn't need to do +it). */ // TODO Improve TypeScript declaration @@ -4120,7 +4173,8 @@ void jswrap_banglejs_accelWr(JsVarInt reg, JsVarInt data) { } Reads a register from the accelerometer -**Note:** On Espruino 2v06 and before this function only returns a number (`cnt` is ignored). +**Note:** On Espruino 2v06 and before this function only returns a number (`cnt` +is ignored). */ @@ -4304,12 +4358,12 @@ void jswrap_banglejs_ioWr(JsVarInt mask, bool on) { "#if" : "defined(DTNO1_F5) || defined(BANGLEJS_Q3) || defined(DICKENS)", "typescript" : "getPressure(): PressureData;" } -Read temperature, pressure and altitude data. A promise is returned -which will be resolved with `{temperature, pressure, altitude}`. +Read temperature, pressure and altitude data. A promise is returned which will +be resolved with `{temperature, pressure, altitude}`. -If the Barometer has been turned on with `Bangle.setBarometerPower` then this will -return almost immediately with the reading. If the Barometer is off, conversions take -between 500-750ms. +If the Barometer has been turned on with `Bangle.setBarometerPower` then this +will return almost immediately with the reading. If the Barometer is off, +conversions take between 500-750ms. Altitude assumes a sea-level pressure of 1013.25 hPa @@ -4513,12 +4567,13 @@ JsVar *jswrap_banglejs_getPressure() { "ifdef" : "BANGLEJS", "typescript" : "project(latlong: { lat: number, lon: number }): { x: number, y: number };" } -Perform a Spherical [Web Mercator projection](https://en.wikipedia.org/wiki/Web_Mercator_projection) -of latitude and longitude into `x` and `y` coordinates, which are roughly -equivalent to meters from `{lat:0,lon:0}`. +Perform a Spherical [Web Mercator +projection](https://en.wikipedia.org/wiki/Web_Mercator_projection) of latitude +and longitude into `x` and `y` coordinates, which are roughly equivalent to +meters from `{lat:0,lon:0}`. -This is the formula used for most online mapping and is a good way -to compare GPS coordinates to work out the distance between them. +This is the formula used for most online mapping and is a good way to compare +GPS coordinates to work out the distance between them. */ JsVar *jswrap_banglejs_project(JsVar *latlong) { const double degToRad = PI / 180; // degree to radian conversion @@ -4753,8 +4808,8 @@ void jswrap_banglejs_off() { "generate" : "jswrap_banglejs_softOff", "ifdef" : "BANGLEJS" } -Turn Bangle.js (mostly) off, but keep the CPU in sleep -mode until BTN1 is pressed to preserve the RTC (current time). +Turn Bangle.js (mostly) off, but keep the CPU in sleep mode until BTN1 is +pressed to preserve the RTC (current time). */ void jswrap_banglejs_softOff() { #ifndef EMULATED @@ -4941,11 +4996,11 @@ JsVar *jswrap_banglejs_getLogo() { "generate_js" : "libs/js/banglejs/Bangle_loadWidgets.min.js", "ifdef" : "BANGLEJS" } -Load all widgets from flash Storage. Call this once at the beginning -of your application if you want any on-screen widgets to be loaded. +Load all widgets from flash Storage. Call this once at the beginning of your +application if you want any on-screen widgets to be loaded. -They will be loaded into a global `WIDGETS` array, and -can be rendered with `Bangle.drawWidgets`. +They will be loaded into a global `WIDGETS` array, and can be rendered with +`Bangle.drawWidgets`. */ /*JSON{ "type" : "staticmethod", @@ -4956,9 +5011,8 @@ can be rendered with `Bangle.drawWidgets`. } Draw any onscreen widgets that were loaded with `Bangle.loadWidgets()`. -Widgets should redraw themselves when something changes - you'll only -need to call drawWidgets if you decide to clear the entire screen -with `g.clear()`. +Widgets should redraw themselves when something changes - you'll only need to +call drawWidgets if you decide to clear the entire screen with `g.clear()`. */ /*JSON{ "type" : "staticmethod", "class" : "Bangle", "name" : "drawWidgets", "patch":true, @@ -4974,8 +5028,8 @@ with `g.clear()`. "generate_js" : "libs/js/banglejs/Bangle_showLauncher.min.js", "ifdef" : "BANGLEJS" } -Load the Bangle.js app launcher, which will allow the user -to select an application to launch. +Load the Bangle.js app launcher, which will allow the user to select an +application to launch. */ /*JSON{ @@ -4995,8 +5049,8 @@ to select an application to launch. } Display a menu on the screen, and set up the buttons to navigate through it. -Supply an object containing menu items. When an item is selected, the -function it references will be executed. For example: +Supply an object containing menu items. When an item is selected, the function +it references will be executed. For example: ``` var boolean = false; @@ -5030,24 +5084,29 @@ var submenu = { E.showMenu(mainmenu); ``` -The menu will stay onscreen and active until explicitly removed, -which you can do by calling `E.showMenu()` without arguments. +The menu will stay onscreen and active until explicitly removed, which you can +do by calling `E.showMenu()` without arguments. See http://www.espruino.com/graphical_menu for more detailed information. On Bangle.js there are a few additions over the standard `graphical_menu`: * The options object can contain: - * `back : function() { }` - add a 'back' button, with the function called when it is pressed - * (Bangle.js 2) `scroll : int` - an integer specifying how much the initial menu should be scrolled by + * `back : function() { }` - add a 'back' button, with the function called when + it is pressed + * (Bangle.js 2) `scroll : int` - an integer specifying how much the initial + menu should be scrolled by * The object returned by `E.showMenu` contains: - * (Bangle.js 2) `scroller` - the object returned by `E.showScroller` - `scroller.scroll` returns the amount the menu is currently scrolled by + * (Bangle.js 2) `scroller` - the object returned by `E.showScroller` - + `scroller.scroll` returns the amount the menu is currently scrolled by * In the object specified for editable numbers: - * (Bangle.js 2) the `format` function is called with `format(value)` in the main menu, `format(value,1)` when in a scrollable list, or `format(value,2)` when in a popup window. + * (Bangle.js 2) the `format` function is called with `format(value)` in the + main menu, `format(value,1)` when in a scrollable list, or `format(value,2)` + when in a popup window. -You can also specify menu items as an array (rather than an Object). This can be useful -if you have menu items with the same title, or you want to `push` menu items onto an -array: +You can also specify menu items as an array (rather than an Object). This can be +useful if you have menu items with the same title, or you want to `push` menu +items onto an array: ``` var menu = [ @@ -5110,12 +5169,11 @@ E.showMessage("Lots of text will wrap automatically",{ ] } -Displays a full screen prompt on the screen, with the buttons -requested (or `Yes` and `No` for defaults). +Displays a full screen prompt on the screen, with the buttons requested (or +`Yes` and `No` for defaults). -When the button is pressed the promise is resolved with the -requested values (for the `Yes` and `No` defaults, `true` and `false` -are returned). +When the button is pressed the promise is resolved with the requested values +(for the `Yes` and `No` defaults, `true` and `false` are returned). ``` E.showPrompt("Do you like fish?").then(function(v) { @@ -5166,8 +5224,8 @@ The second `options` argument can contain: "showScroller(): void;" ] } -Display a scrollable menu on the screen, and set up the buttons/touchscreen to navigate through it -and select items. +Display a scrollable menu on the screen, and set up the buttons/touchscreen to +navigate through it and select items. Supply an object containing: @@ -5264,11 +5322,12 @@ To remove the window, call `E.showAlert()` with no arguments. "ifdef" : "BANGLEJS", "no_docs":1 } -On most Espruino board there are LEDs, in which case `LED` will be an actual Pin. +On most Espruino board there are LEDs, in which case `LED` will be an actual +Pin. -On Bangle.js there are no LEDs, so to remain compatible with example code that might -expect an LED, this is an object that behaves like a pin, but which just displays -a circle on the display +On Bangle.js there are no LEDs, so to remain compatible with example code that +might expect an LED, this is an object that behaves like a pin, but which just +displays a circle on the display */ /*JSON{ "type" : "variable", @@ -5278,11 +5337,12 @@ a circle on the display "ifdef" : "BANGLEJS", "no_docs":1 } -On most Espruino board there are LEDs, in which case `LED1` will be an actual Pin. +On most Espruino board there are LEDs, in which case `LED1` will be an actual +Pin. -On Bangle.js there are no LEDs, so to remain compatible with example code that might -expect an LED, this is an object that behaves like a pin, but which just displays -a circle on the display +On Bangle.js there are no LEDs, so to remain compatible with example code that +might expect an LED, this is an object that behaves like a pin, but which just +displays a circle on the display */ /*JSON{ "type" : "variable", @@ -5292,11 +5352,12 @@ a circle on the display "ifdef" : "BANGLEJS", "no_docs":1 } -On most Espruino board there are LEDs, in which case `LED2` will be an actual Pin. +On most Espruino board there are LEDs, in which case `LED2` will be an actual +Pin. -On Bangle.js there are no LEDs, so to remain compatible with example code that might -expect an LED, this is an object that behaves like a pin, but which just displays -a circle on the display +On Bangle.js there are no LEDs, so to remain compatible with example code that +might expect an LED, this is an object that behaves like a pin, but which just +displays a circle on the display */ /*JSON{ @@ -5311,30 +5372,39 @@ a circle on the display "ifdef" : "BANGLEJS", "typescript" : "setUI(type?: \"updown\" | \"leftright\" | \"clock\" | \"clockupdown\" | { mode: \"custom\"; back?: () => void; touch?: TouchCallback; swipe?: SwipeCallback; drag?: DragCallback; btn?: (n: number) => void, clock?: boolean }, callback?: (direction?: -1 | 1) => void): void;" } -This puts Bangle.js into the specified UI input mode, and calls the callback provided when there is user input. +This puts Bangle.js into the specified UI input mode, and calls the callback +provided when there is user input. Currently supported interface types are: -* 'updown' - UI input with upwards motion `cb(-1)`, downwards motion `cb(1)`, and select `cb()` +* 'updown' - UI input with upwards motion `cb(-1)`, downwards motion `cb(1)`, + and select `cb()` * Bangle.js 1 uses BTN1/3 for up/down and BTN2 for select * Bangle.js 2 uses touchscreen swipe up/down and tap -* 'leftright' - UI input with left motion `cb(-1)`, right motion `cb(1)`, and select `cb()` +* 'leftright' - UI input with left motion `cb(-1)`, right motion `cb(1)`, and + select `cb()` * Bangle.js 1 uses BTN1/3 for left/right and BTN2 for select * Bangle.js 2 uses touchscreen swipe left/right and tap/BTN1 for select -* 'clock' - called for clocks. Sets `Bangle.CLOCK=1` and allows a button to start the launcher +* 'clock' - called for clocks. Sets `Bangle.CLOCK=1` and allows a button to + start the launcher * Bangle.js 1 BTN2 starts the launcher * Bangle.js 2 BTN1 starts the launcher -* 'clockupdown' - called for clocks. Sets `Bangle.CLOCK=1`, allows a button to start the launcher, but also provides up/down functionality +* 'clockupdown' - called for clocks. Sets `Bangle.CLOCK=1`, allows a button to + start the launcher, but also provides up/down functionality * Bangle.js 1 BTN2 starts the launcher, BTN1/BTN3 call `cb(-1)` and `cb(1)` - * Bangle.js 2 BTN1 starts the launcher, touchscreen tap in top/bottom right hand side calls `cb(-1)` and `cb(1)` -* `{mode:"custom", ...}` allows you to specify custom handlers for different interactions. See below. + * Bangle.js 2 BTN1 starts the launcher, touchscreen tap in top/bottom right + hand side calls `cb(-1)` and `cb(1)` +* `{mode:"custom", ...}` allows you to specify custom handlers for different + interactions. See below. * `undefined` removes all user interaction code -While you could use setWatch/etc manually, the benefit here is that you don't end up with multiple `setWatch` instances, and -the actual input method (touch, or buttons) is implemented dependent on the watch (Bangle.js 1 or 2) +While you could use setWatch/etc manually, the benefit here is that you don't +end up with multiple `setWatch` instances, and the actual input method (touch, +or buttons) is implemented dependent on the watch (Bangle.js 1 or 2) -**Note:** You can override this function in boot code to change the interaction mode with the watch. For instance -you could make all clocks start the launcher with a swipe by using: +**Note:** You can override this function in boot code to change the interaction +mode with the watch. For instance you could make all clocks start the launcher +with a swipe by using: ``` (function() { @@ -5349,7 +5419,8 @@ you could make all clocks start the launcher with a swipe by using: })(); ``` -The first argument can also be an object, in which case more options can be specified: +The first argument can also be an object, in which case more options can be +specified: ``` Bangle.setUI({ @@ -5378,12 +5449,10 @@ Bangle.setUI({ "#if" : "defined(BANGLEJS_Q3) || defined(EMULATED)" } -Erase all storage and reload it with the default -contents. +Erase all storage and reload it with the default contents. -This is only available on Bangle.js 2.0. On Bangle.js 1.0 -you need to use `Install Default Apps` under the `More...` tab -of http://banglejs.com/apps +This is only available on Bangle.js 2.0. On Bangle.js 1.0 you need to use +`Install Default Apps` under the `More...` tab of http://banglejs.com/apps */ extern void ble_app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t * p_file_name); void jswrap_banglejs_factoryReset() { @@ -5400,8 +5469,7 @@ void jswrap_banglejs_factoryReset() { "ifdef" : "BANGLEJS", "typescript" : "appRect: { x: number, y: number, w: number, h: number, x2: number, y2: number };" } -Returns the rectangle on the screen that is currently -reserved for the app. +Returns the rectangle on the screen that is currently reserved for the app. */ JsVar *jswrap_banglejs_appRect() { JsVar *o = jsvNewObject(); diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index aaa5484837..3ef747cc11 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -348,7 +348,8 @@ void jswrap_ble_dumpBluetoothInitialisation(vcbprintf_callback user_callback, vo } The NRF class is for controlling functionality of the Nordic nRF51/nRF52 chips. -Most functionality is related to Bluetooth Low Energy, however there are also some functions related to NFC that apply to NRF52-based devices. +Most functionality is related to Bluetooth Low Energy, however there are also +some functions related to NFC that apply to NRF52-based devices. */ @@ -363,7 +364,8 @@ Most functionality is related to Bluetooth Low Energy, however there are also so ["addr","JsVar","The address of the device that has connected"] ] } -Called when a host device connects to Espruino. The first argument contains the address. +Called when a host device connects to Espruino. The first argument contains the +address. */ /*JSON{ "type" : "event", @@ -397,10 +399,9 @@ See Nordic's `ble_gap_evt_auth_status_t` structure for more information. "name" : "HID", "#if" : "defined(NRF52_SERIES)" } -Called with a single byte value when Espruino is set up as -a HID device and the computer it is connected to sends a -HID report back to Espruino. This is usually used for handling -indications such as the Caps Lock LED. +Called with a single byte value when Espruino is set up as a HID device and the +computer it is connected to sends a HID report back to Espruino. This is usually +used for handling indications such as the Caps Lock LED. */ /*JSON{ @@ -446,9 +447,9 @@ Called when an NFC field is no longer detected ], "#if" : "defined(NRF52_SERIES) && defined(USE_NFC)" } -When NFC is started with `NRF.nfcStart`, this is fired -when NFC data is received. It doesn't get called if -NFC is started with `NRF.nfcURL` or `NRF.nfcRaw` +When NFC is started with `NRF.nfcStart`, this is fired when NFC data is +received. It doesn't get called if NFC is started with `NRF.nfcURL` or +`NRF.nfcRaw` */ /*JSON{ "type" : "event", @@ -461,8 +462,8 @@ NFC is started with `NRF.nfcURL` or `NRF.nfcRaw` } Called when the device gets disconnected. -To connect and then print `Disconnected` when the device is -disconnected, just do the following: +To connect and then print `Disconnected` when the device is disconnected, just +do the following: ``` var gatt; @@ -490,7 +491,8 @@ NRF.requestDevice(...).then(function(device) { "name" : "characteristicvaluechanged", "ifdef" : "NRF52_SERIES" } -Called when a characteristic's value changes, *after* `BluetoothRemoteGATTCharacteristic.startNotifications` has been called. +Called when a characteristic's value changes, *after* +`BluetoothRemoteGATTCharacteristic.startNotifications` has been called. ``` ... @@ -503,8 +505,10 @@ Called when a characteristic's value changes, *after* `BluetoothRemoteGATTCharac }).then(... ``` -The first argument is of the form `{target : BluetoothRemoteGATTCharacteristic}`, and `BluetoothRemoteGATTCharacteristic.value` -will then contain the new value (as a DataView). +The first argument is of the form `{target : +BluetoothRemoteGATTCharacteristic}`, and +`BluetoothRemoteGATTCharacteristic.value` will then contain the new value (as a +DataView). */ /*JSON{ @@ -513,7 +517,8 @@ will then contain the new value (as a DataView). "instanceof" : "Serial", "ifdef" : "BLUETOOTH" } -The Bluetooth Serial port - used when data is sent or received over Bluetooth Smart on nRF51/nRF52 chips. +The Bluetooth Serial port - used when data is sent or received over Bluetooth +Smart on nRF51/nRF52 chips. */ /*JSON{ @@ -538,9 +543,9 @@ void jswrap_ble_disconnect() { "name" : "sleep", "generate" : "jswrap_ble_sleep" } -Disable Bluetooth advertising and disconnect from any device that -connected to Puck.js as a peripheral (this won't affect any devices -that Puck.js initiated connections to). +Disable Bluetooth advertising and disconnect from any device that connected to +Puck.js as a peripheral (this won't affect any devices that Puck.js initiated +connections to). This makes Puck.js undiscoverable, so it can't be connected to. @@ -562,8 +567,8 @@ void jswrap_ble_sleep() { "name" : "wake", "generate" : "jswrap_ble_wake" } -Enable Bluetooth advertising (this is enabled by default), which -allows other devices to discover and connect to Puck.js. +Enable Bluetooth advertising (this is enabled by default), which allows other +devices to discover and connect to Puck.js. Use `NRF.sleep()` to disable advertising. */ @@ -581,13 +586,13 @@ void jswrap_ble_wake() { ["callback","JsVar","An optional function to be called while the softdevice is uninitialised. Use with caution - accessing console/bluetooth will almost certainly result in a crash."] ] } -Restart the Bluetooth softdevice (if there is currently a BLE connection, -it will queue a restart to be done when the connection closes). +Restart the Bluetooth softdevice (if there is currently a BLE connection, it +will queue a restart to be done when the connection closes). -You shouldn't need to call this function in normal usage. However, Nordic's -BLE softdevice has some settings that cannot be reset. For example there -are only a certain number of unique UUIDs. Once these are all used the -only option is to restart the softdevice to clear them all out. +You shouldn't need to call this function in normal usage. However, Nordic's BLE +softdevice has some settings that cannot be reset. For example there are only a +certain number of unique UUIDs. Once these are all used the only option is to +restart the softdevice to clear them all out. */ void jswrap_ble_restart(JsVar *callback) { if (jsble_has_connection()) { @@ -610,8 +615,8 @@ void jswrap_ble_restart(JsVar *callback) { } Get this device's default Bluetooth MAC address. -For Puck.js, the last 5 characters of this (eg. `ee:ff`) -are used in the device's advertised Bluetooth name. +For Puck.js, the last 5 characters of this (eg. `ee:ff`) are used in the +device's advertised Bluetooth name. */ JsVar *jswrap_ble_getAddress() { #ifdef NRF5X @@ -649,13 +654,14 @@ NRF.setAddress("ff:ee:dd:cc:bb:aa random"); Addresses take the form: * `"ff:ee:dd:cc:bb:aa"` or `"ff:ee:dd:cc:bb:aa public"` for a public address -* `"ff:ee:dd:cc:bb:aa random"` for a random static address (the default for Espruino) +* `"ff:ee:dd:cc:bb:aa random"` for a random static address (the default for + Espruino) -This may throw a `INVALID_BLE_ADDR` error if the upper two bits -of the address don't match the address type. +This may throw a `INVALID_BLE_ADDR` error if the upper two bits of the address +don't match the address type. -To change the address, Espruino must restart the softdevice. It will only do -so when it is disconnected from other devices. +To change the address, Espruino must restart the softdevice. It will only do so +when it is disconnected from other devices. */ void jswrap_ble_setAddress(JsVar *address) { #ifdef NRF52_SERIES @@ -678,7 +684,8 @@ void jswrap_ble_setAddress(JsVar *address) { "generate" : "jswrap_ble_getBattery", "return" : ["float", "Battery level in volts" ] } -Get the battery level in volts (the voltage that the NRF chip is running off of). +Get the battery level in volts (the voltage that the NRF chip is running off +of). This is the battery level of the device itself - it has nothing to with any device that might be connected. @@ -699,8 +706,9 @@ JsVarFloat jswrap_ble_getBattery() { } Change the data that Espruino advertises. -Data can be of the form `{ UUID : data_as_byte_array }`. The UUID should be -a [Bluetooth Service ID](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx). +Data can be of the form `{ UUID : data_as_byte_array }`. The UUID should be a +[Bluetooth Service +ID](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx). For example to return battery level at 95%, do: @@ -729,11 +737,11 @@ NRF.setAdvertising({ }); ``` -Service UUIDs can also be supplied in the second argument of -`NRF.setServices`, but those go in the scan response packet. +Service UUIDs can also be supplied in the second argument of `NRF.setServices`, +but those go in the scan response packet. -You can also supply the raw advertising data in an array. For example -to advertise as an Eddystone beacon: +You can also supply the raw advertising data in an array. For example to +advertise as an Eddystone beacon: ``` NRF.setAdvertising([0x03, // Length of Service List @@ -749,18 +757,19 @@ NRF.setAdvertising([0x03, // Length of Service List {interval:100}); ``` -(However for Eddystone we'd advise that you use the [Espruino Eddystone library](/Puck.js+Eddystone)) +(However for Eddystone we'd advise that you use the [Espruino Eddystone +library](/Puck.js+Eddystone)) **Note:** When specifying data as an array, certain advertising options such as `discoverable` and `showName` won't have any effect. -**Note:** The size of Bluetooth LE advertising packets is limited to 31 bytes. If -you want to advertise more data, consider using an array for `data` (See below), or -`NRF.setScanResponse`. +**Note:** The size of Bluetooth LE advertising packets is limited to 31 bytes. +If you want to advertise more data, consider using an array for `data` (See +below), or `NRF.setScanResponse`. -You can even specify an array of arrays or objects, in which case each advertising packet -will be used in turn - for instance to make your device advertise battery level and its name -as well as both Eddystone and iBeacon : +You can even specify an array of arrays or objects, in which case each +advertising packet will be used in turn - for instance to make your device +advertise battery level and its name as well as both Eddystone and iBeacon : ``` NRF.setAdvertising([ @@ -786,26 +795,26 @@ NRF.setAdvertising([ } ``` -Setting `connectable` and `scannable` to false gives the lowest power consumption -as the BLE radio doesn't have to listen after sending advertising. +Setting `connectable` and `scannable` to false gives the lowest power +consumption as the BLE radio doesn't have to listen after sending advertising. -**NOTE:** Non-`connectable` advertising can't have an advertising interval less than 100ms -according to the BLE spec. +**NOTE:** Non-`connectable` advertising can't have an advertising interval less +than 100ms according to the BLE spec. -So for instance to set the name of Puck.js without advertising any -other data you can just use the command: +So for instance to set the name of Puck.js without advertising any other data +you can just use the command: ``` NRF.setAdvertising({},{name:"Hello"}); ``` -You can also specify 'manufacturer data', which is another form of advertising data. -We've registered the Manufacturer ID 0x0590 (as Pur3 Ltd) for use with *Official -Espruino devices* - use it to advertise whatever data you'd like, but we'd recommend -using JSON. +You can also specify 'manufacturer data', which is another form of advertising +data. We've registered the Manufacturer ID 0x0590 (as Pur3 Ltd) for use with +*Official Espruino devices* - use it to advertise whatever data you'd like, but +we'd recommend using JSON. -For example by not advertising a device name you can send up to 24 bytes of JSON on -Espruino's manufacturer ID: +For example by not advertising a device name you can send up to 24 bytes of JSON +on Espruino's manufacturer ID: ``` var data = {a:1,b:2}; @@ -816,16 +825,16 @@ NRF.setAdvertising({},{ }); ``` -If you're using [EspruinoHub](https://github.com/espruino/EspruinoHub) then it will -automatically decode this into the folling MQTT topics: +If you're using [EspruinoHub](https://github.com/espruino/EspruinoHub) then it +will automatically decode this into the folling MQTT topics: * `/ble/advertise/ma:c_:_a:dd:re:ss/espruino` -> `{"a":10,"b":15}` * `/ble/advertise/ma:c_:_a:dd:re:ss/a` -> `1` * `/ble/advertise/ma:c_:_a:dd:re:ss/b` -> `2` -Note that **you only have 24 characters available for JSON**, so try to use -the shortest field names possible and avoid floating point values that can -be very long when converted to a String. +Note that **you only have 24 characters available for JSON**, so try to use the +shortest field names possible and avoid floating point values that can be very +long when converted to a String. */ void jswrap_ble_setAdvertising(JsVar *data, JsVar *options) { uint32_t err_code = 0; @@ -978,8 +987,8 @@ JsVar *jswrap_ble_getCurrentAdvertisingData() { ], "return" : ["JsVar", "An array containing the advertising data" ] } -This is just like `NRF.setAdvertising`, except instead of advertising -the data, it returns the packet that would be advertised as an array. +This is just like `NRF.setAdvertising`, except instead of advertising the data, +it returns the packet that would be advertised as an array. */ JsVar *jswrap_ble_getAdvertisingData(JsVar *data, JsVar *options) { uint32_t err_code; @@ -1118,7 +1127,8 @@ JsVar *jswrap_ble_getAdvertisingData(JsVar *data, JsVar *options) { ] } -The raw scan response data should be supplied as an array. For example to return "Sample" for the device name: +The raw scan response data should be supplied as an array. For example to return +"Sample" for the device name: ``` NRF.setScanResponse([0x07, // Length of Data @@ -1126,9 +1136,9 @@ NRF.setScanResponse([0x07, // Length of Data 'S', 'a', 'm', 'p', 'l', 'e']); ``` -**Note:** `NRF.setServices(..., {advertise:[ ... ]})` writes advertised -services into the scan response - so you can't use both `advertise` -and `NRF.setServices` or one will overwrite the other. +**Note:** `NRF.setServices(..., {advertise:[ ... ]})` writes advertised services +into the scan response - so you can't use both `advertise` and `NRF.setServices` +or one will overwrite the other. */ void jswrap_ble_setScanResponse(JsVar *data) { uint32_t err_code = 0; @@ -1188,10 +1198,11 @@ void jswrap_ble_setScanResponse(JsVar *data) { Change the services and characteristics Espruino advertises. -If you want to **change** the value of a characteristic, you need -to use `NRF.updateServices()` instead +If you want to **change** the value of a characteristic, you need to use +`NRF.updateServices()` instead -To expose some information on Characteristic `ABCD` on service `BCDE` you could do: +To expose some information on Characteristic `ABCD` on service `BCDE` you could +do: ``` NRF.setServices({ @@ -1262,8 +1273,8 @@ NRF.setServices({ }); ``` -**Note:** UUIDs can be integers between `0` and `0xFFFF`, strings of -the form `"ABCD"`, or strings of the form `"ABCDABCD-ABCD-ABCD-ABCD-ABCDABCDABCD"` +**Note:** UUIDs can be integers between `0` and `0xFFFF`, strings of the form +`"ABCD"`, or strings of the form `"ABCDABCD-ABCD-ABCD-ABCD-ABCDABCDABCD"` `options` can be of the form: @@ -1278,14 +1289,14 @@ NRF.setServices(undefined, { ``` To enable BLE HID, you must set `hid` to an array which is the BLE report -descriptor. The easiest way to do this is to use the `ble_hid_controls` -or `ble_hid_keyboard` modules. +descriptor. The easiest way to do this is to use the `ble_hid_controls` or +`ble_hid_keyboard` modules. -**Note:** Just creating a service doesn't mean that the service will -be advertised. It will only be available after a device connects. To -advertise, specify the UUIDs you wish to advertise in the `advertise` -field of the second `options` argument. For example this will create -and advertise a heart rate service: +**Note:** Just creating a service doesn't mean that the service will be +advertised. It will only be available after a device connects. To advertise, +specify the UUIDs you wish to advertise in the `advertise` field of the second +`options` argument. For example this will create and advertise a heart rate +service: ``` NRF.setServices({ @@ -1300,22 +1311,23 @@ NRF.setServices({ You may specify 128 bit UUIDs to advertise, however you may get a `DATA_SIZE` exception because there is insufficient space in the Bluetooth LE advertising -packet for the 128 bit UART UUID as well as the UUID you specified. In this -case you can add `uart:false` after the `advertise` element to disable the -UART, however you then be unable to connect to Puck.js's console via Bluetooth. +packet for the 128 bit UART UUID as well as the UUID you specified. In this case +you can add `uart:false` after the `advertise` element to disable the UART, +however you then be unable to connect to Puck.js's console via Bluetooth. If you absolutely require two or more 128 bit UUIDs then you will have to specify your own raw advertising data packets with `NRF.setAdvertising` -**Note:** The services on Espruino can only be modified when there is -no device connected to it as it requires a restart of the Bluetooth stack. -**iOS devices will 'cache' the list of services** so apps like -NRF Connect may incorrectly display the old services even after you -have modified them. To fix this, disable and re-enable Bluetooth on your -iOS device, or use an Android device to run NRF Connect. +**Note:** The services on Espruino can only be modified when there is no device +connected to it as it requires a restart of the Bluetooth stack. **iOS devices +will 'cache' the list of services** so apps like NRF Connect may incorrectly +display the old services even after you have modified them. To fix this, disable +and re-enable Bluetooth on your iOS device, or use an Android device to run NRF +Connect. -**Note:** Not all combinations of security configuration values are valid, the valid combinations are: encrypted, -encrypted + mitm, lesc, signed, signed + mitm. See `NRF.setSecurity` for more information. +**Note:** Not all combinations of security configuration values are valid, the +valid combinations are: encrypted, encrypted + mitm, lesc, signed, signed + +mitm. See `NRF.setSecurity` for more information. */ void jswrap_ble_setServices(JsVar *data, JsVar *options) { if (!(jsvIsObject(data) || jsvIsUndefined(data))) { @@ -1420,8 +1432,9 @@ void jswrap_ble_setServices(JsVar *data, JsVar *options) { ] } -Update values for the services and characteristics Espruino advertises. -Only services and characteristics previously declared using `NRF.setServices` are affected. +Update values for the services and characteristics Espruino advertises. Only +services and characteristics previously declared using `NRF.setServices` are +affected. To update the '0xABCD' characteristic in the '0xBCDE' service: @@ -1435,7 +1448,8 @@ NRF.updateServices({ }); ``` -You can also use 128 bit UUIDs, for example `"b7920001-3c1b-4b40-869f-3c0db9be80c6"`. +You can also use 128 bit UUIDs, for example +`"b7920001-3c1b-4b40-869f-3c0db9be80c6"`. To define a service and characteristic and then notify connected clients of a change to it when a button is pressed: @@ -1462,13 +1476,15 @@ setWatch(function() { }, BTN, { repeat:true, edge:"rising", debounce: 50 }); ``` -This only works if the characteristic was created with `notify: true` using `NRF.setServices`, -otherwise the characteristic will be updated but no notification will be sent. +This only works if the characteristic was created with `notify: true` using +`NRF.setServices`, otherwise the characteristic will be updated but no +notification will be sent. Also note that `maxLen` was specified. If it wasn't then the maximum length of the characteristic would have been 5 - the length of `"Hello"`. -To indicate (i.e. notify with ACK) connected clients of a change to the '0xABCD' characteristic in the '0xBCDE' service: +To indicate (i.e. notify with ACK) connected clients of a change to the '0xABCD' +characteristic in the '0xBCDE' service: ``` NRF.updateServices({ @@ -1481,8 +1497,9 @@ NRF.updateServices({ }); ``` -This only works if the characteristic was created with `indicate: true` using `NRF.setServices`, -otherwise the characteristic will be updated but no notification will be sent. +This only works if the characteristic was created with `indicate: true` using +`NRF.setServices`, otherwise the characteristic will be updated but no +notification will be sent. **Note:** See `NRF.setServices` for more information */ @@ -1721,8 +1738,8 @@ bool jswrap_ble_filter_device(JsVar *filters, JsVar *device) { } Start/stop listening for BLE advertising packets within range. Returns a -`BluetoothDevice` for each advertsing packet. **By default this is not an active scan, so -Scan Response advertising data is not included (see below)** +`BluetoothDevice` for each advertsing packet. **By default this is not an active +scan, so Scan Response advertising data is not included (see below)** ``` // Start scanning @@ -1751,10 +1768,10 @@ BluetoothDevice { } ``` -You can also supply a set of filters (as described in `NRF.requestDevice`) as a second argument, which will -allow you to filter the devices you get a callback for. This helps -to cut down on the time spent processing JavaScript code in areas with -a lot of Bluetooth advertisements. For example to find only devices +You can also supply a set of filters (as described in `NRF.requestDevice`) as a +second argument, which will allow you to filter the devices you get a callback +for. This helps to cut down on the time spent processing JavaScript code in +areas with a lot of Bluetooth advertisements. For example to find only devices with the manufacturer data `0x0590` (Espruino's ID) you could do: ``` @@ -1763,23 +1780,23 @@ NRF.setScan(function(d) { }, { filters: [{ manufacturerData:{0x0590:{}} }] }); ``` -You can also specify `active:true` in the second argument to perform -active scanning (this requests scan response packets) from any -devices it finds. +You can also specify `active:true` in the second argument to perform active +scanning (this requests scan response packets) from any devices it finds. -**Note:** Using a filter in `setScan` filters each advertising packet individually. As -a result, if you filter based on a service UUID and a device advertises with multiple packets -(or a scan response when `active:true`) only the packets matching the filter are returned. To -aggregate multiple packets you can use `NRF.findDevices`. +**Note:** Using a filter in `setScan` filters each advertising packet +individually. As a result, if you filter based on a service UUID and a device +advertises with multiple packets (or a scan response when `active:true`) only +the packets matching the filter are returned. To aggregate multiple packets you +can use `NRF.findDevices`. -**Note:** BLE advertising packets can arrive quickly - faster than you'll -be able to print them to the console. It's best only to print a few, or -to use a function like `NRF.findDevices(..)` which will collate a list -of available devices. +**Note:** BLE advertising packets can arrive quickly - faster than you'll be +able to print them to the console. It's best only to print a few, or to use a +function like `NRF.findDevices(..)` which will collate a list of available +devices. -**Note:** Using setScan turns the radio's receive mode on constantly. This -can draw a *lot* of power (12mA or so), so you should use it sparingly or -you can run your battery down quickly. +**Note:** Using setScan turns the radio's receive mode on constantly. This can +draw a *lot* of power (12mA or so), so you should use it sparingly or you can +run your battery down quickly. */ void jswrap_ble_setScan_cb(JsVar *callback, JsVar *filters, JsVar *adv) { /* This is called when we get data - do some processing here in the main loop @@ -1928,9 +1945,10 @@ void jswrap_ble_setScan(JsVar *callback, JsVar *options) { } This function can be used to quickly filter through Bluetooth devices. -For instance if you wish to scan for multiple different types of device at the same time -then you could use `NRF.findDevices` with all the filters you're interested in. When scanning -is finished you can then use `NRF.filterDevices` to pick out just the devices of interest. +For instance if you wish to scan for multiple different types of device at the +same time then you could use `NRF.findDevices` with all the filters you're +interested in. When scanning is finished you can then use `NRF.filterDevices` to +pick out just the devices of interest. ``` // the two types of device we're interested in @@ -1978,8 +1996,8 @@ JsVar *jswrap_ble_filterDevices(JsVar *devices, JsVar *filters) { ], "typescript" : "findDevices(callback: (devices: BluetoothDevice[]) => void, options?: number | { filters?: NRFFilters, timeout?: number, active?: boolean }): void;" } -Utility function to return a list of BLE devices detected in range. Behind the scenes, -this uses `NRF.setScan(...)` and collates the results. +Utility function to return a list of BLE devices detected in range. Behind the +scenes, this uses `NRF.setScan(...)` and collates the results. ``` NRF.findDevices(function(devices) { @@ -2012,9 +2030,10 @@ prints something like: For more information on the structure returned, see `NRF.setScan`. -If you want to scan only for specific devices you can replace the timeout with an object -of the form `{filters: ..., timeout : ..., active: bool}` using the filters -described in `NRF.requestDevice`. For example to search for devices with Espruino's `manufacturerData`: +If you want to scan only for specific devices you can replace the timeout with +an object of the form `{filters: ..., timeout : ..., active: bool}` using the +filters described in `NRF.requestDevice`. For example to search for devices with +Espruino's `manufacturerData`: ``` NRF.findDevices(function(devices) { @@ -2022,17 +2041,21 @@ NRF.findDevices(function(devices) { }, {timeout : 2000, filters : [{ manufacturerData:{0x0590:{}} }] }); ``` -You could then use [`BluetoothDevice.gatt.connect(...)`](/Reference#l_BluetoothRemoteGATTServer_connect) on -the device returned to make a connection. +You could then use +[`BluetoothDevice.gatt.connect(...)`](/Reference#l_BluetoothRemoteGATTServer_connect) +on the device returned to make a connection. -You can also use [`NRF.connect(...)`](/Reference#l_NRF_connect) on just the `id` string returned, which -may be useful if you always want to connect to a specific device. +You can also use [`NRF.connect(...)`](/Reference#l_NRF_connect) on just the `id` +string returned, which may be useful if you always want to connect to a specific +device. -**Note:** Using findDevices turns the radio's receive mode on for 2000ms (or however long you specify). This -can draw a *lot* of power (12mA or so), so you should use it sparingly or you can run your battery down quickly. +**Note:** Using findDevices turns the radio's receive mode on for 2000ms (or +however long you specify). This can draw a *lot* of power (12mA or so), so you +should use it sparingly or you can run your battery down quickly. -**Note:** The 'data' field contains the data of *the last packet received*. There may have been more -packets. To get data for each packet individually use `NRF.setScan` instead. +**Note:** The 'data' field contains the data of *the last packet received*. +There may have been more packets. To get data for each packet individually use +`NRF.setScan` instead. */ void jswrap_ble_findDevices_found_cb(JsVar *device) { JsVar *arr = jsvObjectGetChild(execInfo.hiddenRoot, "BLEADV", JSV_ARRAY); @@ -2135,8 +2158,8 @@ void jswrap_ble_findDevices(JsVar *callback, JsVar *options) { ] } -Start/stop listening for RSSI values on the currently active connection -(where This device is a peripheral and is being connected to by a 'central' device) +Start/stop listening for RSSI values on the currently active connection (where +This device is a peripheral and is being connected to by a 'central' device) ``` // Start scanning @@ -2187,19 +2210,18 @@ void jswrap_ble_setTxPower(JsVarInt pwr) { ] } -**THIS IS DEPRECATED** - please use `NRF.setConnectionInterval` for -peripheral and `NRF.connect(addr, options)`/`BluetoothRemoteGATTServer.connect(options)` +**THIS IS DEPRECATED** - please use `NRF.setConnectionInterval` for peripheral +and `NRF.connect(addr, options)`/`BluetoothRemoteGATTServer.connect(options)` for central connections. -This sets the connection parameters - these affect the transfer speed and -power usage when the device is connected. +This sets the connection parameters - these affect the transfer speed and power +usage when the device is connected. * When not low power, the connection interval is between 7.5 and 20ms * When low power, the connection interval is between 500 and 1000ms -When low power connection is enabled, transfers of data over Bluetooth -will be very slow, however power usage while connected will be drastically -decreased. +When low power connection is enabled, transfers of data over Bluetooth will be +very slow, however power usage while connected will be drastically decreased. This will only take effect after the connection is disconnected and re-established. @@ -2308,8 +2330,8 @@ void jswrap_nfc_URL(JsVar *url) { } Enables NFC and with an out of band 16 byte pairing key. -For example the following will enable out of band pairing on BLE -such that the device will pair when you tap the phone against it: +For example the following will enable out of band pairing on BLE such that the +device will pair when you tap the phone against it: ``` var bleKey = [0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00]; @@ -2489,10 +2511,11 @@ void jswrap_nfc_raw(JsVar *payload) { ], "return" : ["JsVar", "Internal tag memory (first 10 bytes of tag data)" ] } -**Advanced NFC Functionality.** If you just want to advertise a URL, use `NRF.nfcURL` instead. +**Advanced NFC Functionality.** If you just want to advertise a URL, use +`NRF.nfcURL` instead. -Enables NFC and starts advertising. `NFCrx` events will be -fired when data is received. +Enables NFC and starts advertising. `NFCrx` events will be fired when data is +received. ``` NRF.nfcStart(); @@ -2555,7 +2578,8 @@ JsVar *jswrap_nfc_start(JsVar *payload) { "generate" : "jswrap_nfc_stop", "params" : [ ] } -**Advanced NFC Functionality.** If you just want to advertise a URL, use `NRF.nfcURL` instead. +**Advanced NFC Functionality.** If you just want to advertise a URL, use +`NRF.nfcURL` instead. Disables NFC. @@ -2581,12 +2605,13 @@ void jswrap_nfc_stop() { ["payload","JsVar","Optional tx data"] ] } -**Advanced NFC Functionality.** If you just want to advertise a URL, use `NRF.nfcURL` instead. +**Advanced NFC Functionality.** If you just want to advertise a URL, use +`NRF.nfcURL` instead. -Acknowledges the last frame and optionally transmits a response. -If payload is an array, then a array.length byte nfc frame is sent. -If payload is a int, then a 4bit ACK/NACK is sent. -**Note:** ```nfcSend``` should always be called after an ```NFCrx``` event. +Acknowledges the last frame and optionally transmits a response. If payload is +an array, then a array.length byte nfc frame is sent. If payload is a int, then +a 4bit ACK/NACK is sent. **Note:** ```nfcSend``` should always be called after +an ```NFCrx``` event. ``` NRF.nfcSend(new Uint8Array([0x01, 0x02, ...])); @@ -2626,7 +2651,8 @@ void jswrap_nfc_send(JsVar *payload) { ["callback","JsVar","A callback function to be called when the data is sent"] ] } -Send a USB HID report. HID must first be enabled with `NRF.setServices({}, {hid: hid_report})` +Send a USB HID report. HID must first be enabled with `NRF.setServices({}, {hid: +hid_report})` */ void jswrap_ble_sendHIDReport(JsVar *data, JsVar *callback) { #if BLE_HIDS_ENABLED @@ -2649,7 +2675,8 @@ void jswrap_ble_sendHIDReport(JsVar *data, JsVar *callback) { "params" : [["info","JsVar","An object (see below)"]], "ifdef" : "BANGLEJS" } -Called when a notification arrives on an Apple iOS device Bangle.js is connected to +Called when a notification arrives on an Apple iOS device Bangle.js is connected +to ``` @@ -2680,7 +2707,8 @@ NRF.ancsGetNotificationInfo( event.uid ).then(a=>print("Notify",E.toJS(a))); "params" : [["info","JsVar","An object (see below)"]], "ifdef" : "BANGLEJS" } -Called when a media event arrives on an Apple iOS device Bangle.js is connected to +Called when a media event arrives on an Apple iOS device Bangle.js is connected +to ``` @@ -2702,7 +2730,8 @@ truncated : bool // the 'value' was too big to be sent completely "params" : [ ], "return" : ["bool", "True if Apple Notification Center Service (ANCS) has been initialised and is active" ] } -Check if Apple Notification Center Service (ANCS) is currently active on the BLE connection +Check if Apple Notification Center Service (ANCS) is currently active on the BLE +connection */ bool jswrap_ble_ancsIsActive() { #if ESPR_BLUETOOTH_ANCS @@ -2721,7 +2750,8 @@ bool jswrap_ble_ancsIsActive() { ["positive","bool","`true` for positive action, `false` for negative"] ] } -Send an ANCS action for a specific Notification UID. Corresponds to posaction/negaction in the 'ANCS' event that was received +Send an ANCS action for a specific Notification UID. Corresponds to +posaction/negaction in the 'ANCS' event that was received */ void jswrap_ble_ancsAction(int uid, bool isPositive) { #if ESPR_BLUETOOTH_ANCS @@ -2844,16 +2874,19 @@ bool jswrap_ble_amsIsActive() { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Get Apple Media Service (AMS) info for the current media player. -"playbackinfo" returns a concatenation of three comma-separated values: +Get Apple Media Service (AMS) info for the current media player. "playbackinfo" +returns a concatenation of three comma-separated values: -- PlaybackState: a string that represents the integer value of the playback state: +- PlaybackState: a string that represents the integer value of the playback + state: - PlaybackStatePaused = 0 - PlaybackStatePlaying = 1 - PlaybackStateRewinding = 2 - PlaybackStateFastForwarding = 3 -- PlaybackRate: a string that represents the floating point value of the playback rate. -- ElapsedTime: a string that represents the floating point value of the elapsed time of the current track, in seconds +- PlaybackRate: a string that represents the floating point value of the + playback rate. +- ElapsedTime: a string that represents the floating point value of the elapsed + time of the current track, in seconds */ JsVar *jswrap_ble_amsGetPlayerInfo(JsVar *id) { @@ -2931,7 +2964,8 @@ JsVar *jswrap_ble_amsGetTrackInfo(JsVar *id) { } Send an AMS command to an Apple Media Service device to control music playback -Command is one of play, pause, playpause, next, prev, volup, voldown, repeat, shuffle, skipforward, skipback, like, dislike, bookmark +Command is one of play, pause, playpause, next, prev, volup, voldown, repeat, +shuffle, skipforward, skipback, like, dislike, bookmark */ void jswrap_ble_amsCommand(JsVar *id) { #if ESPR_BLUETOOTH_ANCS @@ -2986,29 +3020,39 @@ type NRFFilters = { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Search for available devices matching the given filters. Since we have no UI here, -Espruino will pick the FIRST device it finds, or it'll call `catch`. +Search for available devices matching the given filters. Since we have no UI +here, Espruino will pick the FIRST device it finds, or it'll call `catch`. `options` can have the following fields: -* `filters` - a list of filters that a device must match before it is returned (see below) -* `timeout` - the maximum time to scan for in milliseconds (scanning stops when a match -is found. eg. `NRF.requestDevice({ timeout:2000, filters: [ ... ] })` -* `active` - whether to perform active scanning (requesting 'scan response' packets from any -devices that are found). eg. `NRF.requestDevice({ active:true, filters: [ ... ] })` -* `phy` - (NRF52840 only) use the long-range coded phy (`"1mbps"` default, can be `"1mbps/2mbps/both/coded"`) -* `extended` - (NRF52840 only) support receiving extended-length advertising packets (default=true if phy isn't `"1mbps"`) +* `filters` - a list of filters that a device must match before it is returned + (see below) +* `timeout` - the maximum time to scan for in milliseconds (scanning stops when +a match is found. eg. `NRF.requestDevice({ timeout:2000, filters: [ ... ] })` +* `active` - whether to perform active scanning (requesting 'scan response' +packets from any devices that are found). eg. `NRF.requestDevice({ active:true, +filters: [ ... ] })` +* `phy` - (NRF52840 only) use the long-range coded phy (`"1mbps"` default, can + be `"1mbps/2mbps/both/coded"`) +* `extended` - (NRF52840 only) support receiving extended-length advertising + packets (default=true if phy isn't `"1mbps"`) **NOTE:** `timeout` and `active` are not part of the Web Bluetooth standard. The following filter types are implemented: -* `services` - list of services as strings (all of which must match). 128 bit services must be in the form '01230123-0123-0123-0123-012301230123' +* `services` - list of services as strings (all of which must match). 128 bit + services must be in the form '01230123-0123-0123-0123-012301230123' * `name` - exact device name * `namePrefix` - starting characters of device name -* `id` - exact device address (`id:"e9:53:86:09:89:99 random"`) (this is Espruino-specific, and is not part of the Web Bluetooth spec) -* `serviceData` - an object containing service characteristics which must all match (`serviceData:{"1809":{}}`). Matching of actual service data is not supported yet. -* `manufacturerData` - an object containing manufacturer UUIDs which must all match (`manufacturerData:{0x0590:{}}`). Matching of actual manufacturer data is not supported yet. +* `id` - exact device address (`id:"e9:53:86:09:89:99 random"`) (this is + Espruino-specific, and is not part of the Web Bluetooth spec) +* `serviceData` - an object containing service characteristics which must all + match (`serviceData:{"1809":{}}`). Matching of actual service data is not + supported yet. +* `manufacturerData` - an object containing manufacturer UUIDs which must all + match (`manufacturerData:{0x0590:{}}`). Matching of actual manufacturer data + is not supported yet. ``` NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) { ... }); @@ -3052,11 +3096,13 @@ NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }]}).then( Note that you have to keep track of the `gatt` variable so that you can disconnect the Bluetooth connection when you're done. -**Note:** Using a filter in `NRF.requestDevice` filters each advertising packet individually. As -soon as a matching advertisement is received, `NRF.requestDevice` resolves the promise and stops -scanning. This means that if you filter based on a service UUID and a device advertises with multiple packets -(or a scan response when `active:true`) only the packet matching the filter is returned - you may not -get the device's name is that was in a separate packet. To aggregate multiple packets you can use `NRF.findDevices`. +**Note:** Using a filter in `NRF.requestDevice` filters each advertising packet +individually. As soon as a matching advertisement is received, +`NRF.requestDevice` resolves the promise and stops scanning. This means that if +you filter based on a service UUID and a device advertises with multiple packets +(or a scan response when `active:true`) only the packet matching the filter is +returned - you may not get the device's name is that was in a separate packet. +To aggregate multiple packets you can use `NRF.findDevices`. */ #if CENTRAL_LINK_COUNT>0 /// Called when we timeout waiting for a device @@ -3133,8 +3179,8 @@ JsVar *jswrap_ble_requestDevice(JsVar *options) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Connect to a BLE device by MAC address. Returns a promise, -the argument of which is the `BluetoothRemoteGATTServer` connection. +Connect to a BLE device by MAC address. Returns a promise, the argument of which +is the `BluetoothRemoteGATTServer` connection. ``` NRF.connect("aa:bb:cc:dd:ee").then(function(server) { @@ -3142,10 +3188,12 @@ NRF.connect("aa:bb:cc:dd:ee").then(function(server) { }); ``` -This has the same effect as calling `BluetoothDevice.gatt.connect` on a `BluetoothDevice` requested -using `NRF.requestDevice`. It just allows you to specify the address directly (without having to scan). +This has the same effect as calling `BluetoothDevice.gatt.connect` on a +`BluetoothDevice` requested using `NRF.requestDevice`. It just allows you to +specify the address directly (without having to scan). -You can use it as follows - this would connect to another Puck device and turn its LED on: +You can use it as follows - this would connect to another Puck device and turn +its LED on: ``` var gatt; @@ -3162,11 +3210,12 @@ NRF.connect("aa:bb:cc:dd:ee random").then(function(g) { }); ``` -**Note:** Espruino Bluetooth devices use a type of BLE address known as 'random static', -which is different to a 'public' address. To connect to an Espruino device you'll need -to use an address string of the form `"aa:bb:cc:dd:ee random"` rather than just -`"aa:bb:cc:dd:ee"`. If you scan for devices with `NRF.findDevices`/`NRF.setScan` then -addresses are already reported in the correct format. +**Note:** Espruino Bluetooth devices use a type of BLE address known as 'random +static', which is different to a 'public' address. To connect to an Espruino +device you'll need to use an address string of the form `"aa:bb:cc:dd:ee +random"` rather than just `"aa:bb:cc:dd:ee"`. If you scan for devices with +`NRF.findDevices`/`NRF.setScan` then addresses are already reported in the +correct format. */ JsVar *jswrap_ble_connect(JsVar *mac, JsVar *options) { #if CENTRAL_LINK_COUNT>0 @@ -3195,14 +3244,13 @@ JsVar *jswrap_ble_connect(JsVar *mac, JsVar *options) { ["whitelisting","bool","Are we using a whitelist? (default false)"] ] } -If set to true, whenever a device bonds it will be added to the -whitelist. +If set to true, whenever a device bonds it will be added to the whitelist. -When set to false, the whitelist is cleared and newly bonded -devices will not be added to the whitelist. +When set to false, the whitelist is cleared and newly bonded devices will not be +added to the whitelist. -**Note:** This is remembered between `reset()`s but isn't -remembered after power-on (you'll have to add it to `onInit()`. +**Note:** This is remembered between `reset()`s but isn't remembered after +power-on (you'll have to add it to `onInit()`. */ void jswrap_ble_setWhitelist(bool whitelist) { #if PEER_MANAGER_ENABLED @@ -3220,29 +3268,32 @@ void jswrap_ble_setWhitelist(bool whitelist) { ["interval","JsVar","The connection interval to use (see below)"] ] } -When connected, Bluetooth LE devices communicate at a set interval. -Lowering the interval (eg. more packets/second) means a lower delay when -sending data, higher bandwidth, but also more power consumption. +When connected, Bluetooth LE devices communicate at a set interval. Lowering the +interval (eg. more packets/second) means a lower delay when sending data, higher +bandwidth, but also more power consumption. By default, when connected as a peripheral Espruino automatically adjusts the -connection interval. When connected it's as fast as possible (7.5ms) but when idle -for over a minute it drops to 200ms. On continued activity (>1 BLE operation) the -interval is raised to 7.5ms again. +connection interval. When connected it's as fast as possible (7.5ms) but when +idle for over a minute it drops to 200ms. On continued activity (>1 BLE +operation) the interval is raised to 7.5ms again. The options for `interval` are: * `undefined` / `"auto"` : (default) automatically adjust connection interval -* `100` : set min and max connection interval to the same number (between 7.5ms and 4000ms) -* `{minInterval:20, maxInterval:100}` : set min and max connection interval as a range +* `100` : set min and max connection interval to the same number (between 7.5ms + and 4000ms) +* `{minInterval:20, maxInterval:100}` : set min and max connection interval as a + range -This configuration is not remembered during a `save()` - you will have to -re-set it via `onInit`. +This configuration is not remembered during a `save()` - you will have to re-set +it via `onInit`. -**Note:** If connecting to another device (as Central), you can use -an extra argument to `NRF.connect` or `BluetoothRemoteGATTServer.connect` -to specify a connection interval. +**Note:** If connecting to another device (as Central), you can use an extra +argument to `NRF.connect` or `BluetoothRemoteGATTServer.connect` to specify a +connection interval. -**Note:** This overwrites any changes imposed by the deprecated `NRF.setLowPowerConnection` +**Note:** This overwrites any changes imposed by the deprecated +`NRF.setLowPowerConnection` */ void jswrap_ble_setConnectionInterval(JsVar *interval) { #if NRF52_SERIES @@ -3274,8 +3325,8 @@ void jswrap_ble_setConnectionInterval(JsVar *interval) { ["options","JsVar","An object containing security-related options (see below)"] ] } -Sets the security options used when connecting/pairing. This applies to both central -*and* peripheral mode. +Sets the security options used when connecting/pairing. This applies to both +central *and* peripheral mode. ``` NRF.setSecurity({ @@ -3297,8 +3348,8 @@ NRF.setSecurity({ **NOTE:** Some combinations of arguments will cause an error. For example supplying a passkey without `display:1` is not allowed. If `display:1` is set -you do not require a physical display, the user just needs to know -the passkey you supplied. +you do not require a physical display, the user just needs to know the passkey +you supplied. For instance, to require pairing and to specify a passkey, use: @@ -3306,16 +3357,15 @@ For instance, to require pairing and to specify a passkey, use: NRF.setSecurity({passkey:"123456", mitm:1, display:1}); ``` -However, while most devices will request a passkey for pairing at -this point it is still possible for a device to connect without -requiring one (eg. using the 'NRF Connect' app). +However, while most devices will request a passkey for pairing at this point it +is still possible for a device to connect without requiring one (eg. using the +'NRF Connect' app). -To force a passkey you need to protect each characteristic -you define with `NRF.setSecurity`. For instance the following -code will *require* that the passkey `123456` is entered -before the characteristic `9d020002-bf5f-1d1a-b52a-fe52091d5b12` -can be read. +To force a passkey you need to protect each characteristic you define with +`NRF.setSecurity`. For instance the following code will *require* that the +passkey `123456` is entered before the characteristic +`9d020002-bf5f-1d1a-b52a-fe52091d5b12` can be read. ``` NRF.setSecurity({passkey:"123456", mitm:1, display:1}); @@ -3356,8 +3406,9 @@ NRF.setServices({ }); ``` -**Note:** If `passkey` or `oob` is specified, the Nordic UART service (if enabled) -will automatically be set to require encryption, but otherwise it is open. +**Note:** If `passkey` or `oob` is specified, the Nordic UART service (if +enabled) will automatically be set to require encryption, but otherwise it is +open. */ void jswrap_ble_setSecurity(JsVar *options) { if (!jsvIsObject(options) && !jsvIsUndefined(options)) @@ -3379,8 +3430,8 @@ void jswrap_ble_setSecurity(JsVar *options) { "generate" : "jswrap_ble_getSecurityStatus", "return" : ["JsVar", "An object" ] } -Return an object with information about the security -state of the current peripheral connection: +Return an object with information about the security state of the current +peripheral connection: ``` { @@ -3426,7 +3477,8 @@ JsVar *jswrap_ble_startBonding(bool forceRePair) { "class" : "BluetoothDevice", "ifdef" : "NRF52_SERIES" } -A Web Bluetooth-style device - you can request one using `NRF.requestDevice(address)` +A Web Bluetooth-style device - you can request one using +`NRF.requestDevice(address)` For example: @@ -3491,7 +3543,8 @@ JsVar *jswrap_BluetoothDevice_gatt(JsVar *parent) { } Called when the device pairs and sends a passkey that Espruino should display. -For this to be used, you'll have to specify that there's a display using `NRF.setSecurity` +For this to be used, you'll have to specify that there's a display using +`NRF.setSecurity` **This is not part of the Web Bluetooth Specification.** It has been added specifically for Espruino. @@ -3502,11 +3555,14 @@ specifically for Espruino. "name" : "passkeyRequest", "ifdef" : "NRF52_SERIES" } -Called when the device pairs, displays a passkey, and wants Espruino to tell it what the passkey was. +Called when the device pairs, displays a passkey, and wants Espruino to tell it +what the passkey was. -Respond with `BluetoothDevice.sendPasskey()` with a 6 character string containing only `0..9`. +Respond with `BluetoothDevice.sendPasskey()` with a 6 character string +containing only `0..9`. -For this to be used, you'll have to specify that there's a keyboard using `NRF.setSecurity` +For this to be used, you'll have to specify that there's a keyboard using +`NRF.setSecurity` **This is not part of the Web Bluetooth Specification.** It has been added specifically for Espruino. @@ -3521,7 +3577,8 @@ specifically for Espruino. ["passkey","JsVar","A 6 character numeric String to be returned to the device"] ] } -To be used as a response when the event `BluetoothDevice.sendPasskey` has been received. +To be used as a response when the event `BluetoothDevice.sendPasskey` has been +received. **This is not part of the Web Bluetooth Specification.** It has been added specifically for Espruino. @@ -3550,8 +3607,8 @@ void jswrap_ble_BluetoothDevice_sendPasskey(JsVar *parent, JsVar *passkeyVar) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Connect to a BLE device - returns a promise, -the argument of which is the `BluetoothRemoteGATTServer` connection. +Connect to a BLE device - returns a promise, the argument of which is the +`BluetoothRemoteGATTServer` connection. See [`NRF.requestDevice`](/Reference#l_NRF_requestDevice) for usage examples. @@ -3564,9 +3621,9 @@ See [`NRF.requestDevice`](/Reference#l_NRF_requestDevice) for usage examples. } ``` -By default the interval is 20-200ms (or 500-1000ms if `NRF.setLowPowerConnection(true)` was called. -During connection Espruino negotiates with the other device to find a common interval that can be -used. +By default the interval is 20-200ms (or 500-1000ms if +`NRF.setLowPowerConnection(true)` was called. During connection Espruino +negotiates with the other device to find a common interval that can be used. For instance calling: @@ -3576,12 +3633,13 @@ NRF.requestDevice({ filters: [{ namePrefix: 'Pixl.js' }] }).then(function(device }).then(function(g) { ``` -will force the connection to use the fastest connection interval possible (as long as the device -at the other end supports it). +will force the connection to use the fastest connection interval possible (as +long as the device at the other end supports it). -**Note:** The Web Bluetooth spec states that if a device hasn't advertised its name, when connected -to a device the central (in this case Espruino) should automatically retrieve the name from the -corresponding characteristic (`0x2a00` on service `0x1800`). Espruino does not automatically do this. +**Note:** The Web Bluetooth spec states that if a device hasn't advertised its +name, when connected to a device the central (in this case Espruino) should +automatically retrieve the name from the corresponding characteristic (`0x2a00` +on service `0x1800`). Espruino does not automatically do this. */ #if CENTRAL_LINK_COUNT>0 @@ -3637,8 +3695,8 @@ JsVar *jswrap_ble_BluetoothRemoteGATTServer_connect(JsVar *parent, JsVar *option "class" : "BluetoothRemoteGATTServer", "#if" : "defined(NRF52_SERIES) || defined(ESP32)" } -Web Bluetooth-style GATT server - get this using `NRF.connect(address)` -or `NRF.requestDevice(options)` and `response.gatt.connect` +Web Bluetooth-style GATT server - get this using `NRF.connect(address)` or +`NRF.requestDevice(options)` and `response.gatt.connect` https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattserver */ @@ -3668,13 +3726,13 @@ or `NRF.requestDevice(options)` and `response.gatt.connect` "#if" : "defined(NRF52_SERIES) || defined(ESP32)" } Disconnect from a previously connected BLE device connected with -`BluetoothRemoteGATTServer.connect` - this does not disconnect from something that has -connected to the Espruino. +`BluetoothRemoteGATTServer.connect` - this does not disconnect from something +that has connected to the Espruino. -**Note:** While `.disconnect` is standard Web Bluetooth, in the spec it -returns undefined not a `Promise` for implementation reasons. In Espruino -we return a `Promise` to make it easier to detect when Espruino is free -to connect to something else. +**Note:** While `.disconnect` is standard Web Bluetooth, in the spec it returns +undefined not a `Promise` for implementation reasons. In Espruino we return a +`Promise` to make it easier to detect when Espruino is free to connect to +something else. */ JsVar *jswrap_BluetoothRemoteGATTServer_disconnect(JsVar *parent) { #if CENTRAL_LINK_COUNT>0 @@ -3723,8 +3781,8 @@ JsVar *jswrap_BluetoothRemoteGATTServer_disconnect(JsVar *parent) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the bonding is complete" ], "return_object" : "Promise" } -Start negotiating bonding (secure communications) with the connected device, -and return a Promise that is completed on success or failure. +Start negotiating bonding (secure communications) with the connected device, and +return a Promise that is completed on success or failure. ``` var gatt; @@ -3769,8 +3827,8 @@ JsVar *jswrap_ble_BluetoothRemoteGATTServer_startBonding(JsVar *parent, bool for "generate" : "jswrap_ble_BluetoothRemoteGATTServer_getSecurityStatus", "return" : ["JsVar", "An object" ] } -Return an object with information about the security -state of the current connection: +Return an object with information about the security state of the current +connection: ``` @@ -3782,8 +3840,8 @@ state of the current connection: } ``` -See `BluetoothRemoteGATTServer.startBonding` for information about -negotiating a secure connection. +See `BluetoothRemoteGATTServer.startBonding` for information about negotiating a +secure connection. **This is not part of the Web Bluetooth Specification.** It has been added specifically for Puck.js. @@ -3909,7 +3967,8 @@ void jswrap_BluetoothRemoteGATTServer_setRSSIHandler(JsVar *parent, JsVar *callb "class" : "BluetoothRemoteGATTService", "#if" : "defined(NRF52_SERIES) || defined(ESP32)" } -Web Bluetooth-style GATT service - get this using `BluetoothRemoteGATTServer.getPrimaryService(s)` +Web Bluetooth-style GATT service - get this using +`BluetoothRemoteGATTServer.getPrimaryService(s)` https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattservice */ @@ -3988,7 +4047,8 @@ JsVar *jswrap_BluetoothRemoteGATTService_getCharacteristics(JsVar *parent) { "class" : "BluetoothRemoteGATTCharacteristic", "#if" : "defined(NRF52_SERIES) || defined(ESP32)" } -Web Bluetooth-style GATT characteristic - get this using `BluetoothRemoteGATTService.getCharacteristic(s)` +Web Bluetooth-style GATT characteristic - get this using +`BluetoothRemoteGATTService.getCharacteristic(s)` https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattcharacteristic */ @@ -4102,8 +4162,9 @@ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_readValue(JsVar *characteris "return_object" : "Promise", "ifdef" : "NRF52_SERIES" } -Starts notifications - whenever this characteristic's value changes, a `characteristicvaluechanged` event is fired -and `characteristic.value` will then contain the new value as a `DataView`. +Starts notifications - whenever this characteristic's value changes, a +`characteristicvaluechanged` event is fired and `characteristic.value` will then +contain the new value as a `DataView`. ``` var device; @@ -4125,8 +4186,8 @@ NRF.connect(device_address).then(function(d) { }); ``` -For example, to listen to the output of another Puck.js's Nordic -Serial port service, you can use: +For example, to listen to the output of another Puck.js's Nordic Serial port +service, you can use: ``` var gatt; @@ -4190,7 +4251,8 @@ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_startNotifications(JsVar *ch "return_object" : "Promise", "ifdef" : "NRF52_SERIES" } -Stop notifications (that were requested with `BluetoothRemoteGATTCharacteristic.startNotifications`) +Stop notifications (that were requested with +`BluetoothRemoteGATTCharacteristic.startNotifications`) */ JsVar *jswrap_ble_BluetoothRemoteGATTCharacteristic_stopNotifications(JsVar *characteristic) { #if CENTRAL_LINK_COUNT>0 diff --git a/libs/compression/jswrap_heatshrink.c b/libs/compression/jswrap_heatshrink.c index bc765a197f..017cea5b84 100644 --- a/libs/compression/jswrap_heatshrink.c +++ b/libs/compression/jswrap_heatshrink.c @@ -25,11 +25,17 @@ "class" : "heatshrink", "ifndef" : "SAVE_ON_FLASH" } -Simple library for compression/decompression using [heatshrink](https://github.com/atomicobject/heatshrink), an [LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) compression tool. +Simple library for compression/decompression using +[heatshrink](https://github.com/atomicobject/heatshrink), an +[LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) +compression tool. -Espruino uses heatshrink internally to compress RAM down to fit in Flash memory when `save()` is used. This just exposes that functionality. +Espruino uses heatshrink internally to compress RAM down to fit in Flash memory +when `save()` is used. This just exposes that functionality. -Functions here take and return buffers of data. There is no support for streaming, so both the compressed and decompressed data must be able to fit in memory at the same time. +Functions here take and return buffers of data. There is no support for +streaming, so both the compressed and decompressed data must be able to fit in +memory at the same time. */ diff --git a/libs/crypto/jswrap_crypto.c b/libs/crypto/jswrap_crypto.c index 5a6b94412d..18ea724272 100644 --- a/libs/crypto/jswrap_crypto.c +++ b/libs/crypto/jswrap_crypto.c @@ -45,7 +45,9 @@ } Cryptographic functions -**Note:** This library is currently only included in builds for boards where there is space. For other boards there is `crypto.js` which implements SHA1 in JS. +**Note:** This library is currently only included in builds for boards where +there is space. For other boards there is `crypto.js` which implements SHA1 in +JS. */ @@ -57,7 +59,9 @@ Cryptographic functions } Class containing AES encryption/decryption -**Note:** This library is currently only included in builds for boards where there is space. For other boards there is `crypto.js` which implements SHA1 in JS. +**Note:** This library is currently only included in builds for boards where +there is space. For other boards there is `crypto.js` which implements SHA1 in +JS. */ /*JSON{ "type" : "staticproperty", @@ -190,9 +194,9 @@ JsVar *jswrap_crypto_SHAx(JsVar *message, int shaNum) { Performs a SHA1 hash and returns the result as a 20 byte ArrayBuffer. -**Note:** On some boards (currently only Espruino Original) there -isn't space for a fully unrolled SHA1 implementation so a slower -all-JS implementation is used instead. +**Note:** On some boards (currently only Espruino Original) there isn't space +for a fully unrolled SHA1 implementation so a slower all-JS implementation is +used instead. */ /*JSON{ "type" : "staticmethod", diff --git a/libs/filesystem/jswrap_file.c b/libs/filesystem/jswrap_file.c index d4e0841ea7..4888562317 100755 --- a/libs/filesystem/jswrap_file.c +++ b/libs/filesystem/jswrap_file.c @@ -119,7 +119,8 @@ bool jsfsInit() { ["csPin","pin","The pin to use for Chip Select"] ] } -Setup the filesystem so that subsequent calls to `E.openFile` and `require('fs').*` will use an SD card on the supplied SPI device and pin. +Setup the filesystem so that subsequent calls to `E.openFile` and +`require('fs').*` will use an SD card on the supplied SPI device and pin. It can even work using software SPI - for instance: @@ -136,11 +137,12 @@ console.log(require("fs").readdirSync()); See [the page on File IO](http://www.espruino.com/File+IO) for more information. -**Note:** We'd strongly suggest you add a pullup resistor from CD/CS pin to 3.3v. It is -good practise to avoid accidental writes before Espruino is initialised, and some cards -will not work reliably without one. +**Note:** We'd strongly suggest you add a pullup resistor from CD/CS pin to +3.3v. It is good practise to avoid accidental writes before Espruino is +initialised, and some cards will not work reliably without one. -**Note:** If you want to remove an SD card after you have started using it, you *must* call `E.unmountSD()` or you may cause damage to the card. +**Note:** If you want to remove an SD card after you have started using it, you +*must* call `E.unmountSD()` or you may cause damage to the card. */ void jswrap_E_connectSDCard(JsVar *spi, Pin csPin) { #ifdef SD_CARD_ANYWHERE @@ -165,11 +167,16 @@ void jswrap_E_connectSDCard(JsVar *spi, Pin csPin) { "type" : "class", "class" : "File" } -This is the File object - it allows you to stream data to and from files (As opposed to the `require('fs').readFile(..)` style functions that read an entire file). +This is the File object - it allows you to stream data to and from files (As +opposed to the `require('fs').readFile(..)` style functions that read an entire +file). -To create a File object, you must type ```var fd = E.openFile('filepath','mode')``` - see [E.openFile](#l_E_openFile) for more information. +To create a File object, you must type ```var fd = +E.openFile('filepath','mode')``` - see [E.openFile](#l_E_openFile) for more +information. -**Note:** If you want to remove an SD card after you have started using it, you *must* call `E.unmountSD()` or you may cause damage to the card. +**Note:** If you want to remove an SD card after you have started using it, you +*must* call `E.unmountSD()` or you may cause damage to the card. */ static JsVar* fsGetArray(bool create) { @@ -227,7 +234,9 @@ void jswrap_file_kill() { "name" : "unmountSD", "generate" : "jswrap_E_unmountSD" } -Unmount the SD card, so it can be removed. If you remove the SD card without calling this you may cause corruption, and you will be unable to access another SD card until you reset Espruino or call `E.unmountSD()`. +Unmount the SD card, so it can be removed. If you remove the SD card without +calling this you may cause corruption, and you will be unable to access another +SD card until you reset Espruino or call `E.unmountSD()`. */ void jswrap_E_unmountSD() { jswrap_file_kill(); @@ -394,12 +403,11 @@ void jswrap_file_close(JsVar* parent) { } Write data to a file. -**Note:** By default this function flushes all changes to the -SD card, which makes it slow (but also safe!). You can use -`E.setFlags({unsyncFiles:1})` to disable this behaviour and -really speed up writes - but then you must be sure to close -all files you are writing before power is lost or you will -cause damage to your SD card's filesystem. +**Note:** By default this function flushes all changes to the SD card, which +makes it slow (but also safe!). You can use `E.setFlags({unsyncFiles:1})` to +disable this behaviour and really speed up writes - but then you must be sure to +close all files you are writing before power is lost or you will cause damage to +your SD card's filesystem. */ size_t jswrap_file_write(JsVar* parent, JsVar* buffer) { if (!buffer) return 0; @@ -598,8 +606,8 @@ Pipe this file to a stream (an object with a 'write' method) ], "return" : ["bool","True on success, or false on failure"] } -Change the parameters used for the flash filesystem. -The default address is the last 1Mb of 4Mb Flash, 0x300000, with total size of 1Mb. +Change the parameters used for the flash filesystem. The default address is the +last 1Mb of 4Mb Flash, 0x300000, with total size of 1Mb. Before first use the media needs to be formatted. @@ -615,8 +623,9 @@ fs.writeFileSync("bang.txt", "This is the way the world ends\nnot with a bang bu fs.readdirSync(); ``` -This will create a drive of 100 * 4096 bytes at 0x300000. Be careful with the selection of flash addresses as you can overwrite firmware! -You only need to format once, as each will erase the content. +This will create a drive of 100 * 4096 bytes at 0x300000. Be careful with the +selection of flash addresses as you can overwrite firmware! You only need to +format once, as each will erase the content. `E.flashFatFS({ addr:0x300000,sectors:100,format:true });` */ diff --git a/libs/filesystem/jswrap_fs.c b/libs/filesystem/jswrap_fs.c index bfae83a008..89a3d6b849 100755 --- a/libs/filesystem/jswrap_fs.c +++ b/libs/filesystem/jswrap_fs.c @@ -35,13 +35,20 @@ "type" : "library", "class" : "fs" } -This library handles interfacing with a FAT32 filesystem on an SD card. The API is designed to be similar to node.js's - However Espruino does not currently support asynchronous file IO, so the functions behave like node.js's xxxxSync functions. Versions of the functions with 'Sync' after them are also provided for compatibility. +This library handles interfacing with a FAT32 filesystem on an SD card. The API +is designed to be similar to node.js's - However Espruino does not currently +support asynchronous file IO, so the functions behave like node.js's xxxxSync +functions. Versions of the functions with 'Sync' after them are also provided +for compatibility. -To use this, you must type ```var fs = require('fs')``` to get access to the library +To use this, you must type ```var fs = require('fs')``` to get access to the +library -See [the page on File IO](http://www.espruino.com/File+IO) for more information, and for examples on wiring up an SD card if your device doesn't come with one. +See [the page on File IO](http://www.espruino.com/File+IO) for more information, +and for examples on wiring up an SD card if your device doesn't come with one. -**Note:** If you want to remove an SD card after you have started using it, you *must* call `E.unmountSD()` or you may cause damage to the card. +**Note:** If you want to remove an SD card after you have started using it, you +*must* call `E.unmountSD()` or you may cause damage to the card. */ #ifndef LINUX @@ -78,7 +85,8 @@ extern void jsfsReportError(const char *msg, FRESULT res); } List all files in the supplied directory, returning them as an array of strings. -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", @@ -160,7 +168,8 @@ JsVar *jswrap_fs_readdir(JsVar *path) { } Write the data to the given file -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", @@ -189,7 +198,8 @@ Write the data to the given file } Append the data to the given file, created a new file if it doesn't exist -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", @@ -229,7 +239,8 @@ bool jswrap_fs_writeOrAppendFile(JsVar *path, JsVar *data, bool append) { } Read all data from a file and return as a string -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", @@ -244,7 +255,8 @@ NOTE: Espruino does not yet support Async file IO, so this function behaves like } Read all data from a file and return as a string. -**Note:** The size of files you can load using this method is limited by the amount of available RAM. To read files a bit at a time, see the `File` class. +**Note:** The size of files you can load using this method is limited by the +amount of available RAM. To read files a bit at a time, see the `File` class. */ JsVar *jswrap_fs_readFile(JsVar *path) { JsVar *fMode = jsvNewFromString("r"); @@ -270,7 +282,8 @@ JsVar *jswrap_fs_readFile(JsVar *path) { } Delete the given file -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", @@ -320,8 +333,7 @@ bool jswrap_fs_unlink(JsVar *path) { Return information on the given file. This returns an object with the following fields: -size: size in bytes -dir: a boolean specifying if the file is a directory or not +size: size in bytes dir: a boolean specifying if the file is a directory or not mtime: A Date structure specifying the time the file was last modified */ JsVar *jswrap_fs_stat(JsVar *path) { @@ -384,7 +396,8 @@ JsVar *jswrap_fs_stat(JsVar *path) { } Create the directory -NOTE: Espruino does not yet support Async file IO, so this function behaves like the 'Sync' version. +NOTE: Espruino does not yet support Async file IO, so this function behaves like +the 'Sync' version. */ /*JSON{ "type" : "staticmethod", diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index f413327488..7945620d80 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -417,9 +417,13 @@ NO_INLINE void _jswrap_drawImageSimple(JsGraphics *gfx, int xPos, int yPos, GfxD } This class provides Graphics operations that can be applied to a surface. -Use Graphics.createXXX to create a graphics object that renders in the way you want. See [the Graphics page](https://www.espruino.com/Graphics) for more information. +Use Graphics.createXXX to create a graphics object that renders in the way you +want. See [the Graphics page](https://www.espruino.com/Graphics) for more +information. -**Note:** On boards that contain an LCD, there is a built-in 'LCD' object of type Graphics. For instance to draw a line you'd type: ```LCD.drawLine(0,0,100,100)``` +**Note:** On boards that contain an LCD, there is a built-in 'LCD' object of +type Graphics. For instance to draw a line you'd type: +```LCD.drawLine(0,0,100,100)``` */ /*JSON{ @@ -428,28 +432,23 @@ Use Graphics.createXXX to create a graphics object that renders in the way you w "params" : [ ["all","bool","[optional] (only on some devices) If `true` then copy all pixels, not just those that have changed."] ], "name" : "flip" } -On instances of graphics that drive a display with -an offscreen buffer, calling this function will -copy the contents of the offscreen buffer to the -screen. +On instances of graphics that drive a display with an offscreen buffer, calling +this function will copy the contents of the offscreen buffer to the screen. -Call this when you have drawn something to Graphics -and you want it shown on the screen. +Call this when you have drawn something to Graphics and you want it shown on the +screen. -If a display does not have an offscreen buffer, -it may not have a `g.flip()` method. +If a display does not have an offscreen buffer, it may not have a `g.flip()` +method. -On Bangle.js 1, there are different graphics modes -chosen with `Bangle.setLCDMode()`. The default mode -is unbuffered and in this mode `g.flip()` does not -affect the screen contents. +On Bangle.js 1, there are different graphics modes chosen with +`Bangle.setLCDMode()`. The default mode is unbuffered and in this mode +`g.flip()` does not affect the screen contents. -On some devices, this command will attempt to -only update the areas of the screen that have -changed in order to increase speed. If you have -accessed the `Graphics.buffer` directly then you -may need to use `Graphics.flip(true)` to force -a full update of the screen. +On some devices, this command will attempt to only update the areas of the +screen that have changed in order to increase speed. If you have accessed the +`Graphics.buffer` directly then you may need to use `Graphics.flip(true)` to +force a full update of the screen. */ /*JSON{ "type" : "property", @@ -458,9 +457,8 @@ a full update of the screen. "return" : ["JsVar","An ArrayBuffer (or not defined on Graphics instances not created with `Graphics.createArrayBuffer`)"], "typescript" : "buffer: IsBuffer extends true ? ArrayBuffer : undefined" } -On Graphics instances with an offscreen buffer, this -is an `ArrayBuffer` that provides access to the underlying -pixel data. +On Graphics instances with an offscreen buffer, this is an `ArrayBuffer` that +provides access to the underlying pixel data. ``` g=Graphics.createArrayBuffer(8,8,8) @@ -532,9 +530,9 @@ void jswrap_graphics_init() { "return" : ["JsVar","An instance of `Graphics` or undefined"], "typescript" : "getInstance(): Graphics | undefined" } -On devices like Pixl.js or HYSTM boards that contain a built-in display -this will return an instance of the graphics class that can be used to -access that display. +On devices like Pixl.js or HYSTM boards that contain a built-in display this +will return an instance of the graphics class that can be used to access that +display. Internally, this is stored as a member called `gfx` inside the 'hiddenRoot'. */ @@ -568,7 +566,8 @@ static bool isValidBPP(int bpp) { "return_object" : "Graphics", "typescript" : "createArrayBuffer(width: number, height: number, bpp: number, options?: { zigzag?: boolean, vertical_byte?: boolean, msb?: boolean, color_order?: \"rgb\" | \"rbg\" | \"brg\" | \"bgr\" | \"grb\" | \"gbr\" }): Graphics;" } -Create a Graphics object that renders to an Array Buffer. This will have a field called 'buffer' that can get used to get at the buffer itself +Create a Graphics object that renders to an Array Buffer. This will have a field +called 'buffer' that can get used to get at the buffer itself */ JsVar *jswrap_graphics_createArrayBuffer(int width, int height, int bpp, JsVar *options) { if (width<=0 || height<=0 || width>32767 || height>32767) { @@ -648,7 +647,8 @@ JsVar *jswrap_graphics_createArrayBuffer(int width, int height, int bpp, JsVar * "return_object" : "Graphics", "typescript" : "createCallback(width: number, height: number, bpp: number, callback: ((x: number, y: number, col: number) => void) | { setPixel: (x: number, y: number, col: number) => void; fillRect: (x1: number, y1: number, x2: number, y2: number, col: number) => void }): Graphics;" } -Create a Graphics object that renders by calling a JavaScript callback function to draw pixels +Create a Graphics object that renders by calling a JavaScript callback function +to draw pixels */ JsVar *jswrap_graphics_createCallback(int width, int height, int bpp, JsVar *callback) { if (width<=0 || height<=0 || width>32767 || height>32767) { @@ -767,8 +767,8 @@ XXXXXXXXX g.drawImage(img, x,y); ``` -If the characters at the beginning and end of the string are newlines, they -will be ignored. Spaces are treated as `0`, and any other character is a `1` +If the characters at the beginning and end of the string are newlines, they will +be ignored. Spaces are treated as `0`, and any other character is a `1` */ JsVar *jswrap_graphics_createImage(JsVar *data) { if (!jsvIsString(data)) { @@ -865,10 +865,10 @@ int jswrap_graphics_getWidthOrHeight(JsVar *parent, bool height) { } The number of bits per pixel of this Graphics instance -**Note:** Bangle.js 2 behaves a little differently here. The display -is 3 bit, so `getBPP` returns 3 and `asBMP`/`asImage`/etc return 3 bit images. -However in order to allow dithering, the colors returned by `Graphics.getColor` and `Graphics.theme` -are actually 16 bits. +**Note:** Bangle.js 2 behaves a little differently here. The display is 3 bit, +so `getBPP` returns 3 and `asBMP`/`asImage`/etc return 3 bit images. However in +order to allow dithering, the colors returned by `Graphics.getColor` and +`Graphics.theme` are actually 16 bits. */ int jswrap_graphics_getBPP(JsVar *parent) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -887,8 +887,8 @@ int jswrap_graphics_getBPP(JsVar *parent) { "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" } -Reset the state of Graphics to the defaults (e.g. Color, Font, etc) -that would have been used when Graphics was initialised. +Reset the state of Graphics to the defaults (e.g. Color, Font, etc) that would +have been used when Graphics was initialised. */ JsVar *jswrap_graphics_reset(JsVar *parent) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -1547,17 +1547,18 @@ JsVarInt jswrap_graphics_getColorX(JsVar *parent, bool isForeground) { "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics" } -This sets the 'clip rect' that subsequent drawing operations are clipped to -sit between. +This sets the 'clip rect' that subsequent drawing operations are clipped to sit +between. These values are inclusive - e.g. `g.setClipRect(1,0,5,0)` will ensure that only pixel rows 1,2,3,4,5 are touched on column 0. -**Note:** For maximum flexibility on Bangle.js 1, the values here are not range checked. For normal -use, X and Y should be between 0 and `getWidth()-1`/`getHeight()-1`. +**Note:** For maximum flexibility on Bangle.js 1, the values here are not range +checked. For normal use, X and Y should be between 0 and +`getWidth()-1`/`getHeight()-1`. -**Note:** The x/y values here are rotated, so that if `Graphics.setRotation` is used -they correspond to the coordinates given to the draw functions, *not to the +**Note:** The x/y values here are rotated, so that if `Graphics.setRotation` is +used they correspond to the coordinates given to the draw functions, *not to the physical device pixels*. */ JsVar *jswrap_graphics_setClipRect(JsVar *parent, int x1, int y1, int x2, int y2) { @@ -1617,7 +1618,8 @@ It is recommended that you use `Graphics.setFont("4x6")` for more flexibility. } Make subsequent calls to `drawString` use a Vector Font of the given height. -It is recommended that you use `Graphics.setFont("Vector", size)` for more flexibility. +It is recommended that you use `Graphics.setFont("Vector", size)` for more +flexibility. */ JsVar *jswrap_graphics_setFontSizeX(JsVar *parent, int size, bool isVectorFont) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -1659,13 +1661,16 @@ JsVar *jswrap_graphics_setFontSizeX(JsVar *parent, int size, bool isVectorFont) "return_object" : "Graphics", "typescript" : "setFontCustom(bitmap: ArrayBuffer, firstChar: number, width: number | string, height: number): Graphics;" } -Make subsequent calls to `drawString` use a Custom Font of the given height. See the [Fonts page](http://www.espruino.com/Fonts) for more -information about custom fonts and how to create them. +Make subsequent calls to `drawString` use a Custom Font of the given height. See +the [Fonts page](http://www.espruino.com/Fonts) for more information about +custom fonts and how to create them. -For examples of use, see the [font modules](https://www.espruino.com/Fonts#font-modules). +For examples of use, see the [font +modules](https://www.espruino.com/Fonts#font-modules). -**Note:** while you can specify the character code of the first character with `firstChar`, -the newline character 13 will always be treated as a newline and not rendered. +**Note:** while you can specify the character code of the first character with +`firstChar`, the newline character 13 will always be treated as a newline and +not rendered. */ #ifndef SAVE_ON_FLASH JsVar *jswrap_graphics_setFontCustom(JsVar *parent, JsVar *bitmap, int firstChar, JsVar *width, int height) { @@ -1802,7 +1807,7 @@ You can also use these forms, but they are not recommended: `g.getFont()` will return the current font as a String. -For a list of available font names, you can use `g.getFonts()`. +For a list of available font names, you can use `g.getFonts()`. */ JsVar *jswrap_graphics_setFont(JsVar *parent, JsVar *fontId, int size) { @@ -1886,11 +1891,11 @@ JsVar *jswrap_graphics_setFont(JsVar *parent, JsVar *fontId, int size) { } Get the font by name - can be saved and used with `Graphics.setFont`. -Normally this might return something like `"4x6"`, but if a scale -factor is specified, a colon and then the size is reported, like "4x6:2" +Normally this might return something like `"4x6"`, but if a scale factor is +specified, a colon and then the size is reported, like "4x6:2" -**Note:** For custom fonts, `Custom` is currently -reported instead of the font name. +**Note:** For custom fonts, `Custom` is currently reported instead of the font +name. */ JsVar *jswrap_graphics_getFont(JsVar *parent) { #ifndef SAVE_ON_FLASH @@ -1939,8 +1944,8 @@ JsVar *jswrap_graphics_getFont(JsVar *parent) { } Return an array of all fonts currently in the Graphics library. -**Note:** Vector fonts are specified as `Vector#` where `#` is the font height. As there -are effectively infinite fonts, just `Vector` is included in the list. +**Note:** Vector fonts are specified as `Vector#` where `#` is the font height. +As there are effectively infinite fonts, just `Vector` is included in the list. */ void jswrap_graphics_getFonts_callback(void *cbdata, JsVar *key) { @@ -2284,9 +2289,9 @@ Draw a string of text in the current font. g.drawString("Hello World", 10, 10); ``` -Images may also be embedded inside strings (e.g. to render Emoji or characters not in the current font). -To do this, just add `0` then the image string ([about Images](http://www.espruino.com/Graphics#images-bitmaps)) -For example: +Images may also be embedded inside strings (e.g. to render Emoji or characters +not in the current font). To do this, just add `0` then the image string ([about +Images](http://www.espruino.com/Graphics#images-bitmaps)) For example: ``` g.drawString("Hi \0\7\5\1\x82 D\x17\xC0"); @@ -2603,7 +2608,8 @@ JsVar *jswrap_graphics_moveTo(JsVar *parent, int x, int y) { "return_object" : "Graphics", "typescript" : "drawPoly(poly: number[], closed?: boolean): Graphics;" } -Draw a polyline (lines between each of the points in `poly`) in the current foreground color +Draw a polyline (lines between each of the points in `poly`) in the current +foreground color **Note:** there is a limit of 64 points (128 XY elements) for polygons */ @@ -2621,7 +2627,8 @@ Draw a polyline (lines between each of the points in `poly`) in the current fore "return_object" : "Graphics", "typescript" : "drawPolyAA(poly: number[], closed?: boolean): Graphics;" } -Draw an **antialiased** polyline (lines between each of the points in `poly`) in the current foreground color +Draw an **antialiased** polyline (lines between each of the points in `poly`) in +the current foreground color **Note:** there is a limit of 64 points (128 XY elements) for polygons */ @@ -2700,10 +2707,10 @@ g.fillPoly([ 0, 27 ]); ``` -This fills from the top left hand side of the polygon (low X, low Y) -*down to but not including* the bottom right. When placed together polygons -will align perfectly without overdraw - but this will not fill the -same pixels as `drawPoly` (drawing a line around the edge of the polygon). +This fills from the top left hand side of the polygon (low X, low Y) *down to +but not including* the bottom right. When placed together polygons will align +perfectly without overdraw - but this will not fill the same pixels as +`drawPoly` (drawing a line around the edge of the polygon). **Note:** there is a limit of 64 points (128 XY elements) for polygons */ @@ -2732,10 +2739,10 @@ g.fillPolyAA([ 0, 27 ]); ``` -This fills from the top left hand side of the polygon (low X, low Y) -*down to but not including* the bottom right. When placed together polygons -will align perfectly without overdraw - but this will not fill the -same pixels as `drawPoly` (drawing a line around the edge of the polygon). +This fills from the top left hand side of the polygon (low X, low Y) *down to +but not including* the bottom right. When placed together polygons will align +perfectly without overdraw - but this will not fill the same pixels as +`drawPoly` (drawing a line around the edge of the polygon). **Note:** there is a limit of 64 points (128 XY elements) for polygons */ @@ -2832,11 +2839,13 @@ JsVar *jswrap_graphics_setRotation(JsVar *parent, int rotation, bool reflect) { "return" : ["JsVar","An object containing `{width,height,bpp,transparent}` for the image"], "typescript" : "imageMetrics(img: Image): { width: number, height: number, bpp: number, transparent: number, frames?: ArrayBuffer[] } | undefined;" } -Return the width and height in pixels of an image (either Graphics, Image Object, Image String or ArrayBuffer). Returns -`undefined` if image couldn't be decoded. +Return the width and height in pixels of an image (either Graphics, Image +Object, Image String or ArrayBuffer). Returns `undefined` if image couldn't be +decoded. -`frames` is also included is the image contains more information than you'd expect for a single bitmap. In -this case the bitmap might be an animation with multiple frames +`frames` is also included is the image contains more information than you'd +expect for a single bitmap. In this case the bitmap might be an animation with +multiple frames */ JsVar *jswrap_graphics_imageMetrics(JsVar *parent, JsVar *var) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -2874,21 +2883,32 @@ JsVar *jswrap_graphics_imageMetrics(JsVar *parent, JsVar *var) { } Image can be: -* An object with the following fields `{ width : int, height : int, bpp : optional int, buffer : ArrayBuffer/String, transparent: optional int, palette : optional Uint16Array(2/4/16) }`. bpp = bits per pixel (default is 1), transparent (if defined) is the colour that will be treated as transparent, and palette is a color palette that each pixel will be looked up in first -* A String where the the first few bytes are: `width,height,bpp,[transparent,]image_bytes...`. If a transparent colour is specified the top bit of `bpp` should be set. -* An ArrayBuffer Graphics object (if `bpp<8`, `msb:true` must be set) - this is disabled on devices without much flash memory available +* An object with the following fields `{ width : int, height : int, bpp : + optional int, buffer : ArrayBuffer/String, transparent: optional int, + palette : optional Uint16Array(2/4/16) }`. bpp = bits per pixel (default is + 1), transparent (if defined) is the colour that will be treated as + transparent, and palette is a color palette that each pixel will be looked up + in first +* A String where the the first few bytes are: + `width,height,bpp,[transparent,]image_bytes...`. If a transparent colour is + specified the top bit of `bpp` should be set. +* An ArrayBuffer Graphics object (if `bpp<8`, `msb:true` must be set) - this is + disabled on devices without much flash memory available Draw an image at the specified position. -* If the image is 1 bit, the graphics foreground/background colours will be used. -* If `img.palette` is a Uint16Array or 2/4/16 elements, color data will be looked from the supplied palette +* If the image is 1 bit, the graphics foreground/background colours will be + used. +* If `img.palette` is a Uint16Array or 2/4/16 elements, color data will be + looked from the supplied palette * On Bangle.js, 2 bit images blend from background(0) to foreground(1) colours * On Bangle.js, 4 bit images use the Apple Mac 16 color palette * On Bangle.js, 8 bit images use the Web Safe 216 color palette * Otherwise color data will be copied as-is. Bitmaps are rendered MSB-first -If `options` is supplied, `drawImage` will allow images to be rendered at any scale or angle. If `options.rotate` is set it will -center images at `x,y`. `options` must be an object of the form: +If `options` is supplied, `drawImage` will allow images to be rendered at any +scale or angle. If `options.rotate` is set it will center images at `x,y`. +`options` must be an object of the form: ``` { @@ -3223,9 +3243,10 @@ JsVar *jswrap_graphics_drawImages(JsVar *parent, JsVar *layersVar, JsVar *option "asImage(type: \"string\"): string;" ] } -Return this Graphics object as an Image that can be used with `Graphics.drawImage`. -Check out [the Graphics reference page](http://www.espruino.com/Graphics#images-bitmaps) -for more information on images. +Return this Graphics object as an Image that can be used with +`Graphics.drawImage`. Check out [the Graphics reference +page](http://www.espruino.com/Graphics#images-bitmaps) for more information on +images. Will return undefined if data can't be allocated for the image. @@ -3236,8 +3257,7 @@ The image data itself will be referenced rather than copied if: * Is 8 bpp *OR* the `{msb:true}` option was given * No other format options (zigzag/etc) were given -Otherwise data will be copied, which takes up more space and -may be quite slow. +Otherwise data will be copied, which takes up more space and may be quite slow. */ JsVar *jswrap_graphics_asImage(JsVar *parent, JsVar *imgType) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -3332,10 +3352,11 @@ JsVar *jswrap_graphics_asImage(JsVar *parent, JsVar *imgType) { "return" : ["JsVar","An object {x1,y1,x2,y2} containing the modified area, or undefined if not modified"], "typescript" : "getModified(reset?: boolean): { x1: number, y1: number, x2: number, y2: number };" } -Return the area of the Graphics canvas that has been modified, and optionally clear -the modified area to 0. +Return the area of the Graphics canvas that has been modified, and optionally +clear the modified area to 0. -For instance if `g.setPixel(10,20)` was called, this would return `{x1:10, y1:20, x2:10, y2:20}` +For instance if `g.setPixel(10,20)` was called, this would return `{x1:10, +y1:20, x2:10, y2:20}` */ JsVar *jswrap_graphics_getModified(JsVar *parent, bool reset) { #ifndef NO_MODIFIED_AREA @@ -3379,8 +3400,8 @@ JsVar *jswrap_graphics_getModified(JsVar *parent, bool reset) { Scroll the contents of this graphics in a certain direction. The remaining area is filled with the background color. -Note: This uses repeated pixel reads and writes, so will not work on platforms that -don't support pixel reads. +Note: This uses repeated pixel reads and writes, so will not work on platforms +that don't support pixel reads. */ JsVar *jswrap_graphics_scroll(JsVar *parent, int xdir, int ydir) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -3414,8 +3435,8 @@ g.blit({ }); ``` -Note: This uses repeated pixel reads and writes, so will not work on platforms that -don't support pixel reads. +Note: This uses repeated pixel reads and writes, so will not work on platforms +that don't support pixel reads. */ JsVar *jswrap_graphics_blit(JsVar *parent, JsVar *options) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -3486,7 +3507,8 @@ JsVar *jswrap_graphics_blit(JsVar *parent, JsVar *options) { "return" : ["JsVar","A String representing the Graphics as a Windows BMP file (or 'undefined' if not possible)"], "typescript" : "asBMP(): string;" } -Create a Windows BMP file from this Graphics instance, and return it as a String. +Create a Windows BMP file from this Graphics instance, and return it as a +String. */ JsVar *jswrap_graphics_asBMP(JsVar *parent) { JsGraphics gfx; if (!graphicsGetFromVar(&gfx, parent)) return 0; @@ -3604,9 +3626,11 @@ JsVar *jswrap_graphics_asBMP(JsVar *parent) { "return" : ["JsVar","A String representing the Graphics as a URL (or 'undefined' if not possible)"], "typescript" : "asURL(): string;" } -Create a URL of the form `data:image/bmp;base64,...` that can be pasted into the browser. +Create a URL of the form `data:image/bmp;base64,...` that can be pasted into the +browser. -The Espruino Web IDE can detect this data on the console and render the image inline automatically. +The Espruino Web IDE can detect this data on the console and render the image +inline automatically. */ JsVar *jswrap_graphics_asURL(JsVar *parent) { JsVar *imgData = jswrap_graphics_asBMP(parent); @@ -3626,12 +3650,17 @@ JsVar *jswrap_graphics_asURL(JsVar *parent) { "#if" : "!defined(SAVE_ON_FLASH) && !defined(ESPRUINOBOARD)", "generate" : "jswrap_graphics_dump" } -Output this image as a bitmap URL of the form `data:image/bmp;base64,...`. The Espruino Web IDE will detect this on the console and will render the image inline automatically. +Output this image as a bitmap URL of the form `data:image/bmp;base64,...`. The +Espruino Web IDE will detect this on the console and will render the image +inline automatically. -This is identical to `console.log(g.asURL())` - it is just a convenient function for easy debugging and producing screenshots of what is currently in the Graphics instance. +This is identical to `console.log(g.asURL())` - it is just a convenient function +for easy debugging and producing screenshots of what is currently in the +Graphics instance. -**Note:** This may not work on some bit depths of Graphics instances. It will also not work for the main Graphics instance -of Bangle.js 1 as the graphics on Bangle.js 1 are stored in write-only memory. +**Note:** This may not work on some bit depths of Graphics instances. It will +also not work for the main Graphics instance of Bangle.js 1 as the graphics on +Bangle.js 1 are stored in write-only memory. */ void jswrap_graphics_dump(JsVar *parent) { JsVar *url = jswrap_graphics_asURL(parent); @@ -3655,9 +3684,7 @@ void jswrap_graphics_dump(JsVar *parent) { } Calculate the square area under a Bezier curve. - x0,y0: start point - x1,y1: control point - y2,y2: end point + x0,y0: start point x1,y1: control point y2,y2: end point Max 10 points without start point. */ @@ -3835,11 +3862,14 @@ Returns an object of the form: } ``` -These values can then be passed to `g.setColor`/`g.setBgColor` for example `g.setColor(g.theme.fg2)`. When the Graphics -instance is reset, the background color is automatically set to `g.theme.bg` and foreground is set to `g.theme.fg`. +These values can then be passed to `g.setColor`/`g.setBgColor` for example +`g.setColor(g.theme.fg2)`. When the Graphics instance is reset, the background +color is automatically set to `g.theme.bg` and foreground is set to +`g.theme.fg`. -On Bangle.js these values can be changed by writing updated values to `theme` in `settings.js` and reloading the app - or they can -be changed temporarily by calling `Graphics.setTheme` +On Bangle.js these values can be changed by writing updated values to `theme` in +`settings.js` and reloading the app - or they can be changed temporarily by +calling `Graphics.setTheme` */ JsVar *jswrap_graphics_theme(JsVar *parent) { NOT_USED(parent); @@ -3871,10 +3901,11 @@ JsVar *jswrap_graphics_theme(JsVar *parent) { "return_object" : "Graphics", "typescript" : "setTheme(theme: { [key in keyof Theme]?: Theme[key] extends number ? ColorResolvable | Theme[key] }): Graphics;" } -Set the global colour scheme. On Bangle.js, this is reloaded from `settings.json` for each new app loaded. +Set the global colour scheme. On Bangle.js, this is reloaded from +`settings.json` for each new app loaded. -See `Graphics.theme` for the fields that can be provided. For instance you can change -the background to red using: +See `Graphics.theme` for the fields that can be provided. For instance you can +change the background to red using: ``` g.setTheme({bg:"#f00"}); diff --git a/libs/graphics/jswrap_terminal.c b/libs/graphics/jswrap_terminal.c index 4f1456d32c..992c01901e 100644 --- a/libs/graphics/jswrap_terminal.c +++ b/libs/graphics/jswrap_terminal.c @@ -28,9 +28,8 @@ } A simple VT100 terminal emulator. -When data is sent to the `Terminal` object, `Graphics.getInstance()` -is called and if an instance of `Graphics` is found then characters -are written to it. +When data is sent to the `Terminal` object, `Graphics.getInstance()` is called +and if an instance of `Graphics` is found then characters are written to it. */ #ifdef USE_FONT_6X8 diff --git a/libs/hexbadge/jswrap_hexbadge.c b/libs/hexbadge/jswrap_hexbadge.c index 7e3ffcbeb4..ad654571ef 100644 --- a/libs/hexbadge/jswrap_hexbadge.c +++ b/libs/hexbadge/jswrap_hexbadge.c @@ -178,7 +178,8 @@ Class containing utility functions for accessing IO on the hexagonal badge } Capacitive sense - the higher the capacitance, the higher the number returned. -Supply a corner number between 1 and 6, and an integer value will be returned that is proportional to the capacitance +Supply a corner number between 1 and 6, and an integer value will be returned +that is proportional to the capacitance */ int jswrap_badge_capSense(int corner) { if (corner>=1 && corner<=6) { @@ -194,8 +195,8 @@ int jswrap_badge_capSense(int corner) { "generate" : "jswrap_badge_getBatteryPercentage", "return" : ["int", "A percentage between 0 and 100" ] } -Return an approximate battery percentage remaining based on -a normal CR2032 battery (2.8 - 2.2v) +Return an approximate battery percentage remaining based on a normal CR2032 +battery (2.8 - 2.2v) */ int jswrap_badge_getBatteryPercentage() { JsVarFloat v = jswrap_ble_getBattery(); @@ -246,7 +247,7 @@ void badge_lcd_flip(JsVar *g) { ["c","float","Contrast between 0 and 1"] ] } -Set the LCD's contrast */ +Set the LCD's contrast*/ void jswrap_badge_setContrast(JsVarFloat c) { if (c<0) c=0; if (c>1) c=1; diff --git a/libs/math/jswrap_math.c b/libs/math/jswrap_math.c index 2b597abb78..95393fe7bb 100644 --- a/libs/math/jswrap_math.c +++ b/libs/math/jswrap_math.c @@ -458,7 +458,8 @@ double jswrap_math_sqrt(double x) { ], "return" : ["float","The value of x, clipped so as not to be below min or above max."] } -DEPRECATED - Please use `E.clip()` instead. Clip a number to be between min and max (inclusive) +DEPRECATED - Please use `E.clip()` instead. Clip a number to be between min and +max (inclusive) */ JsVarFloat jswrap_math_clip(JsVarFloat x, JsVarFloat min, JsVarFloat max) { if (x Wifi.soft_init\n"); @@ -1283,7 +1287,8 @@ void jswrap_ESP8266_wifi_soft_init() { } **DEPRECATED** - please use `Wifi.ping` instead. -Perform a network ping request. The parameter can be either a String or a numeric IP address. +Perform a network ping request. The parameter can be either a String or a +numeric IP address. */ void jswrap_wifi_ping( JsVar *ipAddr, //!< A string or integer representation of an IP address. diff --git a/libs/network/http/jswrap_http.c b/libs/network/http/jswrap_http.c index 6232bebd57..5ec2c7cd60 100644 --- a/libs/network/http/jswrap_http.c +++ b/libs/network/http/jswrap_http.c @@ -26,9 +26,12 @@ } This library allows you to create http servers and make http requests -In order to use this, you will need an extra module to get network connectivity such as the [TI CC3000](/CC3000) or [WIZnet W5500](/WIZnet). +In order to use this, you will need an extra module to get network connectivity +such as the [TI CC3000](/CC3000) or [WIZnet W5500](/WIZnet). -This is designed to be a cut-down version of the [node.js library](http://nodejs.org/api/http.html). Please see the [Internet](/Internet) page for more information on how to use it. +This is designed to be a cut-down version of the [node.js +library](http://nodejs.org/api/http.html). Please see the [Internet](/Internet) +page for more information on how to use it. */ /*JSON{ @@ -55,7 +58,9 @@ The HTTP server request ["data","JsVar","A string containing one or more characters of received data"] ] } -The 'data' event is called when data is received. If a handler is defined with `X.on('data', function(data) { ... })` then it will be called, otherwise data will be stored in an internal buffer, where it can be retrieved with `X.read()` +The 'data' event is called when data is received. If a handler is defined with +`X.on('data', function(data) { ... })` then it will be called, otherwise data +will be stored in an internal buffer, where it can be retrieved with `X.read()` */ /*JSON{ "type" : "event", @@ -104,7 +109,8 @@ The URL requested in this HTTP request, for instance: "generate" : "jswrap_stream_available", "return" : ["int","How many bytes are available"] } -Return how many bytes are available to read. If there is already a listener for data, this will always return 0. +Return how many bytes are available to read. If there is already a listener for +data, this will always return 0. */ /*JSON{ "type" : "method", @@ -144,7 +150,8 @@ The HTTP server response "class" : "httpSRs", "name" : "drain" } -An event that is fired when the buffer is empty and it can accept more data to send. +An event that is fired when the buffer is empty and it can accept more data to +send. */ /*JSON{ "type" : "event", @@ -166,14 +173,18 @@ The HTTP client request, returned by `http.request()` and `http.get()`. "class" : "httpCRq", "name" : "drain" } -An event that is fired when the buffer is empty and it can accept more data to send. +An event that is fired when the buffer is empty and it can accept more data to +send. */ /*JSON{ "type" : "event", "class" : "httpCRq", "name" : "error" } -An event that is fired if there is an error making the request and the response callback has not been invoked. In this case the error event concludes the request attempt. The error event function receives an error object as parameter with a `code` field and a `message` field. +An event that is fired if there is an error making the request and the response +callback has not been invoked. In this case the error event concludes the +request attempt. The error event function receives an error object as parameter +with a `code` field and a `message` field. */ /*JSON{ @@ -181,7 +192,8 @@ An event that is fired if there is an error making the request and the response "library" : "http", "class" : "httpCRs" } -The HTTP client response, passed to the callback of `http.request()` an `http.get()`. +The HTTP client response, passed to the callback of `http.request()` an +`http.get()`. */ /*JSON{ "type" : "event", @@ -191,21 +203,27 @@ The HTTP client response, passed to the callback of `http.request()` an `http.ge ["data","JsVar","A string containing one or more characters of received data"] ] } -The 'data' event is called when data is received. If a handler is defined with `X.on('data', function(data) { ... })` then it will be called, otherwise data will be stored in an internal buffer, where it can be retrieved with `X.read()` +The 'data' event is called when data is received. If a handler is defined with +`X.on('data', function(data) { ... })` then it will be called, otherwise data +will be stored in an internal buffer, where it can be retrieved with `X.read()` */ /*JSON{ "type" : "event", "class" : "httpCRs", "name" : "close" } -Called when the connection closes with one `hadError` boolean parameter, which indicates whether an error occurred. +Called when the connection closes with one `hadError` boolean parameter, which +indicates whether an error occurred. */ /*JSON{ "type" : "event", "class" : "httpCRs", "name" : "error" } -An event that is fired if there is an error receiving the response. The error event function receives an error object as parameter with a `code` field and a `message` field. After the error event the close even will also be triggered to conclude the HTTP request/response. +An event that is fired if there is an error receiving the response. The error +event function receives an error object as parameter with a `code` field and a +`message` field. After the error event the close even will also be triggered to +conclude the HTTP request/response. */ /*JSON{ "type" : "property", @@ -250,7 +268,8 @@ The HTTP version reported back by the server - usually `"1.1"` "generate" : "jswrap_stream_available", "return" : ["int","How many bytes are available"] } -Return how many bytes are available to read. If there is a 'data' event handler, this will always return 0. +Return how many bytes are available to read. If there is a 'data' event handler, +this will always return 0. */ /*JSON{ "type" : "method", @@ -300,7 +319,9 @@ Pipe this to a stream (an object with a 'write' method) } Create an HTTP Server -When a request to the server is made, the callback is called. In the callback you can use the methods on the response (`httpSRs`) to send data. You can also add `request.on('data',function() { ... })` to listen for POSTed data +When a request to the server is made, the callback is called. In the callback +you can use the methods on the response (`httpSRs`) to send data. You can also +add `request.on('data',function() { ... })` to listen for POSTed data */ JsVar *jswrap_http_createServer(JsVar *callback) { @@ -326,7 +347,8 @@ JsVar *jswrap_http_createServer(JsVar *callback) { "return" : ["JsVar","Returns a new httpCRq object"], "return_object" : "httpCRq" } -Create an HTTP Request - `end()` must be called on it to complete the operation. `options` is of the form: +Create an HTTP Request - `end()` must be called on it to complete the operation. +`options` is of the form: ``` var options = { @@ -349,12 +371,14 @@ var req = require("http").request(options, function(res) { req.end(); // called to finish the HTTP request and get the response ``` -You can easily pre-populate `options` from a URL using `var options = url.parse("http://www.example.com/foo.html")` +You can easily pre-populate `options` from a URL using `var options = +url.parse("http://www.example.com/foo.html")` -There's an example of using [`http.request` for HTTP POST here](/Internet#http-post) +There's an example of using [`http.request` for HTTP POST +here](/Internet#http-post) -**Note:** if TLS/HTTPS is enabled, options can have `ca`, `key` and `cert` fields. See `tls.connect` for -more information about these and how to use them. +**Note:** if TLS/HTTPS is enabled, options can have `ca`, `key` and `cert` +fields. See `tls.connect` for more information about these and how to use them. */ @@ -370,7 +394,8 @@ more information about these and how to use them. "return" : ["JsVar","Returns a new httpCRq object"], "return_object" : "httpCRq" } -Request a webpage over HTTP - a convenience function for `http.request()` that makes sure the HTTP command is 'GET', and that calls `end` automatically. +Request a webpage over HTTP - a convenience function for `http.request()` that +makes sure the HTTP command is 'GET', and that calls `end` automatically. ``` require("http").get("http://pur3.co.uk/hello.txt", function(res) { @@ -383,7 +408,8 @@ require("http").get("http://pur3.co.uk/hello.txt", function(res) { }); ``` -See `http.request()` and [the Internet page](/Internet) and ` for more usage examples. +See `http.request()` and [the Internet page](/Internet) and ` for more usage +examples. */ JsVar *jswrap_http_get(JsVar *options, JsVar *callback) { JsNetwork net; @@ -469,8 +495,9 @@ The default contents are: "return" : ["bool","For node.js compatibility, returns the boolean false. When the send buffer is empty, a `drain` event will be sent"] } This function writes the `data` argument as a string. Data that is passed in -(including arrays) will be converted to a string with the normal JavaScript -`toString` method. For more information about sending binary data see `Socket.write` +(including arrays) will be converted to a string with the normal JavaScript +`toString` method. For more information about sending binary data see +`Socket.write` */ bool jswrap_httpSRs_write(JsVar *parent, JsVar *data) { serverResponseWrite(parent, data); @@ -504,12 +531,11 @@ void jswrap_httpSRs_end(JsVar *parent, JsVar *data) { ["headers","JsVar","An object containing the headers"] ] } -Send the given status code and headers. If not explicitly called -this will be done automatically the first time data is written -to the response. +Send the given status code and headers. If not explicitly called this will be +done automatically the first time data is written to the response. -This cannot be called twice, or after data has already been sent -in the response. +This cannot be called twice, or after data has already been sent in the +response. */ void jswrap_httpSRs_writeHead(JsVar *parent, int statusCode, JsVar *headers) { serverResponseWriteHead(parent, statusCode, headers); @@ -525,9 +551,11 @@ void jswrap_httpSRs_writeHead(JsVar *parent, int statusCode, JsVar *headers) { ["value","JsVar","The value of the header as a String"] ] } -Set a value to send in the header of this HTTP response. This updates the `httpSRs.headers` property. +Set a value to send in the header of this HTTP response. This updates the +`httpSRs.headers` property. -Any headers supplied to `writeHead` will overwrite any headers with the same name. +Any headers supplied to `writeHead` will overwrite any headers with the same +name. */ void jswrap_httpSRs_setHeader(JsVar *parent, JsVar *name, JsVar *value) { serverResponseSetHeader(parent, name, value); @@ -548,8 +576,9 @@ void jswrap_httpSRs_setHeader(JsVar *parent, JsVar *name, JsVar *value) { "return" : ["bool","For node.js compatibility, returns the boolean false. When the send buffer is empty, a `drain` event will be sent"] } This function writes the `data` argument as a string. Data that is passed in -(including arrays) will be converted to a string with the normal JavaScript -`toString` method. For more information about sending binary data see `Socket.write` +(including arrays) will be converted to a string with the normal JavaScript +`toString` method. For more information about sending binary data see +`Socket.write` */ // Re-use existing diff --git a/libs/network/js/jswrap_jsnetwork.c b/libs/network/js/jswrap_jsnetwork.c index 68b03e2af8..1f412b165b 100644 --- a/libs/network/js/jswrap_jsnetwork.c +++ b/libs/network/js/jswrap_jsnetwork.c @@ -38,7 +38,8 @@ Library that initialises a network device that calls into JavaScript ], "return" : ["JsVar","The object passed in"] } -Initialise the network using the callbacks given and return the first argument. For instance: +Initialise the network using the callbacks given and return the first argument. +For instance: ``` require("NetworkJS").create({ @@ -68,8 +69,9 @@ require("NetworkJS").create({ }); ``` -`socketType` is an integer - 2 for UDP, or see SocketType in https://github.com/espruino/Espruino/blob/master/libs/network/network.h -for more information. +`socketType` is an integer - 2 for UDP, or see SocketType in +https://github.com/espruino/Espruino/blob/master/libs/network/network.h for more +information. */ JsVar *jswrap_networkjs_create(JsVar *obj) { JsNetwork net; diff --git a/libs/network/jswrap_net.c b/libs/network/jswrap_net.c index 810e978f16..6d0aa3ac54 100644 --- a/libs/network/jswrap_net.c +++ b/libs/network/jswrap_net.c @@ -64,7 +64,8 @@ void jswrap_net_kill() { "type" : "class", "class" : "url" } -This class helps to convert URLs into Objects of information ready for http.request/get +This class helps to convert URLs into Objects of information ready for +http.request/get */ @@ -83,7 +84,8 @@ A utility function to split a URL into parts This is useful in web servers for instance when handling a request. -For instance `url.parse("/a?b=c&d=e",true)` returns `{"method":"GET","host":"","path":"/a?b=c&d=e","pathname":"/a","search":"?b=c&d=e","port":80,"query":{"b":"c","d":"e"}}` +For instance `url.parse("/a?b=c&d=e",true)` returns +`{"method":"GET","host":"","path":"/a?b=c&d=e","pathname":"/a","search":"?b=c&d=e","port":80,"query":{"b":"c","d":"e"}}` */ JsVar *jswrap_url_parse(JsVar *url, bool parseQuery) { if (!jsvIsString(url)) return 0; @@ -219,7 +221,9 @@ This library allows you to create TCPIP servers and clients In order to use this, you will need an extra module to get network connectivity. -This is designed to be a cut-down version of the [node.js library](http://nodejs.org/api/net.html). Please see the [Internet](/Internet) page for more information on how to use it. +This is designed to be a cut-down version of the [node.js +library](http://nodejs.org/api/net.html). Please see the [Internet](/Internet) +page for more information on how to use it. */ /*JSON{ @@ -244,7 +248,9 @@ An actual socket connection - allowing transmit/receive of TCP data ["data","JsVar","A string containing one or more characters of received data"] ] } -The 'data' event is called when data is received. If a handler is defined with `X.on('data', function(data) { ... })` then it will be called, otherwise data will be stored in an internal buffer, where it can be retrieved with `X.read()` +The 'data' event is called when data is received. If a handler is defined with +`X.on('data', function(data) { ... })` then it will be called, otherwise data +will be stored in an internal buffer, where it can be retrieved with `X.read()` */ /*JSON{ "type" : "event", @@ -264,10 +270,12 @@ Called when the connection closes. ["details","JsVar","An error object with an error code (a negative integer) and a message."] ] } -There was an error on this socket and it is closing (or wasn't opened in the first place). If a "connected" event was issued on this socket then the error event is always followed by a close event. -The error codes are: +There was an error on this socket and it is closing (or wasn't opened in the +first place). If a "connected" event was issued on this socket then the error +event is always followed by a close event. The error codes are: -* -1: socket closed (this is not really an error and will not cause an error callback) +* -1: socket closed (this is not really an error and will not cause an error + callback) * -2: out of memory (typically while allocating a buffer to hold data) * -3: timeout * -4: no route @@ -290,7 +298,8 @@ The error codes are: "generate" : "jswrap_stream_available", "return" : ["int","How many bytes are available"] } -Return how many bytes are available to read. If there is already a listener for data, this will always return 0. +Return how many bytes are available to read. If there is already a listener for +data, this will always return 0. */ /*JSON{ "type" : "method", @@ -322,7 +331,8 @@ Pipe this to a stream (an object with a 'write' method) "class" : "Socket", "name" : "drain" } -An event that is fired when the buffer is empty and it can accept more data to send. +An event that is fired when the buffer is empty and it can accept more data to +send. */ @@ -344,7 +354,9 @@ An event that is fired when the buffer is empty and it can accept more data to s } Create a Server -When a request to the server is made, the callback is called. In the callback you can use the methods on the connection to send data. You can also add `connection.on('data',function() { ... })` to listen for received data +When a request to the server is made, the callback is called. In the callback +you can use the methods on the connection to send data. You can also add +`connection.on('data',function() { ... })` to listen for received data */ JsVar *jswrap_net_createServer(JsVar *callback) { @@ -434,7 +446,9 @@ This library allows you to create UDP/DATAGRAM servers and clients In order to use this, you will need an extra module to get network connectivity. -This is designed to be a cut-down version of the [node.js library](http://nodejs.org/api/dgram.html). Please see the [Internet](/Internet) page for more information on how to use it. +This is designed to be a cut-down version of the [node.js +library](http://nodejs.org/api/dgram.html). Please see the [Internet](/Internet) +page for more information on how to use it. */ /*JSON{ @@ -524,7 +538,8 @@ void jswrap_dgram_socket_send(JsVar *parent, JsVar *buffer, JsVar *offset, JsVar ["rinfo","JsVar","Sender address,port containing information"] ] } -The 'message' event is called when a datagram message is received. If a handler is defined with `X.on('message', function(msg) { ... })` then it will be called` +The 'message' event is called when a datagram message is received. If a handler +is defined with `X.on('message', function(msg) { ... })` then it will be called` */ /*JSON{ @@ -609,7 +624,9 @@ This library allows you to create TCPIP servers and clients using TLS encryption In order to use this, you will need an extra module to get network connectivity. -This is designed to be a cut-down version of the [node.js library](http://nodejs.org/api/tls.html). Please see the [Internet](/Internet) page for more information on how to use it. +This is designed to be a cut-down version of the [node.js +library](http://nodejs.org/api/tls.html). Please see the [Internet](/Internet) +page for more information on how to use it. */ /*JSON{ @@ -627,7 +644,8 @@ This is designed to be a cut-down version of the [node.js library](http://nodejs } Create a socket connection using TLS -Options can have `ca`, `key` and `cert` fields, which should be the decoded content of the certificate. +Options can have `ca`, `key` and `cert` fields, which should be the decoded +content of the certificate. ``` var options = url.parse("localhost:1234"); @@ -637,11 +655,15 @@ options.ca = atob("MIIFgDCC ... GosQML4sc="); require("tls").connect(options, ... ); ``` -If you have the certificates as `.pem` files, you need to load these files, take the information between the lines beginning with `----`, remove the newlines from it so you have raw base64, and then feed it into `atob` as above. +If you have the certificates as `.pem` files, you need to load these files, take +the information between the lines beginning with `----`, remove the newlines +from it so you have raw base64, and then feed it into `atob` as above. You can also: -* Just specify the filename (<=100 characters) and it will be loaded and parsed if you have an SD card connected. For instance `options.key = "key.pem";` -* Specify a function, which will be called to retrieve the data. For instance `options.key = function() { eeprom.load_my_info(); }; +* Just specify the filename (<=100 characters) and it will be loaded and parsed + if you have an SD card connected. For instance `options.key = "key.pem";` +* Specify a function, which will be called to retrieve the data. For instance + `options.key = function() { eeprom.load_my_info(); }; For more information about generating and using certificates, see: @@ -710,13 +732,13 @@ void jswrap_net_server_close(JsVar *parent) { "return" : ["bool","For node.js compatibility, returns the boolean false. When the send buffer is empty, a `drain` event will be sent"] } This function writes the `data` argument as a string. Data that is passed in -(including arrays) will be converted to a string with the normal JavaScript +(including arrays) will be converted to a string with the normal JavaScript `toString` method. -If you wish to send binary data then you need to convert that data directly to a +If you wish to send binary data then you need to convert that data directly to a String. This can be done with `String.fromCharCode`, however it's often easier -and faster to use the Espruino-specific `E.toString`, which will read its arguments -as an array of bytes and convert that to a String: +and faster to use the Espruino-specific `E.toString`, which will read its +arguments as an array of bytes and convert that to a String: ``` socket.write(E.toString([0,1,2,3,4,5])); diff --git a/libs/network/jswrap_wifi.c b/libs/network/jswrap_wifi.c index aa197302db..3dd0983741 100644 --- a/libs/network/jswrap_wifi.c +++ b/libs/network/jswrap_wifi.c @@ -18,9 +18,9 @@ "type": "library", "class": "Wifi" } -The Wifi library is designed to control the Wifi interface. It supports functionality -such as connecting to wifi networks, getting network information, starting an access -point, etc. +The Wifi library is designed to control the Wifi interface. It supports +functionality such as connecting to wifi networks, getting network information, +starting an access point, etc. It is available on these devices: @@ -28,17 +28,19 @@ It is available on these devices: * [ESP8266](http://www.espruino.com/EspruinoESP8266) * [ESP32](http://www.espruino.com/ESP32) -**Certain features may or may not be implemented on your device** however -we have documented what is available and what isn't. +**Certain features may or may not be implemented on your device** however we +have documented what is available and what isn't. If you're not using one of the devices above, a separate WiFi library is provided. For instance: -* An [ESP8266 connected to an Espruino board](http://www.espruino.com/ESP8266#software) +* An [ESP8266 connected to an Espruino + board](http://www.espruino.com/ESP8266#software) * An [CC3000 WiFi Module](http://www.espruino.com/CC3000) -[Other ways of connecting to the net](http://www.espruino.com/Internet#related-pages) such -as GSM, Ethernet and LTE have their own libraries. +[Other ways of connecting to the +net](http://www.espruino.com/Internet#related-pages) such as GSM, Ethernet and +LTE have their own libraries. You can use the WiFi library as follows: @@ -47,8 +49,9 @@ var wifi = require("Wifi"); wifi.connect("my-ssid", {password:"my-pwd"}, function(ap){ console.log("connected:", ap); }); ``` -On ESP32/ESP8266 if you want the connection to happen automatically at boot, add `wifi.save();`. -On other platforms, place `wifi.connect` in a function called `onInit`. +On ESP32/ESP8266 if you want the connection to happen automatically at boot, add +`wifi.save();`. On other platforms, place `wifi.connect` in a function called +`onInit`. */ /*JSON{ @@ -59,7 +62,8 @@ On other platforms, place `wifi.connect` in a function called `onInit`. ["details","JsVar","An object with event details"] ] } -The 'associated' event is called when an association with an access point has succeeded, i.e., a connection to the AP's network has been established. +The 'associated' event is called when an association with an access point has +succeeded, i.e., a connection to the AP's network has been established. On ESP32/ESP8266 there is a `details` parameter which includes: @@ -77,7 +81,8 @@ On ESP32/ESP8266 there is a `details` parameter which includes: ["details","JsVar","An object with event details"] ] } -The 'disconnected' event is called when an association with an access point has been lost. +The 'disconnected' event is called when an association with an access point has +been lost. On ESP32/ESP8266 there is a `details` parameter which includes: @@ -96,8 +101,8 @@ On ESP32/ESP8266 there is a `details` parameter which includes: ["details","JsVar","An object with event details"] ] } -The 'auth_change' event is called when the authentication mode with the associated access point changes. -The details include: +The 'auth_change' event is called when the authentication mode with the +associated access point changes. The details include: * oldMode - The old auth mode (string: open, wep, wpa, wpa2, wpa_wpa2) * newMode - The new auth mode (string: open, wep, wpa, wpa2, wpa_wpa2) @@ -110,7 +115,8 @@ The details include: "name" : "dhcp_timeout", "#if" : "defined(ESP32) || defined(ESP8266)" } -The 'dhcp_timeout' event is called when a DHCP request to the connected access point fails and thus no IP address could be acquired (or renewed). +The 'dhcp_timeout' event is called when a DHCP request to the connected access +point fails and thus no IP address could be acquired (or renewed). */ /*JSON{ @@ -121,7 +127,11 @@ The 'dhcp_timeout' event is called when a DHCP request to the connected access p ["details","JsVar","An object with event details"] ] } -The 'connected' event is called when the connection with an access point is ready for traffic. In the case of a dynamic IP address configuration this is when an IP address is obtained, in the case of static IP address allocation this happens when an association is formed (in that case the 'associated' and 'connected' events are fired in rapid succession). +The 'connected' event is called when the connection with an access point is +ready for traffic. In the case of a dynamic IP address configuration this is +when an IP address is obtained, in the case of static IP address allocation this +happens when an association is formed (in that case the 'associated' and +'connected' events are fired in rapid succession). On ESP32/ESP8266 there is a `details` parameter which includes: @@ -140,8 +150,8 @@ On ESP32/ESP8266 there is a `details` parameter which includes: ["details","JsVar","An object with event details"] ] } -The 'sta_joined' event is called when a station establishes an association (i.e. connects) with the esp8266's access point. -The details include: +The 'sta_joined' event is called when a station establishes an association (i.e. +connects) with the esp8266's access point. The details include: * mac - The MAC address of the station in string format (00:00:00:00:00:00) @@ -156,8 +166,8 @@ The details include: ["details","JsVar","An object with event details"] ] } -The 'sta_left' event is called when a station disconnects from the esp8266's access point (or its association times out?). -The details include: +The 'sta_left' event is called when a station disconnects from the esp8266's +access point (or its association times out?). The details include: * mac - The MAC address of the station in string format (00:00:00:00:00:00) @@ -172,8 +182,8 @@ The details include: ["details","JsVar","An object with event details"] ] } -The 'probe_recv' event is called when a probe request is received from some station by the esp8266's access point. -The details include: +The 'probe_recv' event is called when a probe request is received from some +station by the esp8266's access point. The details include: * mac - The MAC address of the station in string format (00:00:00:00:00:00) * rssi - The signal strength in dB of the probe request @@ -189,7 +199,10 @@ The details include: ["callback", "JsVar", "An optional `callback()` function to be called back on disconnection. The callback function receives no argument."] ] } -Disconnect the wifi station from an access point and disable the station mode. It is OK to call `disconnect` to turn off station mode even if no connection exists (for example, connection attempts may be failing). Station mode can be re-enabled by calling `connect` or `scan`. +Disconnect the wifi station from an access point and disable the station mode. +It is OK to call `disconnect` to turn off station mode even if no connection +exists (for example, connection attempts may be failing). Station mode can be +re-enabled by calling `connect` or `scan`. */ /*JSON{ @@ -201,7 +214,8 @@ Disconnect the wifi station from an access point and disable the station mode. I ["callback", "JsVar", "An optional `callback()` function to be called back on successful stop. The callback function receives no argument."] ] } -Stop being an access point and disable the AP operation mode. AP mode can be re-enabled by calling `startAP`. +Stop being an access point and disable the AP operation mode. AP mode can be +re-enabled by calling `startAP`. */ /*JSON{ @@ -215,21 +229,37 @@ Stop being an access point and disable the AP operation mode. AP mode can be re- ["callback", "JsVar", "A `callback(err)` function to be called back on completion. `err` is null on success, or contains an error string on failure."] ] } -Connect to an access point as a station. If there is an existing connection to an AP it is first disconnected if the SSID or password are different from those passed as parameters. Put differently, if the passed SSID and password are identical to the currently connected AP then nothing is changed. -When the connection attempt completes the callback function is invoked with one `err` parameter, which is NULL if there is no error and a string message if there is an error. If DHCP is enabled the callback occurs once an IP addres has been obtained, if a static IP is set the callback occurs once the AP's network has been joined. The callback is also invoked if a connection already exists and does not need to be changed. +Connect to an access point as a station. If there is an existing connection to +an AP it is first disconnected if the SSID or password are different from those +passed as parameters. Put differently, if the passed SSID and password are +identical to the currently connected AP then nothing is changed. When the +connection attempt completes the callback function is invoked with one `err` +parameter, which is NULL if there is no error and a string message if there is +an error. If DHCP is enabled the callback occurs once an IP addres has been +obtained, if a static IP is set the callback occurs once the AP's network has +been joined. The callback is also invoked if a connection already exists and +does not need to be changed. The options properties may contain: * `password` - Password string to be used to access the network. -* `dnsServers` (array of String) - An array of up to two DNS servers in dotted decimal format string. -* `channel` - Wifi channel of the access point (integer, typ 0..14, 0 means any channel), only on ESP8266. -* `bssid` - Mac address of the access point (string, type "00:00:00:00:00:00"), only on ESP8266. +* `dnsServers` (array of String) - An array of up to two DNS servers in dotted + decimal format string. +* `channel` - Wifi channel of the access point (integer, typ 0..14, 0 means any + channel), only on ESP8266. +* `bssid` - Mac address of the access point (string, type "00:00:00:00:00:00"), + only on ESP8266. Notes: -* the options should include the ability to set a static IP and associated netmask and gateway, this is a future enhancement. -* the only error reported in the callback is "Bad password", all other errors (such as access point not found or DHCP timeout) just cause connection retries. If the reporting of such temporary errors is desired, the caller must use its own timeout and the `getDetails().status` field. -* the `connect` call automatically enabled station mode, it can be disabled again by calling `disconnect`. +* the options should include the ability to set a static IP and associated + netmask and gateway, this is a future enhancement. +* the only error reported in the callback is "Bad password", all other errors + (such as access point not found or DHCP timeout) just cause connection + retries. If the reporting of such temporary errors is desired, the caller must + use its own timeout and the `getDetails().status` field. +* the `connect` call automatically enabled station mode, it can be disabled + again by calling `disconnect`. */ @@ -242,7 +272,9 @@ The options properties may contain: ["callback", "JsVar", "A `callback(err, ap_list)` function to be called back on completion. `err==null` and `ap_list` is an array on success, or `err` is an error string and `ap_list` is undefined on failure."] ] } -Perform a scan for access points. This will enable the station mode if it is not currently enabled. Once the scan is complete the callback function is called with an array of APs found, each AP is an object with: +Perform a scan for access points. This will enable the station mode if it is not +currently enabled. Once the scan is complete the callback function is called +with an array of APs found, each AP is an object with: * `ssid`: SSID string. * `mac`: access point MAC address in 00:00:00:00:00:00 format. @@ -252,7 +284,8 @@ Perform a scan for access points. This will enable the station mode if it is not * `rssi`: signal strength in dB in the range -110..0. Notes: -* in order to perform the scan the station mode is turned on and remains on, use Wifi.disconnect() to turn it off again, if desired. +* in order to perform the scan the station mode is turned on and remains on, use + Wifi.disconnect() to turn it off again, if desired. * only one scan can be in progress at a time. */ @@ -268,20 +301,30 @@ Perform a scan for access points. This will enable the station mode if it is not ["callback", "JsVar", "Optional `callback(err)` function to be called when the AP is successfully started. `err==null` on success, or an error string on failure."] ] } -Create a WiFi access point allowing stations to connect. If the password is NULL or an empty string the access point is open, otherwise it is encrypted. -The callback function is invoked once the access point is set-up and receives one `err` argument, which is NULL on success and contains an error message string otherwise. +Create a WiFi access point allowing stations to connect. If the password is NULL +or an empty string the access point is open, otherwise it is encrypted. The +callback function is invoked once the access point is set-up and receives one +`err` argument, which is NULL on success and contains an error message string +otherwise. The `options` object can contain the following properties. -* `authMode` - The authentication mode to use. Can be one of "open", "wpa2", "wpa", "wpa_wpa2". The default is open (but open access points are not recommended). +* `authMode` - The authentication mode to use. Can be one of "open", "wpa2", + "wpa", "wpa_wpa2". The default is open (but open access points are not + recommended). * `password` - The password for connecting stations if authMode is not open. -* `channel` - The channel to be used for the access point in the range 1..13. If the device is also connected to an access point as a station then that access point determines the channel. -* `hidden` - The flag if visible or not (0:visible, 1:hidden), default is visible. +* `channel` - The channel to be used for the access point in the range 1..13. If + the device is also connected to an access point as a station then that access + point determines the channel. +* `hidden` - The flag if visible or not (0:visible, 1:hidden), default is + visible. Notes: -* the options should include the ability to set the AP IP and associated netmask, this is a future enhancement. -* the `startAP` call automatically enables AP mode. It can be disabled again by calling `stopAP`. +* the options should include the ability to set the AP IP and associated + netmask, this is a future enhancement. +* the `startAP` call automatically enables AP mode. It can be disabled again by + calling `stopAP`. */ @@ -297,14 +340,25 @@ The `options` object can contain the following properties. ["callback", "JsVar", "Optional `callback(status)` function to be called back with the current Wifi status, i.e. the same object as returned directly."] ] } -Retrieve the current overall WiFi configuration. This call provides general information that pertains to both station and access point modes. The getDetails and getAPDetails calls provide more in-depth information about the station and access point configurations, respectively. The status object has the following properties: +Retrieve the current overall WiFi configuration. This call provides general +information that pertains to both station and access point modes. The getDetails +and getAPDetails calls provide more in-depth information about the station and +access point configurations, respectively. The status object has the following +properties: * `station` - Status of the wifi station: `off`, `connecting`, ... * `ap` - Status of the wifi access point: `disabled`, `enabled`. * `mode` - The current operation mode: `off`, `sta`, `ap`, `sta+ap`. -* `phy` - Modulation standard configured: `11b`, `11g`, `11n` (the esp8266 docs are not very clear, but it is assumed that 11n means b/g/n). This setting limits the modulations that the radio will use, it does not indicate the current modulation used with a specific access point. -* `powersave` - Power saving mode: `none` (radio is on all the time), `ps-poll` (radio is off between beacons as determined by the access point's DTIM setting). Note that in 'ap' and 'sta+ap' modes the radio is always on, i.e., no power saving is possible. -* `savedMode` - The saved operation mode which will be applied at boot time: `off`, `sta`, `ap`, `sta+ap`. +* `phy` - Modulation standard configured: `11b`, `11g`, `11n` (the esp8266 docs + are not very clear, but it is assumed that 11n means b/g/n). This setting + limits the modulations that the radio will use, it does not indicate the + current modulation used with a specific access point. +* `powersave` - Power saving mode: `none` (radio is on all the time), `ps-poll` + (radio is off between beacons as determined by the access point's DTIM + setting). Note that in 'ap' and 'sta+ap' modes the radio is always on, i.e., + no power saving is possible. +* `savedMode` - The saved operation mode which will be applied at boot time: + `off`, `sta`, `ap`, `sta+ap`. */ @@ -319,13 +373,20 @@ Retrieve the current overall WiFi configuration. This call provides general info ["settings", "JsVar", "An object with the configuration settings to change."] ] } -Sets a number of global wifi configuration settings. All parameters are optional and which are passed determines which settings are updated. -The settings available are: - -* `phy` - Modulation standard to allow: `11b`, `11g`, `11n` (the esp8266 docs are not very clear, but it is assumed that 11n means b/g/n). -* `powersave` - Power saving mode: `none` (radio is on all the time), `ps-poll` (radio is off between beacons as determined by the access point's DTIM setting). Note that in 'ap' and 'sta+ap' modes the radio is always on, i.e., no power saving is possible. - -Note: esp8266 SDK programmers may be missing an "opmode" option to set the sta/ap/sta+ap operation mode. Please use connect/scan/disconnect/startAP/stopAP, which all set the esp8266 opmode indirectly. +Sets a number of global wifi configuration settings. All parameters are optional +and which are passed determines which settings are updated. The settings +available are: + +* `phy` - Modulation standard to allow: `11b`, `11g`, `11n` (the esp8266 docs + are not very clear, but it is assumed that 11n means b/g/n). +* `powersave` - Power saving mode: `none` (radio is on all the time), `ps-poll` + (radio is off between beacons as determined by the access point's DTIM + setting). Note that in 'ap' and 'sta+ap' modes the radio is always on, i.e., + no power saving is possible. + +Note: esp8266 SDK programmers may be missing an "opmode" option to set the +sta/ap/sta+ap operation mode. Please use connect/scan/disconnect/startAP/stopAP, +which all set the esp8266 opmode indirectly. */ /*JSON{ @@ -339,13 +400,22 @@ Note: esp8266 SDK programmers may be missing an "opmode" option to set the sta/a ["callback", "JsVar", "An optional `callback(details)` function to be called back with the wifi details, i.e. the same object as returned directly."] ] } -Retrieve the wifi station configuration and status details. The details object has the following properties: - -* `status` - Details about the wifi station connection, one of `off`, `connecting`, `wrong_password`, `no_ap_found`, `connect_fail`, or `connected`. The off, bad_password and connected states are stable, the other states are transient. The connecting state will either result in connected or one of the error states (bad_password, no_ap_found, connect_fail) and the no_ap_found and connect_fail states will result in a reconnection attempt after some interval. -* `rssi` - signal strength of the connected access point in dB, typically in the range -110 to 0, with anything greater than -30 being an excessively strong signal. +Retrieve the wifi station configuration and status details. The details object +has the following properties: + +* `status` - Details about the wifi station connection, one of `off`, + `connecting`, `wrong_password`, `no_ap_found`, `connect_fail`, or `connected`. + The off, bad_password and connected states are stable, the other states are + transient. The connecting state will either result in connected or one of the + error states (bad_password, no_ap_found, connect_fail) and the no_ap_found and + connect_fail states will result in a reconnection attempt after some interval. +* `rssi` - signal strength of the connected access point in dB, typically in the + range -110 to 0, with anything greater than -30 being an excessively strong + signal. * `ssid` - SSID of the access point. * `password` - the password used to connect to the access point. -* `authMode` - the authentication used: `open`, `wpa`, `wpa2`, `wpa_wpa2` (not currently supported). +* `authMode` - the authentication used: `open`, `wpa`, `wpa2`, `wpa_wpa2` (not + currently supported). * `savedSsid` - the SSID to connect to automatically at boot time, null if none. */ @@ -361,16 +431,21 @@ Retrieve the wifi station configuration and status details. The details object h ["callback", "JsVar", "An optional `callback(details)` function to be called back with the current access point details, i.e. the same object as returned directly."] ] } -Retrieve the current access point configuration and status. The details object has the following properties: +Retrieve the current access point configuration and status. The details object +has the following properties: * `status` - Current access point status: `enabled` or `disabled` -* `stations` - an array of the stations connected to the access point. This array may be empty. Each entry in the array is an object describing the station which, at a minimum contains `ip` being the IP address of the station. +* `stations` - an array of the stations connected to the access point. This + array may be empty. Each entry in the array is an object describing the + station which, at a minimum contains `ip` being the IP address of the station. * `ssid` - SSID to broadcast. * `password` - Password for authentication. -* `authMode` - the authentication required of stations: `open`, `wpa`, `wpa2`, `wpa_wpa2`. +* `authMode` - the authentication required of stations: `open`, `wpa`, `wpa2`, + `wpa_wpa2`. * `hidden` - True if the SSID is hidden, false otherwise. * `maxConn` - Max number of station connections supported. -* `savedSsid` - the SSID to broadcast automatically at boot time, null if the access point is to be disabled at boot. +* `savedSsid` - the SSID to broadcast automatically at boot time, null if the + access point is to be disabled at boot. */ @@ -384,9 +459,13 @@ Retrieve the current access point configuration and status. The details object ["what", "JsVar", "An optional parameter to specify what to save, on the esp8266 the two supported values are `clear` and `sta+ap`. The default is `sta+ap`"] ] } -On boards where this is not available, just issue the `connect` commands you need to run at startup from an `onInit` function. +On boards where this is not available, just issue the `connect` commands you +need to run at startup from an `onInit` function. -Save the current wifi configuration (station and access point) to flash and automatically apply this configuration at boot time, unless `what=="clear"`, in which case the saved configuration is cleared such that wifi remains disabled at boot. The saved configuration includes: +Save the current wifi configuration (station and access point) to flash and +automatically apply this configuration at boot time, unless `what=="clear"`, in +which case the saved configuration is cleared such that wifi remains disabled at +boot. The saved configuration includes: * mode (off/sta/ap/sta+ap) * SSIDs & passwords @@ -456,8 +535,10 @@ Return the access point IP information in an object which contains: ["callback", "JsVar", "The `callback(ip)` to invoke when the IP is returned. `ip==null` on failure."] ] } -Lookup the hostname and invoke a callback with the IP address as integer argument. If the lookup fails, the callback is invoked with a null argument. -**Note:** only a single hostname lookup can be made at a time, concurrent lookups are not supported. +Lookup the hostname and invoke a callback with the IP address as integer +argument. If the lookup fails, the callback is invoked with a null argument. +**Note:** only a single hostname lookup can be made at a time, concurrent +lookups are not supported. */ @@ -472,7 +553,8 @@ Lookup the hostname and invoke a callback with the IP address as integer argumen ["callback", "JsVar", "An optional `callback(hostname)` function to be called back with the hostname."] ] } -Returns the hostname announced to the DHCP server and broadcast via mDNS when connecting to an access point. +Returns the hostname announced to the DHCP server and broadcast via mDNS when +connecting to an access point. */ /*JSON{ @@ -486,9 +568,12 @@ Returns the hostname announced to the DHCP server and broadcast via mDNS when co ["callback", "JsVar", "An optional `callback()` function to be called back when the hostname is set"] ] } -Set the hostname. Depending on implemenation, the hostname is sent with every DHCP request and is broadcast via mDNS. The DHCP hostname may be visible in the access point and may be forwarded into DNS as hostname.local. -If a DHCP lease currently exists changing the hostname will cause a disconnect and reconnect in order to transmit the change to the DHCP server. -The mDNS announcement also includes an announcement for the "espruino" service. +Set the hostname. Depending on implemenation, the hostname is sent with every +DHCP request and is broadcast via mDNS. The DHCP hostname may be visible in the +access point and may be forwarded into DNS as hostname.local. If a DHCP lease +currently exists changing the hostname will cause a disconnect and reconnect in +order to transmit the change to the DHCP server. The mDNS announcement also +includes an announcement for the "espruino" service. */ /*JSON{ @@ -502,8 +587,12 @@ The mDNS announcement also includes an announcement for the "espruino" service. ["tz_offset", "JsVar", "Local time zone offset in the range -11..13."] ] } -Starts the SNTP (Simple Network Time Protocol) service to keep the clock synchronized with the specified server. Note that the time zone is really just an offset to UTC and doesn't handle daylight savings time. -The interval determines how often the time server is queried and Espruino's time is synchronized. The initial synchronization occurs asynchronously after setSNTP returns. +Starts the SNTP (Simple Network Time Protocol) service to keep the clock +synchronized with the specified server. Note that the time zone is really just +an offset to UTC and doesn't handle daylight savings time. The interval +determines how often the time server is queried and Espruino's time is +synchronized. The initial synchronization occurs asynchronously after setSNTP +returns. */ @@ -522,7 +611,7 @@ The interval determines how often the time server is queried and Espruino's time The `settings` object must contain the following properties. * `ip` IP address as string (e.g. "192.168.5.100") -* `gw` The network gateway as string (e.g. "192.168.5.1") +* `gw` The network gateway as string (e.g. "192.168.5.1") * `netmask` The interface netmask as string (e.g. "255.255.255.0") */ @@ -541,7 +630,7 @@ The `settings` object must contain the following properties. The `settings` object must contain the following properties. * `ip` IP address as string (e.g. "192.168.5.100") -* `gw` The network gateway as string (e.g. "192.168.5.1") +* `gw` The network gateway as string (e.g. "192.168.5.1") * `netmask` The interface netmask as string (e.g. "255.255.255.0") */ @@ -559,7 +648,8 @@ The `settings` object must contain the following properties. ["callback", "JsVar", "A `callback(time)` function to invoke when a ping is received"] ] } -Issues a ping to the given host, and calls a callback with the time when the ping is received. +Issues a ping to the given host, and calls a callback with the time when the +ping is received. */ /*JSON{ @@ -577,7 +667,6 @@ Switch to using a higher communication speed with the WiFi module. * `true` = 921600 baud * `false` = 115200 -* `1843200` (or any number) = use a specific baud rate. -* -eg. `wifi.turbo(true,callback)` or `wifi.turbo(1843200,callback)` +* `1843200` (or any number) = use a specific baud rate. * eg. +`wifi.turbo(true,callback)` or `wifi.turbo(1843200,callback)` */ diff --git a/libs/network/telnet/jswrap_telnet.c b/libs/network/telnet/jswrap_telnet.c index 39d91bfcff..0fbb8c681d 100644 --- a/libs/network/telnet/jswrap_telnet.c +++ b/libs/network/telnet/jswrap_telnet.c @@ -69,9 +69,9 @@ static uint8_t tnSrvMode; ///< current mode for the telnet server "type" : "library", "class" : "TelnetServer" } -This library implements a telnet console for the Espruino interpreter. It requires a network -connection, e.g. Wifi, and **currently only functions on the ESP8266 and on Linux **. It uses -port 23 on the ESP8266 and port 2323 on Linux. +This library implements a telnet console for the Espruino interpreter. It +requires a network connection, e.g. Wifi, and **currently only functions on the +ESP8266 and on Linux **. It uses port 23 on the ESP8266 and port 2323 on Linux. **Note:** To enable on Linux, run `./espruino --telnet` */ diff --git a/libs/network/wiznet/jswrap_wiznet.c b/libs/network/wiznet/jswrap_wiznet.c index fdc0122d2d..c7c72362c3 100644 --- a/libs/network/wiznet/jswrap_wiznet.c +++ b/libs/network/wiznet/jswrap_wiznet.c @@ -245,10 +245,11 @@ static void _eth_getIP_set_address(JsVar *options, char *name, unsigned char *pt ], "return" : ["bool","True on success"] } -Set the current IP address or get an IP from DHCP (if no options object is specified) +Set the current IP address or get an IP from DHCP (if no options object is +specified) -If 'mac' is specified as an option, it must be a string of the form `"00:01:02:03:04:05"` -The default mac is 00:08:DC:01:02:03. +If 'mac' is specified as an option, it must be a string of the form +`"00:01:02:03:04:05"` The default mac is 00:08:DC:01:02:03. */ bool jswrap_ethernet_setIP(JsVar *wlanObj, JsVar *options, JsVar *callback) { NOT_USED(wlanObj); @@ -333,10 +334,10 @@ bool jswrap_ethernet_setIP(JsVar *wlanObj, JsVar *options, JsVar *callback) { ], "return" : ["bool","True on success"] } -Set hostname allow to set the hosname used during the dhcp request. -min 8 and max 12 char, best set before calling `eth.setIP()` -Default is WIZnet010203, 010203 is the default nic as part of the mac. -Best to set the hosname before calling setIP(). +Set hostname allow to set the hosname used during the dhcp request. min 8 and +max 12 char, best set before calling `eth.setIP()` Default is WIZnet010203, +010203 is the default nic as part of the mac. Best to set the hosname before +calling setIP(). */ bool jswrap_ethernet_setHostname(JsVar *wlanObj, JsVar *jsHostname, JsVar *callback){ NOT_USED(wlanObj); @@ -402,7 +403,7 @@ JsVar * jswrap_ethernet_getHostname(JsVar *wlanObj, JsVar *callback) { ], "return" : ["JsVar" ] } -Get the current status of the ethernet device +Get the current status of the ethernet device */ JsVar * jswrap_ethernet_getStatus( JsVar *wlanObj, JsVar *callback) { diff --git a/libs/pixljs/jswrap_pixljs.c b/libs/pixljs/jswrap_pixljs.c index d0b5117e0c..11cb7b68bc 100644 --- a/libs/pixljs/jswrap_pixljs.c +++ b/libs/pixljs/jswrap_pixljs.c @@ -38,7 +38,8 @@ const Pin PIXL_IO_PINS[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; "type": "class", "class" : "Pixl" } -Class containing utility functions for [Pixl.js](http://www.espruino.com/Pixl.js) +Class containing utility functions for +[Pixl.js](http://www.espruino.com/Pixl.js) */ /*JSON{ @@ -50,8 +51,8 @@ Class containing utility functions for [Pixl.js](http://www.espruino.com/Pixl.js } DEPRECATED - Please use `E.getBattery()` instead. -Return an approximate battery percentage remaining based on -a normal CR2032 battery (2.8 - 2.2v) +Return an approximate battery percentage remaining based on a normal CR2032 +battery (2.8 - 2.2v) */ JsVarInt jswrap_pixljs_getBattery() { JsVarFloat v = jshReadVRef(); @@ -71,7 +72,8 @@ JsVarInt jswrap_pixljs_getBattery() { "ifdef" : "PIXLJS", "return" : ["pin",""] } -The pin marked SDA on the Arduino pin footprint. This is connected directly to pin A4. +The pin marked SDA on the Arduino pin footprint. This is connected directly to +pin A4. */ /*JSON{ "type" : "variable", @@ -80,7 +82,8 @@ The pin marked SDA on the Arduino pin footprint. This is connected directly to p "ifdef" : "PIXLJS", "return" : ["pin",""] } -The pin marked SDA on the Arduino pin footprint. This is connected directly to pin A5. +The pin marked SDA on the Arduino pin footprint. This is connected directly to +pin A5. */ @@ -491,7 +494,8 @@ bool jswrap_pixljs_idle() { "return" : ["JsVar", "A menu object with `draw`, `move` and `select` functions" ], "typescript" : "menu(menu: Menu): MenuInstance;" } -Display a menu on Pixl.js's screen, and set up the buttons to navigate through it. +Display a menu on Pixl.js's screen, and set up the buttons to navigate through +it. DEPRECATED: Use `E.showMenu` */ @@ -579,8 +583,8 @@ type MenuInstance = { } Display a menu on the screen, and set up the buttons to navigate through it. -Supply an object containing menu items. When an item is selected, the -function it references will be executed. For example: +Supply an object containing menu items. When an item is selected, the function +it references will be executed. For example: ``` var boolean = false; @@ -614,8 +618,8 @@ var submenu = { E.showMenu(mainmenu); ``` -The menu will stay onscreen and active until explicitly removed, -which you can do by calling `E.showMenu()` without arguments. +The menu will stay onscreen and active until explicitly removed, which you can +do by calling `E.showMenu()` without arguments. See http://www.espruino.com/graphical_menu for more detailed information. */ @@ -659,12 +663,11 @@ E.showMessage("These are\nLots of\nLines","My Title") ] } -Displays a full screen prompt on the screen, with the buttons -requested (or `Yes` and `No` for defaults). +Displays a full screen prompt on the screen, with the buttons requested (or +`Yes` and `No` for defaults). -When the button is pressed the promise is resolved with the -requested values (for the `Yes` and `No` defaults, `true` and `false` -are returned). +When the button is pressed the promise is resolved with the requested values +(for the `Yes` and `No` defaults, `true` and `false` are returned). ``` E.showPrompt("Do you like fish?").then(function(v) { diff --git a/libs/puckjs/jswrap_puck.c b/libs/puckjs/jswrap_puck.c index 0d558f2c74..556a431843 100644 --- a/libs/puckjs/jswrap_puck.c +++ b/libs/puckjs/jswrap_puck.c @@ -593,7 +593,8 @@ Class containing [Puck.js's](http://www.puck-js.com) utility functions. "ifdef" : "PUCKJS", "return" : ["pin",""] } -On Puck.js V2 (not v1.0) this is the pin that controls the FET, for high-powered outputs. +On Puck.js V2 (not v1.0) this is the pin that controls the FET, for high-powered +outputs. */ /*JSON{ @@ -607,20 +608,20 @@ On Puck.js V2 (not v1.0) this is the pin that controls the FET, for high-powered Turn on the magnetometer, take a single reading, and then turn it off again. An object of the form `{x,y,z}` is returned containing magnetometer readings. -Due to residual magnetism in the Puck and magnetometer itself, with -no magnetic field the Puck will not return `{x:0,y:0,z:0}`. +Due to residual magnetism in the Puck and magnetometer itself, with no magnetic +field the Puck will not return `{x:0,y:0,z:0}`. -Instead, it's up to you to figure out what the 'zero value' is for your -Puck in your location and to then subtract that from the value returned. If -you're not trying to measure the Earth's magnetic field then it's a good idea -to just take a reading at startup and use that. +Instead, it's up to you to figure out what the 'zero value' is for your Puck in +your location and to then subtract that from the value returned. If you're not +trying to measure the Earth's magnetic field then it's a good idea to just take +a reading at startup and use that. With the aerial at the top of the board, the `y` reading is vertical, `x` is horizontal, and `z` is through the board. Readings are in increments of 0.1 micro Tesla (uT). The Earth's magnetic field -varies from around 25-60 uT, so the reading will vary by 250 to 600 depending -on location. +varies from around 25-60 uT, so the reading will vary by 250 to 600 depending on +location. */ JsVar *jswrap_puck_mag() { if (!PUCKJS_HAS_MAG) { @@ -652,14 +653,17 @@ JsVar *jswrap_puck_mag() { "generate" : "jswrap_puck_magTemp", "return" : ["float", "Temperature in degrees C" ] } -Turn on the magnetometer, take a single temperature reading from the MAG3110 chip, and then turn it off again. +Turn on the magnetometer, take a single temperature reading from the MAG3110 +chip, and then turn it off again. (If the magnetometer is already on, this just returns the last reading obtained) -`E.getTemperature()` uses the microcontroller's temperature sensor, but this uses the magnetometer's. +`E.getTemperature()` uses the microcontroller's temperature sensor, but this +uses the magnetometer's. -The reading obtained is an integer (so no decimal places), but the sensitivity is factory trimmed. to 1°C, however the temperature -offset isn't - so absolute readings may still need calibrating. +The reading obtained is an integer (so no decimal places), but the sensitivity +is factory trimmed. to 1°C, however the temperature offset isn't - so +absolute readings may still need calibrating. */ JsVarFloat jswrap_puck_magTemp() { if (!PUCKJS_HAS_MAG) { @@ -682,13 +686,13 @@ JsVarFloat jswrap_puck_magTemp() { "name" : "mag", "ifdef" : "PUCKJS" } -Called after `Puck.magOn()` every time magnetometer data -is sampled. There is one argument which is an object -of the form `{x,y,z}` containing magnetometer readings -as integers (for more information see `Puck.mag()`). +Called after `Puck.magOn()` every time magnetometer data is sampled. There is +one argument which is an object of the form `{x,y,z}` containing magnetometer +readings as integers (for more information see `Puck.mag()`). -Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information. +Check out [the Puck.js page on the +magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information. */ /*JSON{ @@ -699,13 +703,13 @@ for more information. } Only on Puck.js v2.0 -Called after `Puck.accelOn()` every time accelerometer data -is sampled. There is one argument which is an object -of the form `{acc:{x,y,z}, gyro:{x,y,z}}` containing the data. +Called after `Puck.accelOn()` every time accelerometer data is sampled. There is +one argument which is an object of the form `{acc:{x,y,z}, gyro:{x,y,z}}` +containing the data. -The data is as it comes off the accelerometer and is not -scaled to 1g. For more information see `Puck.accel()` or -[the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals). +The data is as it comes off the accelerometer and is not scaled to 1g. For more +information see `Puck.accel()` or [the Puck.js page on the +magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals). */ /*JSON{ @@ -718,8 +722,8 @@ scaled to 1g. For more information see `Puck.accel()` or ["samplerate","float","The sample rate in Hz, or undefined"] ] } -Turn the magnetometer on and start periodic sampling. Samples will then cause -a 'mag' event on 'Puck': +Turn the magnetometer on and start periodic sampling. Samples will then cause a +'mag' event on 'Puck': ``` Puck.magOn(); @@ -732,8 +736,9 @@ Puck.on('mag', function(xyz) { This call will be ignored if the sampling is already on. -If given an argument, the sample rate is set (if not, it's at 0.63 Hz). -The sample rate must be one of the following (resulting in the given power consumption): +If given an argument, the sample rate is set (if not, it's at 0.63 Hz). The +sample rate must be one of the following (resulting in the given power +consumption): * 80 Hz - 900uA * 40 Hz - 550uA @@ -747,12 +752,13 @@ The sample rate must be one of the following (resulting in the given power consu * 0.16 Hz - 8uA * 0.08 Hz - 8uA -When the battery level drops too low while sampling is turned on, -the magnetometer may stop sampling without warning, even while other -Puck functions continue uninterrupted. +When the battery level drops too low while sampling is turned on, the +magnetometer may stop sampling without warning, even while other Puck functions +continue uninterrupted. -Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information. +Check out [the Puck.js page on the +magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information. */ void jswrap_puck_magOn(JsVarFloat hz) { @@ -819,10 +825,12 @@ void jswrap_puck_magOff() { ], "ifdef" : "PUCKJS" } -Writes a register on the LIS3MDL / MAX3110 Magnetometer. Can be used for configuring advanced functions. +Writes a register on the LIS3MDL / MAX3110 Magnetometer. Can be used for +configuring advanced functions. -Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information and links to modules that use this function. +Check out [the Puck.js page on the +magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information and links to modules that use this function. */ void jswrap_puck_magWr(JsVarInt reg, JsVarInt data) { if (!PUCKJS_HAS_MAG) { @@ -843,10 +851,12 @@ void jswrap_puck_magWr(JsVarInt reg, JsVarInt data) { "return" : ["int",""], "ifdef" : "PUCKJS" } -Reads a register from the LIS3MDL / MAX3110 Magnetometer. Can be used for configuring advanced functions. +Reads a register from the LIS3MDL / MAX3110 Magnetometer. Can be used for +configuring advanced functions. -Check out [the Puck.js page on the magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information and links to modules that use this function. +Check out [the Puck.js page on the +magnetometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information and links to modules that use this function. */ int jswrap_puck_magRd(JsVarInt reg) { if (!PUCKJS_HAS_MAG) { @@ -890,7 +900,8 @@ void temp_off() { "generate" : "jswrap_puck_getTemperature", "return" : ["float", "Temperature in degrees C" ] } -On Puck.js v2.0 this will use the on-board PCT2075TP temperature sensor, but on Puck.js the less accurate on-chip Temperature sensor is used. +On Puck.js v2.0 this will use the on-board PCT2075TP temperature sensor, but on +Puck.js the less accurate on-chip Temperature sensor is used. */ JsVarFloat jswrap_puck_getTemperature() { if (PUCKJS_HAS_TEMP_SENSOR) { @@ -936,7 +947,8 @@ Accepted values are: * 833 Hz (with Gyro) (not recommended) * 1660 Hz (with Gyro) (not recommended) -Once `Puck.accelOn()` is called, the `Puck.accel` event will be called each time data is received. `Puck.accelOff()` can be called to turn the accelerometer off. +Once `Puck.accelOn()` is called, the `Puck.accel` event will be called each time +data is received. `Puck.accelOff()` can be called to turn the accelerometer off. For instance to light the red LED whenever Puck.js is face up: @@ -947,8 +959,9 @@ Puck.on('accel', function(a) { Puck.accelOn(); ``` -Check out [the Puck.js page on the accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information. +Check out [the Puck.js page on the +accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information. */ void jswrap_puck_accelOn(JsVarFloat hz) { @@ -977,10 +990,11 @@ void jswrap_puck_accelOn(JsVarFloat hz) { "ifdef" : "PUCKJS", "generate" : "jswrap_puck_accelOff" } -Turn the accelerometer off after it has been turned on by `Puck.accelOn()`. +Turn the accelerometer off after it has been turned on by `Puck.accelOn()`. -Check out [the Puck.js page on the accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information. +Check out [the Puck.js page on the +accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information. */ void jswrap_puck_accelOff() { if (!PUCKJS_HAS_ACCEL) { @@ -1006,10 +1020,13 @@ Turn on the accelerometer, take a single reading, and then turn it off again. The values reported are the raw values from the chip. In normal configuration: -* accelerometer: full-scale (32768) is 4g, so you need to divide by 8192 to get correctly scaled values -* gyro: full-scale (32768) is 245 dps, so you need to divide by 134 to get correctly scaled values +* accelerometer: full-scale (32768) is 4g, so you need to divide by 8192 to get + correctly scaled values +* gyro: full-scale (32768) is 245 dps, so you need to divide by 134 to get + correctly scaled values -If taking more than one reading, we'd suggest you use `Puck.accelOn()` and the `Puck.accel` event. +If taking more than one reading, we'd suggest you use `Puck.accelOn()` and the +`Puck.accel` event. */ JsVar *jswrap_puck_accel() { if (!PUCKJS_HAS_ACCEL) { @@ -1041,10 +1058,12 @@ JsVar *jswrap_puck_accel() { ], "ifdef" : "PUCKJS" } -Writes a register on the LSM6DS3TR-C Accelerometer. Can be used for configuring advanced functions. +Writes a register on the LSM6DS3TR-C Accelerometer. Can be used for configuring +advanced functions. -Check out [the Puck.js page on the accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information and links to modules that use this function. +Check out [the Puck.js page on the +accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information and links to modules that use this function. */ void jswrap_puck_accelWr(JsVarInt reg, JsVarInt data) { if (!PUCKJS_HAS_ACCEL) { @@ -1068,10 +1087,12 @@ void jswrap_puck_accelWr(JsVarInt reg, JsVarInt data) { "return" : ["int",""], "ifdef" : "PUCKJS" } -Reads a register from the LSM6DS3TR-C Accelerometer. Can be used for configuring advanced functions. +Reads a register from the LSM6DS3TR-C Accelerometer. Can be used for configuring +advanced functions. -Check out [the Puck.js page on the accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) -for more information and links to modules that use this function. +Check out [the Puck.js page on the +accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more +information and links to modules that use this function. */ int jswrap_puck_accelRd(JsVarInt reg) { if (!PUCKJS_HAS_ACCEL) { @@ -1097,17 +1118,17 @@ int jswrap_puck_accelRd(JsVarInt reg) { ["anode","pin","(optional) pin to use for IR LED anode - if not defined, the built-in IR LED is used"] ] } -Transmit the given set of IR pulses - data should be an array of pulse times -in milliseconds (as `[on, off, on, off, on, etc]`). +Transmit the given set of IR pulses - data should be an array of pulse times in +milliseconds (as `[on, off, on, off, on, etc]`). For example `Puck.IR(pulseTimes)` - see http://www.espruino.com/Puck.js+Infrared for a full example. -You can also attach an external LED to Puck.js, in which case -you can just execute `Puck.IR(pulseTimes, led_cathode, led_anode)` +You can also attach an external LED to Puck.js, in which case you can just +execute `Puck.IR(pulseTimes, led_cathode, led_anode)` -It is also possible to just supply a single pin for IR transmission -with `Puck.IR(pulseTimes, led_anode)` (on 2v05 and above). +It is also possible to just supply a single pin for IR transmission with +`Puck.IR(pulseTimes, led_anode)` (on 2v05 and above). */ Pin _jswrap_puck_IR_pin; void _jswrap_puck_IR_on() { @@ -1210,17 +1231,16 @@ void jswrap_puck_IR(JsVar *data, Pin cathode, Pin anode) { } Capacitive sense - the higher the capacitance, the higher the number returned. -If called without arguments, a value depending on the capacitance of what is +If called without arguments, a value depending on the capacitance of what is attached to pin D11 will be returned. If you attach a length of wire to D11, you'll be able to see a higher value returned when your hand is near the wire than when it is away. -You can also supply pins to use yourself, however if you do this then -the TX pin must be connected to RX pin and sense plate via a roughly 1MOhm -resistor. +You can also supply pins to use yourself, however if you do this then the TX pin +must be connected to RX pin and sense plate via a roughly 1MOhm resistor. -When not supplying pins, Puck.js uses an internal resistor between D12(tx) -and D11(rx). +When not supplying pins, Puck.js uses an internal resistor between D12(tx) and +D11(rx). */ int jswrap_puck_capSense(Pin tx, Pin rx) { if (!PUCKJS_HAS_CAPSENSE) { @@ -1243,8 +1263,8 @@ int jswrap_puck_capSense(Pin tx, Pin rx) { } Return a light value based on the light the red LED is seeing. -**Note:** If called more than 5 times per second, the received light value -may not be accurate. +**Note:** If called more than 5 times per second, the received light value may +not be accurate. */ JsVarFloat jswrap_puck_light() { // If pin state wasn't an analog input before, make it one now, @@ -1281,8 +1301,8 @@ JsVarFloat jswrap_puck_light() { } DEPRECATED - Please use `E.getBattery()` instead. -Return an approximate battery percentage remaining based on -a normal CR2032 battery (2.8 - 2.2v). +Return an approximate battery percentage remaining based on a normal CR2032 +battery (2.8 - 2.2v). */ JsVarInt jswrap_puck_getBattery() { JsVarFloat v = jshReadVRef(); @@ -1349,16 +1369,16 @@ static bool selftest_check_pin(Pin pin, char *err) { "generate" : "jswrap_puck_selfTest", "return" : ["bool", "True if the self-test passed" ] } -Run a self-test, and return true for a pass. This checks for shorts -between pins, so your Puck shouldn't have anything connected to it. +Run a self-test, and return true for a pass. This checks for shorts between +pins, so your Puck shouldn't have anything connected to it. -**Note:** This self-test auto starts if you hold the button on your Puck -down while inserting the battery, leave it pressed for 3 seconds (while -the green LED is lit) and release it soon after all LEDs turn on. 5 -red blinks is a fail, 5 green is a pass. +**Note:** This self-test auto starts if you hold the button on your Puck down +while inserting the battery, leave it pressed for 3 seconds (while the green LED +is lit) and release it soon after all LEDs turn on. 5 red blinks is a fail, 5 +green is a pass. -If the self test fails, it'll set the Puck.js Bluetooth advertising name -to `Puck.js !ERR` where ERR is a 3 letter error code. +If the self test fails, it'll set the Puck.js Bluetooth advertising name to +`Puck.js !ERR` where ERR is a 3 letter error code. */ diff --git a/libs/trigger/jswrap_trigger.c b/libs/trigger/jswrap_trigger.c index 04c91135cc..f219ca85a0 100644 --- a/libs/trigger/jswrap_trigger.c +++ b/libs/trigger/jswrap_trigger.c @@ -22,7 +22,11 @@ "type" : "class", "class" : "Trig" } -This class exists in order to interface Espruino with fast-moving trigger wheels. Trigger wheels are physical discs with evenly spaced teeth cut into them, and often with one or two teeth next to each other missing. A sensor sends a signal whenever a tooth passed by, and this allows a device to measure not only RPM, but absolute position. +This class exists in order to interface Espruino with fast-moving trigger +wheels. Trigger wheels are physical discs with evenly spaced teeth cut into +them, and often with one or two teeth next to each other missing. A sensor sends +a signal whenever a tooth passed by, and this allows a device to measure not +only RPM, but absolute position. This class is currently in testing - it is NOT AVAILABLE on normal boards. */ diff --git a/libs/wio_lte/jswrap_wio_lte.c b/libs/wio_lte/jswrap_wio_lte.c index 270b33fb99..07d30a6a4c 100644 --- a/libs/wio_lte/jswrap_wio_lte.c +++ b/libs/wio_lte/jswrap_wio_lte.c @@ -61,7 +61,8 @@ void jswrap_wio_lte_led(int r, int g, int b) { ["onoff","bool","Whether to turn the Grove connectors power on or off (D38/D39 are always powered)"] ] } -Set the power of Grove connectors, except for `D38` and `D39` which are always on. +Set the power of Grove connectors, except for `D38` and `D39` which are always +on. */ void jswrap_wio_lte_setGrovePower(bool pwr) { jshPinOutput(JSH_PORTB_OFFSET+10, pwr); @@ -78,7 +79,8 @@ void jswrap_wio_lte_setGrovePower(bool pwr) { } Turn power to the WIO's LED on or off. -Turning the LED on won't immediately display a color - that must be done with `WioLTE.LED(r,g,b)` +Turning the LED on won't immediately display a color - that must be done with +`WioLTE.LED(r,g,b)` */ void jswrap_wio_lte_setLEDPower(bool pwr) { jshPinOutput(JSH_PORTA_OFFSET+8, pwr); diff --git a/src/jswrap_array.c b/src/jswrap_array.c index 376b9ce279..c92f93df8f 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -29,7 +29,8 @@ } This is the built-in JavaScript class for arrays. -Arrays can be defined with ```[]```, ```new Array()```, or ```new Array(length)``` +Arrays can be defined with ```[]```, ```new Array()```, or ```new +Array(length)``` */ /*JSON{ @@ -50,7 +51,8 @@ Arrays can be defined with ```[]```, ```new Array()```, or ```new Array(length)` "(...items: T[]): T[];" ] } -Create an Array. Either give it one integer argument (>=0) which is the length of the array, or any number of arguments +Create an Array. Either give it one integer argument (>=0) which is the length +of the array, or any number of arguments */ JsVar *jswrap_array_constructor(JsVar *args) { assert(args); @@ -176,7 +178,8 @@ bool jswrap_array_includes(JsVar *arr, JsVar *value, JsVarInt startIdx) { "return" : ["JsVar","A String representing the Joined array"], "typescript" : "join(separator?: string): string;" } -Join all elements of this array together into one string, using 'separator' between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` +Join all elements of this array together into one string, using 'separator' +between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` */ JsVar *jswrap_array_join(JsVar *parent, JsVar *filler) { if (!jsvIsIterable(parent)) return 0; @@ -203,7 +206,8 @@ JsVar *jswrap_array_join(JsVar *parent, JsVar *filler) { } Push a new value onto the end of this array' -This is the opposite of `[1,2,3].unshift(0)`, which adds one or more elements to the beginning of the array. +This is the opposite of `[1,2,3].unshift(0)`, which adds one or more elements to +the beginning of the array. */ JsVarInt jswrap_array_push(JsVar *parent, JsVar *args) { if (!jsvIsArray(parent)) return -1; @@ -233,7 +237,8 @@ JsVarInt jswrap_array_push(JsVar *parent, JsVar *args) { } Remove and return the value on the end of this array. -This is the opposite of `[1,2,3].shift()`, which removes an element from the beginning of the array. +This is the opposite of `[1,2,3].shift()`, which removes an element from the +beginning of the array. */ /// return types for _jswrap_array_iterate_with_callback @@ -345,7 +350,8 @@ static JsVar *_jswrap_array_iterate_with_callback( "return" : ["JsVar","An array containing the results"], "typescript" : "map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];" } -Return an array which is made from the following: ```A.map(function) = [function(A[0]), function(A[1]), ...]``` +Return an array which is made from the following: ```A.map(function) = +[function(A[0]), function(A[1]), ...]``` */ JsVar *jswrap_array_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { return _jswrap_array_iterate_with_callback("map", parent, funcVar, thisVar, RETURN_ARRAY, false, false); @@ -383,7 +389,8 @@ void jswrap_array_forEach(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { "filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];" ] } -Return an array which contains only those elements for which the callback function returns 'true' +Return an array which contains only those elements for which the callback +function returns 'true' */ JsVar *jswrap_array_filter(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { return _jswrap_array_iterate_with_callback("filter", parent, funcVar, thisVar, RETURN_ARRAY, true, true); @@ -404,7 +411,8 @@ JsVar *jswrap_array_filter(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { "find(predicate: (value: T, index: number, obj: T[]) => unknown): T | undefined;" ] } -Return the array element where `function` returns `true`, or `undefined` if it doesn't returns `true` for any element. +Return the array element where `function` returns `true`, or `undefined` if it +doesn't returns `true` for any element. ``` ["Hello","There","World"].find(a=>a[0]=="T") @@ -427,7 +435,8 @@ JsVar *jswrap_array_find(JsVar *parent, JsVar *funcVar) { "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"], "typescript" : "findIndex(predicate: (value: T, index: number, obj: T[]) => unknown): number;" } -Return the array element's index where `function` returns `true`, or `-1` if it doesn't returns `true` for any element. +Return the array element's index where `function` returns `true`, or `-1` if it +doesn't returns `true` for any element. ``` ["Hello","There","World"].findIndex(a=>a[0]=="T") @@ -452,7 +461,8 @@ JsVar *jswrap_array_findIndex(JsVar *parent, JsVar *funcVar) { "return" : ["JsVar","A boolean containing the result"], "typescript" : "some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;" } -Return 'true' if the callback returns 'true' for any of the elements in the array +Return 'true' if the callback returns 'true' for any of the elements in the +array */ JsVar *jswrap_array_some(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { return _jswrap_array_iterate_with_callback("some", parent, funcVar, thisVar, RETURN_BOOL, true, false); @@ -489,7 +499,9 @@ JsVar *jswrap_array_every(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { "return" : ["JsVar","The value returned by the last function called"], "typescript" : "reduce(callback: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;" } -Execute `previousValue=initialValue` and then `previousValue = callback(previousValue, currentValue, index, array)` for each element in the array, and finally return previousValue. +Execute `previousValue=initialValue` and then `previousValue = +callback(previousValue, currentValue, index, array)` for each element in the +array, and finally return previousValue. */ JsVar *jswrap_array_reduce(JsVar *parent, JsVar *funcVar, JsVar *initialValue) { const char *name = "reduce"; @@ -673,7 +685,8 @@ JsVar *jswrap_array_shift(JsVar *parent) { } Add one or more items to the start of the array, and return its new length. -This is the opposite of `[1,2,3].push(4)`, which puts one or more elements on the end. +This is the opposite of `[1,2,3].push(4)`, which puts one or more elements on +the end. */ JsVarInt jswrap_array_unshift(JsVar *parent, JsVar *elements) { // just use splice, as this does all the hard work for us @@ -907,7 +920,8 @@ JsVar *jswrap_array_sort (JsVar *array, JsVar *compareFn) { "return" : ["JsVar","An Array"], "typescript" : "concat(...args: (T | T[])[]): T[];" } -Create a new array, containing the elements from this one and any arguments, if any argument is an array then those elements will be added. +Create a new array, containing the elements from this one and any arguments, if +any argument is an array then those elements will be added. */ JsVar *jswrap_array_concat(JsVar *parent, JsVar *args) { JsVar *result = jsvNewEmptyArray(); diff --git a/src/jswrap_arraybuffer.c b/src/jswrap_arraybuffer.c index 93a9ea297b..a0bda29782 100644 --- a/src/jswrap_arraybuffer.c +++ b/src/jswrap_arraybuffer.c @@ -34,8 +34,8 @@ interface ArrayLike { } This is the built-in JavaScript class for array buffers. -If you want to access arrays of differing types of data -you may also find `DataView` useful. +If you want to access arrays of differing types of data you may also find +`DataView` useful. */ /*JSON{ @@ -56,8 +56,8 @@ This is the built-in JavaScript class that is the prototype for: * [Float32Array](/Reference#Float32Array) * [Float64Array](/Reference#Float64Array) -If you want to access arrays of differing types of data -you may also find `DataView` useful. +If you want to access arrays of differing types of data you may also find +`DataView` useful. */ /*JSON{ @@ -67,11 +67,14 @@ you may also find `DataView` useful. "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT8", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 8 bit unsigned integers. +This is the built-in JavaScript class for a typed array of 8 bit unsigned +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -80,11 +83,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==(ARRAYBUFFERVIEW_UINT8|ARRAYBUFFERVIEW_CLAMPED)", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 8 bit unsigned integers that are automatically clamped to the range 0 to 255. +This is the built-in JavaScript class for a typed array of 8 bit unsigned +integers that are automatically clamped to the range 0 to 255. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -93,11 +99,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT8", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 8 bit signed integers. +This is the built-in JavaScript class for a typed array of 8 bit signed +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -106,11 +115,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT16", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 16 bit unsigned integers. +This is the built-in JavaScript class for a typed array of 16 bit unsigned +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -119,11 +131,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT16", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 16 bit signed integers. +This is the built-in JavaScript class for a typed array of 16 bit signed +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -133,11 +148,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT24", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 24 bit unsigned integers. +This is the built-in JavaScript class for a typed array of 24 bit unsigned +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -146,11 +164,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_UINT32", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 32 bit unsigned integers. +This is the built-in JavaScript class for a typed array of 32 bit unsigned +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -159,11 +180,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_INT32", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 32 bit signed integers. +This is the built-in JavaScript class for a typed array of 32 bit signed +integers. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -172,11 +196,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_FLOAT32", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 32 bit floating point values. +This is the built-in JavaScript class for a typed array of 32 bit floating point +values. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ /*JSON{ "type" : "class", @@ -185,11 +212,14 @@ Arrays of this type include all the methods from [ArrayBufferView](/Reference#Ar "check" : "jsvIsArrayBuffer(var) && var->varData.arraybuffer.type==ARRAYBUFFERVIEW_FLOAT64", "not_real_object" : "Don't treat this as a real object - it's handled differently internally" } -This is the built-in JavaScript class for a typed array of 64 bit floating point values. +This is the built-in JavaScript class for a typed array of 64 bit floating point +values. -Instantiate this in order to efficiently store arrays of data (Espruino's normal arrays store data in a map, which is inefficient for non-sparse arrays). +Instantiate this in order to efficiently store arrays of data (Espruino's normal +arrays store data in a map, which is inefficient for non-sparse arrays). -Arrays of this type include all the methods from [ArrayBufferView](/Reference#ArrayBufferView) +Arrays of this type include all the methods from +[ArrayBufferView](/Reference#ArrayBufferView) */ @@ -267,7 +297,10 @@ The length, in bytes, of the `ArrayBuffer` "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -287,9 +320,13 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8ClampedArray;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. -Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. e.g. after `a[0]=12345;`, `a[0]==255`. +Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. +e.g. after `a[0]=12345;`, `a[0]==255`. */ /*JSON{ "type" : "constructor", @@ -309,7 +346,10 @@ Clamped arrays clamp their values to the allowed range, rather than 'wrapping'. "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -329,7 +369,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -349,7 +392,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -370,7 +416,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint24Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -390,7 +439,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -410,7 +462,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -430,7 +485,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ /*JSON{ "type" : "constructor", @@ -450,7 +508,10 @@ Create a typed array based on the given input. Either an existing Array Buffer, "new(buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;" ] } -Create a typed array based on the given input. Either an existing Array Buffer, an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. `Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied rather than referenced. +Create a typed array based on the given input. Either an existing Array Buffer, +an Integer as a Length, or a simple array. If an `ArrayBufferView` (e.g. +`Uint8Array` rather than `ArrayBuffer`) is given, it will be completely copied +rather than referenced. */ JsVar *jswrap_typedarray_constructor(JsVarDataArrayBufferViewType type, JsVar *arr, JsVarInt byteOffset, JsVarInt length) { @@ -536,7 +597,8 @@ The length, in bytes, of the `ArrayBufferView` "return" : ["int","The byte Offset"], "typescript" : "readonly byteOffset: number;" } -The offset, in bytes, to the first byte of the view within the backing `ArrayBuffer` +The offset, in bytes, to the first byte of the view within the backing +`ArrayBuffer` */ /*JSON{ @@ -614,9 +676,11 @@ void jswrap_arraybufferview_set(JsVar *parent, JsVar *arr, int offset) { "return_object" : "ArrayBufferView", "typescript" : "map(callbackfn: (value: number, index: number, array: T) => number, thisArg?: any): T;" } -Return an array which is made from the following: ```A.map(function) = [function(A[0]), function(A[1]), ...]``` +Return an array which is made from the following: ```A.map(function) = +[function(A[0]), function(A[1]), ...]``` - **Note:** This returns an `ArrayBuffer` of the same type it was called on. To get an `Array`, use `Array.map`, e.g. `[].map.call(myArray, x=>x+1)` + **Note:** This returns an `ArrayBuffer` of the same type it was called on. To + get an `Array`, use `Array.map`, e.g. `[].map.call(myArray, x=>x+1)` */ JsVar *jswrap_arraybufferview_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) { if (!jsvIsArrayBuffer(parent)) { @@ -683,7 +747,8 @@ JsVar *jswrap_arraybufferview_map(JsVar *parent, JsVar *funcVar, JsVar *thisVar) "return_object" : "ArrayBufferView", "typescript" : "subarray(begin?: number, end?: number): T;" } -Returns a smaller part of this array which references the same data (it doesn't copy it). +Returns a smaller part of this array which references the same data (it doesn't +copy it). */ JsVar *jswrap_arraybufferview_subarray(JsVar *parent, JsVarInt begin, JsVar *endVar) { if (!jsvIsArrayBuffer(parent)) { @@ -761,7 +826,8 @@ Return `true` if the array includes the value, `false` otherwise "return" : ["JsVar","A String representing the Joined array"], "typescript" : "join(separator?: string): string;" } -Join all elements of this array together into one string, using 'separator' between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` +Join all elements of this array together into one string, using 'separator' +between them. e.g. ```[1,2,3].join(' ')=='1 2 3'``` */ /*JSON{ "type" : "method", @@ -828,7 +894,9 @@ Executes a provided function once per array element. "return" : ["JsVar","The value returned by the last function called"], "typescript" : "reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: T) => number, initialValue?: number): number;" } -Execute `previousValue=initialValue` and then `previousValue = callback(previousValue, currentValue, index, array)` for each element in the array, and finally return previousValue. +Execute `previousValue=initialValue` and then `previousValue = +callback(previousValue, currentValue, index, array)` for each element in the +array, and finally return previousValue. */ /*JSON{ "type" : "method", @@ -860,7 +928,8 @@ Fill this array with the given value, for every index `>= start` and `< end` "return" : ["JsVar","An array containing the results"], "typescript" : "filter(predicate: (value: number, index: number, array: T) => any, thisArg?: any): T;" } -Return an array which contains only those elements for which the callback function returns 'true' +Return an array which contains only those elements for which the callback +function returns 'true' */ /*JSON{ "type" : "method", @@ -874,7 +943,8 @@ Return an array which contains only those elements for which the callback functi "return" : ["JsVar","The array element where `function` returns `true`, or `undefined`"], "typescript" : "find(predicate: (value: number, index: number, obj: T) => boolean, thisArg?: any): number | undefined;" } -Return the array element where `function` returns `true`, or `undefined` if it doesn't returns `true` for any element. +Return the array element where `function` returns `true`, or `undefined` if it +doesn't returns `true` for any element. */ /*JSON{ "type" : "method", @@ -888,7 +958,8 @@ Return the array element where `function` returns `true`, or `undefined` if it d "return" : ["JsVar","The array element's index where `function` returns `true`, or `-1`"], "typescript" : "findIndex(predicate: (value: number, index: number, obj: T) => boolean, thisArg?: any): number;" } -Return the array element's index where `function` returns `true`, or `-1` if it doesn't returns `true` for any element. +Return the array element's index where `function` returns `true`, or `-1` if it +doesn't returns `true` for any element. */ /*JSON{ "type" : "method", diff --git a/src/jswrap_dataview.c b/src/jswrap_dataview.c index ba534a9fa5..8d810db69b 100644 --- a/src/jswrap_dataview.c +++ b/src/jswrap_dataview.c @@ -42,7 +42,8 @@ This class helps "ifndef" : "SAVE_ON_FLASH", "typescript" : "new(buffer: ArrayBuffer, byteOffset?: number, byteLength?: number): DataView;" } -Create a `DataView` object that can be used to access the data in an `ArrayBuffer`. +Create a `DataView` object that can be used to access the data in an +`ArrayBuffer`. ``` var b = new ArrayBuffer(8) diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 404a7fb6eb..621483f26d 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -223,13 +223,13 @@ static CalendarDate getCalendarDateFromDateVar(JsVar *date, bool forceGMT) { } The built-in class for handling Dates. -**Note:** By default the time zone is GMT+0, however you can change the -timezone using the `E.setTimeZone(...)` function. +**Note:** By default the time zone is GMT+0, however you can change the timezone +using the `E.setTimeZone(...)` function. For example `E.setTimeZone(1)` will be GMT+0100 -*However* if you have daylight savings time set with `E.setDST(...)` then the timezone set -by `E.setTimeZone(...)` will be _ignored_. +*However* if you have daylight savings time set with `E.setDST(...)` then the +timezone set by `E.setTimeZone(...)` will be _ignored_. */ @@ -240,7 +240,8 @@ by `E.setTimeZone(...)` will be _ignored_. "generate" : "jswrap_date_now", "return" : ["float",""] } -Get the number of milliseconds elapsed since 1970 (or on embedded platforms, since startup) +Get the number of milliseconds elapsed since 1970 (or on embedded platforms, +since startup) */ JsVarFloat jswrap_date_now() { // Not quite sure why we need this, but (JsVarFloat)jshGetSystemTime() / (JsVarFloat)jshGetTimeFromMilliseconds(1) in inaccurate on STM32 @@ -676,7 +677,8 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal } Converts to a String, eg: `Fri Jun 20 2014 14:52:20 GMT+0000` - **Note:** This uses whatever timezone was set with `E.setTimeZone()` or `E.setDST()` + **Note:** This uses whatever timezone was set with `E.setTimeZone()` or + `E.setDST()` */ JsVar *jswrap_date_toString(JsVar *parent) { TimeInDay time = getTimeFromDateVar(parent, false/*system timezone*/); @@ -752,7 +754,8 @@ JsVar *jswrap_date_toISOString(JsVar *parent) { "return" : ["JsVar","A String"], "typescript" : "toLocalISOString(): string;" } -Converts to a ISO 8601 String (with timezone information), eg: `2014-06-20T14:52:20.123-0500` +Converts to a ISO 8601 String (with timezone information), eg: +`2014-06-20T14:52:20.123-0500` */ JsVar *jswrap_date_toLocalISOString(JsVar *parent) { TimeInDay time = getTimeFromDateVar(parent, false/*system timezone*/); @@ -834,7 +837,8 @@ static bool _parse_time(TimeInDay *time, int initialChars) { "return" : ["float","The number of milliseconds since 1970"], "typescript" : "parse(str: string): number;" } -Parse a date string and return milliseconds since 1970. Data can be either '2011-10-20T14:48:00', '2011-10-20' or 'Mon, 25 Dec 1995 13:30:00 +0430' +Parse a date string and return milliseconds since 1970. Data can be either +'2011-10-20T14:48:00', '2011-10-20' or 'Mon, 25 Dec 1995 13:30:00 +0430' */ JsVarFloat jswrap_date_parse(JsVar *str) { if (!jsvIsString(str)) return 0; diff --git a/src/jswrap_error.c b/src/jswrap_error.c index e087cf979c..836c676da9 100644 --- a/src/jswrap_error.c +++ b/src/jswrap_error.c @@ -44,8 +44,8 @@ The base class for internal errors "type" : "class", "class" : "ReferenceError" } -The base class for reference errors - where a variable -which doesn't exist has been accessed. +The base class for reference errors - where a variable which doesn't exist has +been accessed. */ JsVar *_jswrap_error_constructor(JsVar *msg, char *type) { diff --git a/src/jswrap_espruino.c b/src/jswrap_espruino.c index 7459def049..09b73ae7ee 100644 --- a/src/jswrap_espruino.c +++ b/src/jswrap_espruino.c @@ -68,9 +68,9 @@ E.on('kill', function() { }); ``` -**NOTE:** This event is not called when the device is 'hard reset' - for -example by removing power, hitting an actual reset button, or via -a Watchdog timer reset. +**NOTE:** This event is not called when the device is 'hard reset' - for example +by removing power, hitting an actual reset button, or via a Watchdog timer +reset. */ /*JSON{ @@ -82,16 +82,15 @@ a Watchdog timer reset. ], "typescript" : "on(event: \"errorFlag\", callback: (errorFlags: ErrorFlag[]) => void): void;" } -This event is called when an error is created by Espruino itself (rather -than JS code) which changes the state of the error flags reported by -`E.getErrorFlags()` +This event is called when an error is created by Espruino itself (rather than JS +code) which changes the state of the error flags reported by `E.getErrorFlags()` This could be low memory, full buffers, UART overflow, etc. `E.getErrorFlags()` has a full description of each type of error. -This event will only be emitted when error flag is set. If the error -flag was already set nothing will be emitted. To clear error flags -so that you do get a callback each time a flag is set, call `E.getErrorFlags()`. +This event will only be emitted when error flag is set. If the error flag was +already set nothing will be emitted. To clear error flags so that you do get a +callback each time a flag is set, call `E.getErrorFlags()`. */ /*JSON{ "type" : "event", @@ -103,11 +102,11 @@ so that you do get a callback each time a flag is set, call `E.getErrorFlags()`. ["b","int","Touch count - 0 for released, 1 for pressed"] ] } -This event is called when a full touchscreen device on an Espruino -is interacted with. +This event is called when a full touchscreen device on an Espruino is interacted +with. -**Note:** This event is not implemented on Bangle.js because -it only has a two area touchscreen. +**Note:** This event is not implemented on Bangle.js because it only has a two +area touchscreen. To use the touchscreen to draw lines, you could do: @@ -130,11 +129,16 @@ E.on('touch',t=>{ } Use the microcontroller's internal thermistor to work out the temperature. -On Puck.js v2.0 this will use the on-board PCT2075TP temperature sensor, but on other devices it may not be desperately well calibrated. +On Puck.js v2.0 this will use the on-board PCT2075TP temperature sensor, but on +other devices it may not be desperately well calibrated. -While this is implemented on Espruino boards, it may not be implemented on other devices. If so it'll return NaN. +While this is implemented on Espruino boards, it may not be implemented on other +devices. If so it'll return NaN. - **Note:** This is not entirely accurate and varies by a few degrees from chip to chip. It measures the **die temperature**, so when connected to USB it could be reading 10 over degrees C above ambient temperature. When running from battery with `setDeepSleep(true)` it is much more accurate though. + **Note:** This is not entirely accurate and varies by a few degrees from chip + to chip. It measures the **die temperature**, so when connected to USB it could + be reading 10 over degrees C above ambient temperature. When running from + battery with `setDeepSleep(true)` it is much more accurate though. */ JsVarFloat jswrap_espruino_getTemperature() { #ifdef PUCKJS @@ -152,13 +156,16 @@ JsVarFloat jswrap_espruino_getTemperature() { "generate_full" : "jshReadVRef()", "return" : ["float","The voltage (in Volts) that a reading of 1 from `analogRead` actually represents - usually around 3.3v"] } -Check the internal voltage reference. To work out an actual voltage of an input pin, you can use `analogRead(pin)*E.getAnalogVRef()` +Check the internal voltage reference. To work out an actual voltage of an input +pin, you can use `analogRead(pin)*E.getAnalogVRef()` - **Note:** This value is calculated by reading the voltage on an internal voltage reference with the ADC. -It will be slightly noisy, so if you need this for accurate measurements we'd recommend that you call -this function several times and average the results. + **Note:** This value is calculated by reading the voltage on an internal +voltage reference with the ADC. It will be slightly noisy, so if you need this +for accurate measurements we'd recommend that you call this function several +times and average the results. -While this is implemented on Espruino boards, it may not be implemented on other devices. If so it'll return NaN. +While this is implemented on Espruino boards, it may not be implemented on other +devices. If so it'll return NaN. */ @@ -195,15 +202,20 @@ int nativeCallGetCType() { "return" : ["JsVar","The native function"], "typescript" : "nativeCall(addr: number, sig: string, data?: string): any;" } -ADVANCED: This is a great way to crash Espruino if you're not sure what you are doing +ADVANCED: This is a great way to crash Espruino if you're not sure what you are +doing -Create a native function that executes the code at the given address, e.g. `E.nativeCall(0x08012345,'double (double,double)')(1.1, 2.2)` +Create a native function that executes the code at the given address, e.g. +`E.nativeCall(0x08012345,'double (double,double)')(1.1, 2.2)` -If you're executing a thumb function, you'll almost certainly need to set the bottom bit of the address to 1. +If you're executing a thumb function, you'll almost certainly need to set the +bottom bit of the address to 1. -Note it's not guaranteed that the call signature you provide can be used - there are limits on the number of arguments allowed. +Note it's not guaranteed that the call signature you provide can be used - there +are limits on the number of arguments allowed. -When supplying `data`, if it is a 'flat string' then it will be used directly, otherwise it'll be converted to a flat string and used. +When supplying `data`, if it is a 'flat string' then it will be used directly, +otherwise it'll be converted to a flat string and used. */ JsVar *jswrap_espruino_nativeCall(JsVarInt addr, JsVar *signature, JsVar *data) { unsigned int argTypes = 0; @@ -316,7 +328,9 @@ JsVarFloat jswrap_espruino_sum(JsVar *arr) { "return" : ["float","The variance of the given buffer"], "typescript" : "variance(arr: string | number[] | ArrayBuffer, mean: number): number;" } -Work out the variance of the contents of the given Array, String or ArrayBuffer and return the result. This is equivalent to `v=0;for (i in arr) v+=Math.pow(mean-arr[i],2)` +Work out the variance of the contents of the given Array, String or ArrayBuffer +and return the result. This is equivalent to `v=0;for (i in arr) +v+=Math.pow(mean-arr[i],2)` */ JsVarFloat jswrap_espruino_variance(JsVar *arr, JsVarFloat mean) { if (!(jsvIsIterable(arr))) { @@ -351,7 +365,8 @@ JsVarFloat jswrap_espruino_variance(JsVar *arr, JsVarFloat mean) { "return" : ["float","The variance of the given buffer"], "typescript" : "convolve(arr1: string | number[] | ArrayBuffer, arr2: string | number[] | ArrayBuffer, offset: number): number;" } -Convolve arr1 with arr2. This is equivalent to `v=0;for (i in arr1) v+=arr1[i] * arr2[(i+offset) % arr2.length]` +Convolve arr1 with arr2. This is equivalent to `v=0;for (i in arr1) v+=arr1[i] * +arr2[(i+offset) % arr2.length]` */ JsVarFloat jswrap_espruino_convolve(JsVar *arr1, JsVar *arr2, int offset) { if (!(jsvIsIterable(arr1)) || @@ -485,16 +500,18 @@ short FFT(short int dir,long m,FFTDATATYPE *x,FFTDATATYPE *y) ], "typescript" : "FFT(arrReal: string | number[] | ArrayBuffer, arrImage?: string | number[] | ArrayBuffer, inverse?: boolean): any;" } -Performs a Fast Fourier Transform (FFT) in 32 bit floats on the supplied data and writes it back into the -original arrays. Note that if only one array is supplied, the data written back is the modulus of the complex -result `sqrt(r*r+i*i)`. +Performs a Fast Fourier Transform (FFT) in 32 bit floats on the supplied data +and writes it back into the original arrays. Note that if only one array is +supplied, the data written back is the modulus of the complex result +`sqrt(r*r+i*i)`. -In order to perform the FFT, there has to be enough room on the stack to allocate two arrays of 32 bit -floating point numbers - this will limit the maximum size of FFT possible to around 1024 items on -most platforms. +In order to perform the FFT, there has to be enough room on the stack to +allocate two arrays of 32 bit floating point numbers - this will limit the +maximum size of FFT possible to around 1024 items on most platforms. -**Note:** on the Original Espruino board, FFTs are performed in 64bit arithmetic as there isn't -space to include the 32 bit maths routines (2x more RAM is required). +**Note:** on the Original Espruino board, FFTs are performed in 64bit arithmetic +as there isn't space to include the 32 bit maths routines (2x more RAM is +required). */ void _jswrap_espruino_FFT_getData(FFTDATATYPE *dst, JsVar *src, size_t length) { JsvIterator it; @@ -578,9 +595,11 @@ void jswrap_espruino_FFT(JsVar *arrReal, JsVar *arrImag, bool inverse) { ], "typescript" : "enableWatchdog(timeout: number, isAuto?: boolean): void;" } -Enable the watchdog timer. This will reset Espruino if it isn't able to return to the idle loop within the timeout. +Enable the watchdog timer. This will reset Espruino if it isn't able to return +to the idle loop within the timeout. -If `isAuto` is false, you must call `E.kickWatchdog()` yourself every so often or the chip will reset. +If `isAuto` is false, you must call `E.kickWatchdog()` yourself every so often +or the chip will reset. ``` E.enableWatchdog(0.5); // automatic mode @@ -597,11 +616,13 @@ setInterval(function() { // or if the interval fails to be called ``` -**NOTE:** This is only implemented on STM32 and nRF5x devices (all official Espruino boards). +**NOTE:** This is only implemented on STM32 and nRF5x devices (all official +Espruino boards). **NOTE:** On STM32 (Pico, WiFi, Original) with `setDeepSleep(1)` you need to -explicitly wake Espruino up with an interval of less than the watchdog timeout or the watchdog will fire and -the board will reboot. You can do this with `setInterval("", time_in_milliseconds)`. +explicitly wake Espruino up with an interval of less than the watchdog timeout +or the watchdog will fire and the board will reboot. You can do this with +`setInterval("", time_in_milliseconds)`. */ void jswrap_espruino_enableWatchdog(JsVarFloat time, JsVar *isAuto) { if (time<0 || isnan(time)) time=1; @@ -622,7 +643,8 @@ void jswrap_espruino_enableWatchdog(JsVarFloat time, JsVar *isAuto) { Kicks a Watchdog timer set up with `E.enableWatchdog(..., false)`. See `E.enableWatchdog` for more information. -**NOTE:** This is only implemented on STM32 and nRF5x devices (all official Espruino boards). +**NOTE:** This is only implemented on STM32 and nRF5x devices (all official +Espruino boards). */ void jswrap_espruino_kickWatchdog() { jshKickWatchDog(); @@ -663,17 +685,23 @@ type ErrorFlag = } Get and reset the error flags. Returns an array that can contain: -`'FIFO_FULL'`: The receive FIFO filled up and data was lost. This could be state transitions for setWatch, or received characters. +`'FIFO_FULL'`: The receive FIFO filled up and data was lost. This could be state +transitions for setWatch, or received characters. -`'BUFFER_FULL'`: A buffer for a stream filled up and characters were lost. This can happen to any stream - Serial,HTTP,etc. +`'BUFFER_FULL'`: A buffer for a stream filled up and characters were lost. This +can happen to any stream - Serial,HTTP,etc. -`'CALLBACK'`: A callback (`setWatch`, `setInterval`, `on('data',...)`) caused an error and so was removed. +`'CALLBACK'`: A callback (`setWatch`, `setInterval`, `on('data',...)`) caused an +error and so was removed. -`'LOW_MEMORY'`: Memory is running low - Espruino had to run a garbage collection pass or remove some of the command history +`'LOW_MEMORY'`: Memory is running low - Espruino had to run a garbage collection +pass or remove some of the command history -`'MEMORY'`: Espruino ran out of memory and was unable to allocate some data that it needed. +`'MEMORY'`: Espruino ran out of memory and was unable to allocate some data that +it needed. -`'UART_OVERFLOW'` : A UART received data but it was not read in time and was lost +`'UART_OVERFLOW'` : A UART received data but it was not read in time and was +lost */ JsVar *jswrap_espruino_getErrorFlags() { JsErrorFlags flags = jsErrorFlags; @@ -697,12 +725,17 @@ type Flag = "return" : ["JsVar","An object containing flag names and their values"], "typescript" : "getFlags(): { [key in Flag]: boolean }" } -Get Espruino's interpreter flags that control the way it handles your JavaScript code. +Get Espruino's interpreter flags that control the way it handles your JavaScript +code. * `deepSleep` - Allow deep sleep modes (also set by setDeepSleep) -* `pretokenise` - When adding functions, pre-minify them and tokenise reserved words -* `unsafeFlash` - Some platforms stop writes/erases to interpreter memory to stop you bricking the device accidentally - this removes that protection -* `unsyncFiles` - When writing files, *don't* flush all data to the SD card after each command (the default is *to* flush). This is much faster, but can cause filesystem damage if power is lost without the filesystem unmounted. +* `pretokenise` - When adding functions, pre-minify them and tokenise reserved + words +* `unsafeFlash` - Some platforms stop writes/erases to interpreter memory to + stop you bricking the device accidentally - this removes that protection +* `unsyncFiles` - When writing files, *don't* flush all data to the SD card + after each command (the default is *to* flush). This is much faster, but can + cause filesystem damage if power is lost without the filesystem unmounted. */ /*JSON{ "type" : "staticmethod", @@ -714,9 +747,11 @@ Get Espruino's interpreter flags that control the way it handles your JavaScript ], "typescript" : "setFlags(flags: { [key in Flag]?: boolean }): void" } -Set the Espruino interpreter flags that control the way it handles your JavaScript code. +Set the Espruino interpreter flags that control the way it handles your +JavaScript code. -Run `E.getFlags()` and check its description for a list of available flags and their values. +Run `E.getFlags()` and check its description for a list of available flags and +their values. */ // TODO Improve TypeScript declaration @@ -746,9 +781,11 @@ Run `E.getFlags()` and check its description for a list of available flags and t "return_object" : "ArrayBufferView", "typescript" : "toArrayBuffer(str: string): ArrayBuffer;" } -Create an ArrayBuffer from the given string. This is done via a reference, not a copy - so it is very fast and memory efficient. +Create an ArrayBuffer from the given string. This is done via a reference, not a +copy - so it is very fast and memory efficient. -Note that this is an ArrayBuffer, not a Uint8Array. To get one of those, do: `new Uint8Array(E.toArrayBuffer('....'))`. +Note that this is an ArrayBuffer, not a Uint8Array. To get one of those, do: +`new Uint8Array(E.toArrayBuffer('....'))`. */ JsVar *jswrap_espruino_toArrayBuffer(JsVar *str) { if (!jsvIsString(str)) return 0; @@ -767,17 +804,17 @@ JsVar *jswrap_espruino_toArrayBuffer(JsVar *str) { "return_object" : "String", "typescript" : "toString(...args: any[]): string | undefined;" } -Returns a 'flat' string representing the data in the arguments, or return `undefined` -if a flat string cannot be created. +Returns a 'flat' string representing the data in the arguments, or return +`undefined` if a flat string cannot be created. -This creates a string from the given arguments. If an argument is a String or an Array, -each element is traversed and added as an 8 bit character. If it is anything else, it is -converted to a character directly. +This creates a string from the given arguments. If an argument is a String or an +Array, each element is traversed and added as an 8 bit character. If it is +anything else, it is converted to a character directly. In the case where there's one argument which is an 8 bit typed array backed by a -flat string of the same length, the backing string will be returned without doing -a copy or other allocation. The same applies if there's a single argument which -is itself a flat string. +flat string of the same length, the backing string will be returned without +doing a copy or other allocation. The same applies if there's a single argument +which is itself a flat string. */ void (_jswrap_espruino_toString_char)(int ch, JsvStringIterator *it) { jsvStringIteratorSetCharAndNext(it, (char)ch); @@ -843,15 +880,19 @@ type Uint8ArrayResolvable = "return_object" : "Uint8Array", "typescript" : "toUint8Array(...args: Uint8ArrayResolvable[]): Uint8Array;" } -This creates a Uint8Array from the given arguments. These are handled as follows: +This creates a Uint8Array from the given arguments. These are handled as +follows: * `Number` -> read as an integer, using the lowest 8 bits - * `String` -> use each character's numeric value (e.g. `String.charCodeAt(...)`) + * `String` -> use each character's numeric value (e.g. + `String.charCodeAt(...)`) * `Array` -> Call itself on each element * `ArrayBuffer` or Typed Array -> use the lowest 8 bits of each element * `Object`: - * `{data:..., count: int}` -> call itself `object.count` times, on `object.data` - * `{callback : function}` -> call the given function, call itself on return value + * `{data:..., count: int}` -> call itself `object.count` times, on + `object.data` + * `{callback : function}` -> call the given function, call itself on return + value For example: @@ -894,25 +935,24 @@ JsVar *jswrap_espruino_toUint8Array(JsVar *args) { "return" : ["JsVar","A String"], "return_object" : "String" } -This performs the same basic function as `JSON.stringify`, -however `JSON.stringify` adds extra characters to conform -to the JSON spec which aren't required if outputting JS. +This performs the same basic function as `JSON.stringify`, however +`JSON.stringify` adds extra characters to conform to the JSON spec which aren't +required if outputting JS. -`E.toJS` will also stringify JS functions, whereas -`JSON.stringify` ignores them. +`E.toJS` will also stringify JS functions, whereas `JSON.stringify` ignores +them. For example: * `JSON.stringify({a:1,b:2}) == '{"a":1,"b":2}'` * `E.toJS({a:1,b:2}) == '{a:1,b:2}'` -**Note:** Strings generated with `E.toJS` can't be -reliably parsed by `JSON.parse` - however they are -valid JS so will work with `eval` (but this has security -implications if you don't trust the source of the string). +**Note:** Strings generated with `E.toJS` can't be reliably parsed by +`JSON.parse` - however they are valid JS so will work with `eval` (but this has +security implications if you don't trust the source of the string). -On the desktop [JSON5 parsers](https://github.com/json5/json5) -will parse the strings produced by `E.toJS` without trouble. +On the desktop [JSON5 parsers](https://github.com/json5/json5) will parse the +strings produced by `E.toJS` without trouble. */ JsVar *jswrap_espruino_toJS(JsVar *v) { JSONFlags flags = JSON_DROP_QUOTES|JSON_NO_UNDEFINED|JSON_ARRAYBUFFER_AS_ARRAY; @@ -935,13 +975,13 @@ JsVar *jswrap_espruino_toJS(JsVar *v) { "return" : ["JsVar","A String"], "return_object" : "String" } -This creates and returns a special type of string, which actually references -a specific memory address. It can be used in order to use sections of -Flash memory directly in Espruino (for example to execute code straight -from flash memory with `eval(E.memoryArea( ... ))`) +This creates and returns a special type of string, which actually references a +specific memory address. It can be used in order to use sections of Flash memory +directly in Espruino (for example to execute code straight from flash memory +with `eval(E.memoryArea( ... ))`) -**Note:** This is only tested on STM32-based platforms (Espruino Original -and Espruino Pico) at the moment. +**Note:** This is only tested on STM32-based platforms (Espruino Original and +Espruino Pico) at the moment. */ JsVar *jswrap_espruino_memoryArea(int addr, int len) { if (len<0) return 0; @@ -962,15 +1002,15 @@ JsVar *jswrap_espruino_memoryArea(int addr, int len) { "typescript" : "setBootCode(code: string, alwaysExec?: boolean): void;" } This writes JavaScript code into Espruino's flash memory, to be executed on -startup. It differs from `save()` in that `save()` saves the whole state of -the interpreter, whereas this just saves JS code that is executed at boot. +startup. It differs from `save()` in that `save()` saves the whole state of the +interpreter, whereas this just saves JS code that is executed at boot. Code will be executed before `onInit()` and `E.on('init', ...)`. If `alwaysExec` is `true`, the code will be executed even after a call to -`reset()`. This is useful if you're making something that you want to -program, but you want some code that is always built in (for instance -setting up a display or keyboard). +`reset()`. This is useful if you're making something that you want to program, +but you want some code that is always built in (for instance setting up a +display or keyboard). To remove boot code that has been saved previously, use `E.setBootCode("")` @@ -996,8 +1036,8 @@ void jswrap_espruino_setBootCode(JsVar *code, bool alwaysExec) { "return" : ["int","The actual frequency the clock has been set to"], "typescript" : "setClock(options: number | { M: number, N: number, P: number, Q: number, latency?: number, PCLK?: number, PCLK2?: number }): number;" } -This sets the clock frequency of Espruino's processor. It will return `0` if -it is unimplemented or the clock speed cannot be changed. +This sets the clock frequency of Espruino's processor. It will return `0` if it +is unimplemented or the clock speed cannot be changed. **Note:** On pretty much all boards, UART, SPI, I2C, PWM, etc will change frequency and will need setting up again in order to work. @@ -1016,14 +1056,14 @@ Optional arguments are: * `PCLK1` - Peripheral clock 1 divisor (default: 2) * `PCLK2` - Peripheral clock 2 divisor (default: 4) -The Pico's default is `{M:8, N:336, P:4, Q:7, PCLK1:2, PCLK2:4}`, use -`{M:8, N:336, P:8, Q:7, PCLK:1, PCLK2:2}` to halve the system clock speed -while keeping the peripherals running at the same speed (omitting PCLK1/2 -will lead to the peripherals changing speed too). +The Pico's default is `{M:8, N:336, P:4, Q:7, PCLK1:2, PCLK2:4}`, use `{M:8, +N:336, P:8, Q:7, PCLK:1, PCLK2:2}` to halve the system clock speed while keeping +the peripherals running at the same speed (omitting PCLK1/2 will lead to the +peripherals changing speed too). On STM32F4 boards (e.g. Espruino Pico), the USB clock needs to be kept at 48Mhz -or USB will fail to work. You'll also experience USB instability if the processor -clock falls much below 48Mhz. +or USB will fail to work. You'll also experience USB instability if the +processor clock falls much below 48Mhz. ### ESP8266 @@ -1046,19 +1086,18 @@ int jswrap_espruino_setClock(JsVar *options) { ], "typescript" : "setConsole(device: \"Serial1\" | \"USB\" | \"Bluetooth\" | \"Telnet\" | \"Terminal\" | Serial | null, options?: { force?: boolean }): void;" } -Changes the device that the JS console (otherwise known as the REPL) -is attached to. If the console is on a device, that -device can be used for programming Espruino. +Changes the device that the JS console (otherwise known as the REPL) is attached +to. If the console is on a device, that device can be used for programming +Espruino. Rather than calling `Serial.setConsole` you can call `E.setConsole("DeviceName")`. -This is particularly useful if you just want to -remove the console. `E.setConsole(null)` will -make the console completely inaccessible. +This is particularly useful if you just want to remove the console. +`E.setConsole(null)` will make the console completely inaccessible. -`device` may be `"Serial1"`,`"USB"`,`"Bluetooth"`,`"Telnet"`,`"Terminal"`, -any other *hardware* `Serial` device, or `null` to disable the console completely. +`device` may be `"Serial1"`,`"USB"`,`"Bluetooth"`,`"Telnet"`,`"Terminal"`, any +other *hardware* `Serial` device, or `null` to disable the console completely. `options` is of the form: @@ -1131,7 +1170,8 @@ Reverse the 8 bits in a byte, swapping MSB and LSB. For example, `E.reverseByte(0b10010000) == 0b00001001`. -Note that you can reverse all the bytes in an array with: `arr = arr.map(E.reverseByte)` +Note that you can reverse all the bytes in an array with: `arr = +arr.map(E.reverseByte)` */ int jswrap_espruino_reverseByte(int v) { unsigned int b = v&0xFF; @@ -1160,7 +1200,8 @@ void jswrap_espruino_dumpTimers() { "ifndef" : "RELEASE", "generate" : "jswrap_espruino_dumpLockedVars" } -Dump any locked variables that aren't referenced from `global` - for debugging memory leaks only. +Dump any locked variables that aren't referenced from `global` - for debugging +memory leaks only. */ #ifndef RELEASE void jswrap_espruino_dumpLockedVars() { @@ -1175,7 +1216,8 @@ void jswrap_espruino_dumpLockedVars() { "ifndef" : "RELEASE", "generate" : "jswrap_espruino_dumpFreeList" } -Dump any locked variables that aren't referenced from `global` - for debugging memory leaks only. +Dump any locked variables that aren't referenced from `global` - for debugging +memory leaks only. */ #ifndef RELEASE void jswrap_espruino_dumpFreeList() { @@ -1228,9 +1270,8 @@ void jswrap_e_dumpFragmentation() { "name" : "dumpVariables", "generate" : "jswrap_e_dumpVariables" } -Dumps a comma-separated list of all allocated variables -along with the variables they link to. Can be used -to visualise where memory is used. +Dumps a comma-separated list of all allocated variables along with the variables +they link to. Can be used to visualise where memory is used. */ void jswrap_e_dumpVariables() { jsiConsolePrintf("ref,size,flags,name,links...\n"); @@ -1317,12 +1358,12 @@ type VariableSizeInformation = { ] } Return the number of variable blocks used by the supplied variable. This is -useful if you're running out of memory and you want to be able to see what -is taking up most of the available space. +useful if you're running out of memory and you want to be able to see what is +taking up most of the available space. -If `depth>0` and the variable can be recursed into, an array listing all property -names (including internal Espruino names) and their sizes is returned. If -`depth>1` there is also a `more` field that inspects the objects' children's +If `depth>0` and the variable can be recursed into, an array listing all +property names (including internal Espruino names) and their sizes is returned. +If `depth>1` there is also a `more` field that inspects the objects' children's children. For instance `E.getSizeOf(function(a,b) { })` returns `5`. @@ -1343,8 +1384,8 @@ But `E.getSizeOf(function(a,b) { }, 1)` returns: ] ``` -In this case setting depth to `2` will make no difference as there are -no more children to traverse. +In this case setting depth to `2` will make no difference as there are no more +children to traverse. See http://www.espruino.com/Internals for more information */ @@ -1387,13 +1428,12 @@ JsVar *jswrap_espruino_getSizeOf(JsVar *v, int depth) { ], "return" : ["int","The address of the given variable"] } -Return the address in memory of the given variable. This can then -be used with `peek` and `poke` functions. However, changing data in -JS variables directly (flatAddress=false) will most likely result in a crash. +Return the address in memory of the given variable. This can then be used with +`peek` and `poke` functions. However, changing data in JS variables directly +(flatAddress=false) will most likely result in a crash. -This functions exists to allow embedded targets to set up -peripherals such as DMA so that they write directly to -JS variables. +This functions exists to allow embedded targets to set up peripherals such as +DMA so that they write directly to JS variables. See http://www.espruino.com/Internals for more information */ @@ -1419,8 +1459,8 @@ JsVarInt jswrap_espruino_getAddressOf(JsVar *v, bool flatAddress) { ], "typescript" : "mapInPlace(from: ArrayBuffer, to: ArrayBuffer, map?: number[] | ((value: number, index: number) => number) | undefined, bits?: number): void;" } -Take each element of the `from` array, look it up in `map` (or call `map(value,index)` -if it is a function), and write it into the corresponding +Take each element of the `from` array, look it up in `map` (or call +`map(value,index)` if it is a function), and write it into the corresponding element in the `to` array. You can use an array to map: @@ -1566,7 +1606,8 @@ JsVar *jswrap_espruino_lookupNoCase(JsVar *haystack, JsVar *needle, bool returnK "return" : ["JsVar","A String"], "return_object" : "String" } -Get the current interpreter state in a text form such that it can be copied to a new device +Get the current interpreter state in a text form such that it can be copied to a +new device */ JsVar *jswrap_e_dumpStr() { JsVar *result = jsvNewFromEmptyString(); @@ -1599,10 +1640,9 @@ Set the seed for the random number generator used by `Math.random()`. "generate" : "jshGetRandomNumber", "return" : ["int32","A random number"] } -Unlike 'Math.random()' which uses a pseudo-random number generator, this -method reads from the internal voltage reference several times, XOR-ing and -rotating to try and make a relatively random value from the noise in the -signal. +Unlike 'Math.random()' which uses a pseudo-random number generator, this method +reads from the internal voltage reference several times, XOR-ing and rotating to +try and make a relatively random value from the noise in the signal. */ /*JSON{ @@ -1616,8 +1656,8 @@ signal. ], "return" : ["JsVar","The CRC of the supplied data"] } -Perform a standard 32 bit CRC (Cyclic redundancy check) on the supplied data (one byte at a time) -and return the result as an unsigned integer. +Perform a standard 32 bit CRC (Cyclic redundancy check) on the supplied data +(one byte at a time) and return the result as an unsigned integer. */ JsVar *jswrap_espruino_CRC32(JsVar *data) { JsvIterator it; @@ -1651,13 +1691,15 @@ JsVar *jswrap_espruino_CRC32(JsVar *data) { "HSBtoRGB(hue: number, sat: number, bri: number, asArray: true): [number, number, number];" ] } -Convert hue, saturation and brightness to red, green and blue (packed into an integer if `asArray==false` or an array if `asArray==true`). +Convert hue, saturation and brightness to red, green and blue (packed into an +integer if `asArray==false` or an array if `asArray==true`). -This replaces `Graphics.setColorHSB` and `Graphics.setBgColorHSB`. On devices with 24 bit colour it can -be used as: `Graphics.setColor(E.HSBtoRGB(h, s, b))` +This replaces `Graphics.setColorHSB` and `Graphics.setBgColorHSB`. On devices +with 24 bit colour it can be used as: `Graphics.setColor(E.HSBtoRGB(h, s, b))` -You can quickly set RGB items in an Array or Typed Array using `array.set(E.HSBtoRGB(h, s, b,true), offset)`, -which can be useful with arrays used with `require("neopixel").write`. +You can quickly set RGB items in an Array or Typed Array using +`array.set(E.HSBtoRGB(h, s, b,true), offset)`, which can be useful with arrays +used with `require("neopixel").write`. */ int jswrap_espruino_HSBtoRGB_int(JsVarFloat hue, JsVarFloat sat, JsVarFloat bri) { int r, g, b, hi, bi, x, y, z; @@ -1715,17 +1757,17 @@ JsVar *jswrap_espruino_HSBtoRGB(JsVarFloat hue, JsVarFloat sat, JsVarFloat bri, ], "typescript" : "setPassword(password: string): void;" } -Set a password on the console (REPL). When powered on, Espruino will -then demand a password before the console can be used. If you want to -lock the console immediately after this you can call `E.lockConsole()` +Set a password on the console (REPL). When powered on, Espruino will then demand +a password before the console can be used. If you want to lock the console +immediately after this you can call `E.lockConsole()` To remove the password, call this function with no arguments. **Note:** There is no protection against multiple password attempts, so someone could conceivably try every password in a dictionary. -**Note:** This password is stored in memory in plain text. If someone is able -to execute arbitrary JavaScript code on the device (e.g., you use `eval` on input +**Note:** This password is stored in memory in plain text. If someone is able to +execute arbitrary JavaScript code on the device (e.g., you use `eval` on input from unknown sources) or read the device's firmware then they may be able to obtain it. */ @@ -1741,8 +1783,8 @@ void jswrap_espruino_setPassword(JsVar *pwd) { "name" : "lockConsole", "generate" : "jswrap_espruino_lockConsole" } -If a password has been set with `E.setPassword()`, this will lock the console -so the password needs to be entered to unlock it. +If a password has been set with `E.setPassword()`, this will lock the console so +the password needs to be entered to unlock it. */ void jswrap_espruino_lockConsole() { JsVar *pwd = jsvObjectGetChild(execInfo.hiddenRoot, PASSWORD_VARIABLE_NAME, 0); @@ -1764,8 +1806,9 @@ Set the time zone to be used with `Date` objects. For example `E.setTimeZone(1)` will be GMT+0100 -Note that `E.setTimeZone()` will have no effect when daylight savings time rules have been set with `E.setDST()`. The -timezone value will be stored, but never used so long as DST settings are in effect. +Note that `E.setTimeZone()` will have no effect when daylight savings time rules +have been set with `E.setDST()`. The timezone value will be stored, but never +used so long as DST settings are in effect. Time can be set with `setTime`. */ @@ -1789,30 +1832,47 @@ void jswrap_espruino_setTimeZone(JsVarFloat zone) { Set the daylight savings time parameters to be used with `Date` objects. The parameters are -- dstOffset: The number of minutes daylight savings time adds to the clock (usually 60) - set to 0 to disable DST -- timezone: The time zone, in minutes, when DST is not in effect - positive east of Greenwich -- startDowNumber: The index of the day-of-week in the month when DST starts - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last -- startDow: The day-of-week for the DST start calculation - 0 for Sunday, 6 for Saturday -- startMonth: The number of the month that DST starts - 0 for January, 11 for December -- startDayOffset: The number of days between the selected day-of-week and the actual day that DST starts - usually 0 +- dstOffset: The number of minutes daylight savings time adds to the clock + (usually 60) - set to 0 to disable DST +- timezone: The time zone, in minutes, when DST is not in effect - positive east + of Greenwich +- startDowNumber: The index of the day-of-week in the month when DST starts - 0 + for first, 1 for second, 2 for third, 3 for fourth and 4 for last +- startDow: The day-of-week for the DST start calculation - 0 for Sunday, 6 for + Saturday +- startMonth: The number of the month that DST starts - 0 for January, 11 for + December +- startDayOffset: The number of days between the selected day-of-week and the + actual day that DST starts - usually 0 - startTimeOfDay: The number of minutes elapsed in the day before DST starts -- endDowNumber: The index of the day-of-week in the month when DST ends - 0 for first, 1 for second, 2 for third, 3 for fourth and 4 for last -- endDow: The day-of-week for the DST end calculation - 0 for Sunday, 6 for Saturday -- endMonth: The number of the month that DST ends - 0 for January, 11 for December -- endDayOffset: The number of days between the selected day-of-week and the actual day that DST ends - usually 0 +- endDowNumber: The index of the day-of-week in the month when DST ends - 0 for + first, 1 for second, 2 for third, 3 for fourth and 4 for last +- endDow: The day-of-week for the DST end calculation - 0 for Sunday, 6 for + Saturday +- endMonth: The number of the month that DST ends - 0 for January, 11 for + December +- endDayOffset: The number of days between the selected day-of-week and the + actual day that DST ends - usually 0 - endTimeOfDay: The number of minutes elapsed in the day before DST ends -To determine what the `dowNumber, dow, month, dayOffset, timeOfDay` parameters should be, start with a sentence of the form -"DST starts on the last Sunday of March (plus 0 days) at 03:00". Since it's the last Sunday, we have startDowNumber = 4, and since -it's Sunday, we have startDow = 0. That it is March gives us startMonth = 2, and that the offset is zero days, we have +To determine what the `dowNumber, dow, month, dayOffset, timeOfDay` parameters +should be, start with a sentence of the form "DST starts on the last Sunday of +March (plus 0 days) at 03:00". Since it's the last Sunday, we have +startDowNumber = 4, and since it's Sunday, we have startDow = 0. That it is +March gives us startMonth = 2, and that the offset is zero days, we have startDayOffset = 0. The time that DST starts gives us startTimeOfDay = 3*60. -"DST ends on the Friday before the second Sunday in November at 02:00" would give us endDowNumber=1, endDow=0, endMonth=10, endDayOffset=-2 and endTimeOfDay=120. +"DST ends on the Friday before the second Sunday in November at 02:00" would +give us endDowNumber=1, endDow=0, endMonth=10, endDayOffset=-2 and +endTimeOfDay=120. -Using Ukraine as an example, we have a time which is 2 hours ahead of GMT in winter (EET) and 3 hours in summer (EEST). DST starts at 03:00 EET on the last Sunday in March, -and ends at 04:00 EEST on the last Sunday in October. So someone in Ukraine might call `E.setDST(60,120,4,0,2,0,180,4,0,9,0,240);` +Using Ukraine as an example, we have a time which is 2 hours ahead of GMT in +winter (EET) and 3 hours in summer (EEST). DST starts at 03:00 EET on the last +Sunday in March, and ends at 04:00 EEST on the last Sunday in October. So +someone in Ukraine might call `E.setDST(60,120,4,0,2,0,180,4,0,9,0,240);` -Note that when DST parameters are set (i.e. when `dstOffset` is not zero), `E.setTimeZone()` has no effect. +Note that when DST parameters are set (i.e. when `dstOffset` is not zero), +`E.setTimeZone()` has no effect. */ void jswrap_espruino_setDST(JsVar *params) { JsVar *dst; @@ -1839,8 +1899,8 @@ void jswrap_espruino_setDST(JsVar *params) { "return" : ["JsVar","An object where each field is memory-mapped to a register."], "typescript" : "memoryMap(baseAddress: number, registers: { [key in T]: number }): { [key in T]: number };" } -Create an object where every field accesses a specific 32 bit address in the microcontroller's memory. This -is perfect for accessing on-chip peripherals. +Create an object where every field accesses a specific 32 bit address in the +microcontroller's memory. This is perfect for accessing on-chip peripherals. ``` // for NRF52 based chips @@ -1880,11 +1940,12 @@ JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers) { } Provide assembly to Espruino. -**This function is not part of Espruino**. Instead, it is detected -by the Espruino IDE (or command-line tools) at upload time and is -replaced with machine code and an `E.nativeCall` call. +**This function is not part of Espruino**. Instead, it is detected by the +Espruino IDE (or command-line tools) at upload time and is replaced with machine +code and an `E.nativeCall` call. -See [the documentation on the Assembler](http://www.espruino.com/Assembler) for more information. +See [the documentation on the Assembler](http://www.espruino.com/Assembler) for +more information. */ void jswrap_espruino_asm(JsVar *callspec, JsVar *args) { NOT_USED(callspec); @@ -1905,12 +1966,12 @@ void jswrap_espruino_asm(JsVar *callspec, JsVar *args) { } Provides the ability to write C code inside your JavaScript file. -**This function is not part of Espruino**. Instead, it is detected -by the Espruino IDE (or command-line tools) at upload time, is sent -to our web service to be compiled, and is replaced with machine code -and an `E.nativeCall` call. +**This function is not part of Espruino**. Instead, it is detected by the +Espruino IDE (or command-line tools) at upload time, is sent to our web service +to be compiled, and is replaced with machine code and an `E.nativeCall` call. -See [the documentation on Inline C](http://www.espruino.com/InlineC) for more information and examples. +See [the documentation on Inline C](http://www.espruino.com/InlineC) for more +information and examples. */ void jswrap_espruino_compiledC(JsVar *code) { NOT_USED(code); @@ -1923,12 +1984,11 @@ void jswrap_espruino_compiledC(JsVar *code) { "name" : "reboot", "generate" : "jswrap_espruino_reboot" } -Forces a hard reboot of the microcontroller - as close as possible -to if the reset pin had been toggled. +Forces a hard reboot of the microcontroller - as close as possible to if the +reset pin had been toggled. -**Note:** This is different to `reset()`, which performs a software -reset of Espruino (resetting the interpreter and pin states, but not -all the hardware) +**Note:** This is different to `reset()`, which performs a software reset of +Espruino (resetting the interpreter and pin states, but not all the hardware) */ void jswrap_espruino_reboot() { // ensure `E.on('kill',...` gets called and everything is torn down correctly @@ -1956,9 +2016,9 @@ void jswrap_espruino_reboot() { ], "typescript" : "setUSBHID(opts?: { reportDescriptor: any[] }): void;" } -USB HID will only take effect next time you unplug and re-plug your Espruino. If you're -disconnecting it from power you'll have to make sure you have `save()`d after calling -this function. +USB HID will only take effect next time you unplug and re-plug your Espruino. If +you're disconnecting it from power you'll have to make sure you have `save()`d +after calling this function. */ void jswrap_espruino_setUSBHID(JsVar *arr) { if (jsvIsUndefined(arr)) { @@ -2015,13 +2075,12 @@ bool jswrap_espruino_sendUSBHID(JsVar *arr) { "generate" : "jswrap_espruino_getBattery", "return" : ["int","A percentage between 0 and 100"] } -In devices that come with batteries, this function returns -the battery charge percentage as an integer between 0 and 100. +In devices that come with batteries, this function returns the battery charge +percentage as an integer between 0 and 100. -**Note:** this is an estimation only, based on battery voltage. -The temperature of the battery (as well as the load being drawn -from it at the time `E.getBattery` is called) will affect the -readings. +**Note:** this is an estimation only, based on battery voltage. The temperature +of the battery (as well as the load being drawn from it at the time +`E.getBattery` is called) will affect the readings. */ JsVarInt jswrap_espruino_getBattery() { #if defined(CUSTOM_GETBATTERY) @@ -2042,26 +2101,30 @@ JsVarInt jswrap_espruino_getBattery() { ["prescaler","int","The amount of counts for one second of the RTC - this is a 15 bit integer value (0..32767)"] ] } -Sets the RTC's prescaler's maximum value. This is the counter that counts up on each oscillation of the low -speed oscillator. When the prescaler counts to the value supplied, one second is deemed to have passed. +Sets the RTC's prescaler's maximum value. This is the counter that counts up on +each oscillation of the low speed oscillator. When the prescaler counts to the +value supplied, one second is deemed to have passed. -By default this is set to the oscillator's average speed as specified in the datasheet, and usually that is -fine. However on early [Espruino Pico](/Pico) boards the STM32F4's internal oscillator could vary by as -much as 15% from the value in the datasheet. In that case you may want to alter this value to reflect the -true RTC speed for more accurate timekeeping. +By default this is set to the oscillator's average speed as specified in the +datasheet, and usually that is fine. However on early [Espruino Pico](/Pico) +boards the STM32F4's internal oscillator could vary by as much as 15% from the +value in the datasheet. In that case you may want to alter this value to reflect +the true RTC speed for more accurate timekeeping. -To change the RTC's prescaler value to a computed value based on comparing against the high speed oscillator, -just run the following command, making sure it's done a few seconds after the board starts up: +To change the RTC's prescaler value to a computed value based on comparing +against the high speed oscillator, just run the following command, making sure +it's done a few seconds after the board starts up: ``` E.setRTCPrescaler(E.getRTCPrescaler(true)); ``` -When changing the RTC prescaler, the RTC 'follower' counters are reset and it can take a second or two before -readings from getTime are stable again. +When changing the RTC prescaler, the RTC 'follower' counters are reset and it +can take a second or two before readings from getTime are stable again. -To test, you can connect an input pin to a known frequency square wave and then use `setWatch`. If you don't -have a frequency source handy, you can check against the high speed oscillator: +To test, you can connect an input pin to a known frequency square wave and then +use `setWatch`. If you don't have a frequency source handy, you can check +against the high speed oscillator: ``` // connect pin B3 to B4 @@ -2071,8 +2134,9 @@ setWatch(function(e) { }, B4, {repeat:true}); ``` -**Note:** This is only used on official Espruino boards containing an STM32 microcontroller. Other boards -(even those using an STM32) don't use the RTC and so this has no effect. +**Note:** This is only used on official Espruino boards containing an STM32 +microcontroller. Other boards (even those using an STM32) don't use the RTC and +so this has no effect. */ void jswrap_espruino_setRTCPrescaler(int prescale) { #ifdef STM32 @@ -2100,8 +2164,9 @@ void jswrap_espruino_setRTCPrescaler(int prescale) { } Gets the RTC's current prescaler value if `calibrate` is undefined or false. -If `calibrate` is true, the low speed oscillator's speed is calibrated against the high speed -oscillator (usually +/- 20 ppm) and a suggested value to be fed into `E.setRTCPrescaler(...)` is returned. +If `calibrate` is true, the low speed oscillator's speed is calibrated against +the high speed oscillator (usually +/- 20 ppm) and a suggested value to be fed +into `E.setRTCPrescaler(...)` is returned. See `E.setRTCPrescaler` for more information. */ diff --git a/src/jswrap_flash.c b/src/jswrap_flash.c index c711eaebd7..ea3230a34d 100644 --- a/src/jswrap_flash.c +++ b/src/jswrap_flash.c @@ -25,22 +25,24 @@ "ifndef" : "SAVE_ON_FLASH" } -This module allows you to read and write the nonvolatile flash memory of your device. +This module allows you to read and write the nonvolatile flash memory of your +device. -Also see the `Storage` library, which provides a safer file-like -interface to nonvolatile storage. +Also see the `Storage` library, which provides a safer file-like interface to +nonvolatile storage. -It should be used with extreme caution, as it is easy to overwrite parts of Flash -memory belonging to Espruino or even its bootloader. If you damage the bootloader -then you may need external hardware such as a USB-TTL converter to restore it. For -more information on restoring the bootloader see `Advanced Reflashing` in your -board's reference pages. +It should be used with extreme caution, as it is easy to overwrite parts of +Flash memory belonging to Espruino or even its bootloader. If you damage the +bootloader then you may need external hardware such as a USB-TTL converter to +restore it. For more information on restoring the bootloader see `Advanced +Reflashing` in your board's reference pages. To see which areas of memory you can and can't overwrite, look at the values reported by `process.memory()`. **Note:** On Nordic platforms there are checks in place to help you avoid -'bricking' your device be damaging the bootloader. You can disable these with `E.setFlags({unsafeFlash:1})` +'bricking' your device be damaging the bootloader. You can disable these with +`E.setFlags({unsafeFlash:1})` */ /*JSON{ @@ -75,12 +77,13 @@ JsVar *jswrap_flash_getPage(int addr) { "generate" : "jswrap_flash_getFree", "return" : ["JsVar", "Array of objects with `addr` and `length` properties"] } -This method returns an array of objects of the form `{addr : #, length : #}`, representing -contiguous areas of flash memory in the chip that are not used for anything. +This method returns an array of objects of the form `{addr : #, length : #}`, +representing contiguous areas of flash memory in the chip that are not used for +anything. -The memory areas returned are on page boundaries. This means that you can -safely erase the page containing any address here, and you won't risk -deleting part of the Espruino firmware. +The memory areas returned are on page boundaries. This means that you can safely +erase the page containing any address here, and you won't risk deleting part of +the Espruino firmware. */ JsVar *jswrap_flash_getFree() { JsVar *arr = jshFlashGetFree(); @@ -123,8 +126,8 @@ Write data into memory at the given address In flash memory you may only turn bits that are 1 into bits that are 0. If you're writing data into an area that you have already written (so `read` -doesn't return all `0xFF`) you'll need to call `erasePage` to clear the -entire page. +doesn't return all `0xFF`) you'll need to call `erasePage` to clear the entire +page. */ void jswrap_flash_write(JsVar *data, int addr) { if (jsvIsUndefined(data)) { diff --git a/src/jswrap_functions.c b/src/jswrap_functions.c index 1565adcbff..2638488f8d 100644 --- a/src/jswrap_functions.c +++ b/src/jswrap_functions.c @@ -37,11 +37,11 @@ hello("Test") // 1 ["Test"] hello(1,2,3) // 3 [1,2,3] ``` -**Note:** Due to the way Espruino works this is doesn't behave exactly -the same as in normal JavaScript. The length of the arguments array -will never be less than the number of arguments specified in the -function declaration: `(function(a){ return arguments.length; })() == 1`. -Normal JavaScript interpreters would return `0` in the above case. +**Note:** Due to the way Espruino works this is doesn't behave exactly the same +as in normal JavaScript. The length of the arguments array will never be less +than the number of arguments specified in the function declaration: +`(function(a){ return arguments.length; })() == 1`. Normal JavaScript +interpreters would return `0` in the above case. */ extern JsExecInfo execInfo; @@ -217,7 +217,8 @@ JsVarFloat jswrap_parseFloat(JsVar *v) { ], "return" : ["bool","True is the value is a Finite number, false if not."] } -Is the parameter a finite num,ber or not? If needed, the parameter is first converted to a number. +Is the parameter a finite num,ber or not? If needed, the parameter is first +converted to a number. */ bool jswrap_isFinite(JsVar *v) { JsVarFloat f = jsvGetFloat(v); @@ -401,7 +402,8 @@ JsVar *jswrap_atob(JsVar *base64Data) { ], "return" : ["JsVar","A string containing the encoded data"] } -Convert a string with any character not alphanumeric or `- _ . ! ~ * ' ( )` converted to the form `%XY` where `XY` is its hexadecimal representation +Convert a string with any character not alphanumeric or `- _ . ! ~ * ' ( )` +converted to the form `%XY` where `XY` is its hexadecimal representation */ JsVar *jswrap_encodeURIComponent(JsVar *arg) { JsVar *v = jsvAsString(arg); @@ -449,7 +451,8 @@ JsVar *jswrap_encodeURIComponent(JsVar *arg) { ], "return" : ["JsVar","A string containing the decoded data"] } -Convert any groups of characters of the form '%ZZ', into characters with hex code '0xZZ' +Convert any groups of characters of the form '%ZZ', into characters with hex +code '0xZZ' */ JsVar *jswrap_decodeURIComponent(JsVar *arg) { JsVar *v = jsvAsString(arg); diff --git a/src/jswrap_interactive.c b/src/jswrap_interactive.c index 93a632e08f..a614a552a2 100644 --- a/src/jswrap_interactive.c +++ b/src/jswrap_interactive.c @@ -47,7 +47,8 @@ A reference to the global scope, where everything is defined. ["pin","JsVar",""] ] } -When Espruino is busy, set the pin specified here high. Set this to undefined to disable the feature. +When Espruino is busy, set the pin specified here high. Set this to undefined to +disable the feature. */ #ifndef SAVE_ON_FLASH void jswrap_interface_setBusyIndicator(JsVar *pinVar) { @@ -70,7 +71,8 @@ void jswrap_interface_setBusyIndicator(JsVar *pinVar) { ["pin","JsVar",""] ] } -When Espruino is asleep, set the pin specified here low (when it's awake, set it high). Set this to undefined to disable the feature. +When Espruino is asleep, set the pin specified here low (when it's awake, set it +high). Set this to undefined to disable the feature. Please see http://www.espruino.com/Power+Consumption for more details on this. */ @@ -95,7 +97,9 @@ void jswrap_interface_setSleepIndicator(JsVar *pinVar) { ["sleep","bool",""] ] } -Set whether we can enter deep sleep mode, which reduces power consumption to around 100uA. This only works on STM32 Espruino Boards (nRF52 boards sleep automatically). +Set whether we can enter deep sleep mode, which reduces power consumption to +around 100uA. This only works on STM32 Espruino Boards (nRF52 boards sleep +automatically). Please see http://www.espruino.com/Power+Consumption for more details on this. */ @@ -115,7 +119,8 @@ void jswrap_interface_setDeepSleep(bool sleep) { } Output debugging information -Note: This is not included on boards with low amounts of flash memory, or the Espruino board. +Note: This is not included on boards with low amounts of flash memory, or the +Espruino board. */ void jswrap_interface_trace(JsVar *root) { #ifdef ESPRUINOBOARD @@ -137,11 +142,16 @@ void jswrap_interface_trace(JsVar *root) { "ifndef" : "SAVE_ON_FLASH", "generate_full" : "jsiDumpState((vcbprintf_callback)jsiConsolePrintString, 0)" } -Output current interpreter state in a text form such that it can be copied to a new device +Output current interpreter state in a text form such that it can be copied to a +new device -Espruino keeps its current state in RAM (even if the function code is stored in Flash). When you type `dump()` it dumps the current state of code in RAM plus the hardware state, then if there's code saved in flash it writes "// Code saved with E.setBootCode" and dumps that too. +Espruino keeps its current state in RAM (even if the function code is stored in +Flash). When you type `dump()` it dumps the current state of code in RAM plus +the hardware state, then if there's code saved in flash it writes "// Code saved +with E.setBootCode" and dumps that too. -**Note:** 'Internal' functions are currently not handled correctly. You will need to recreate these in the `onInit` function. +**Note:** 'Internal' functions are currently not handled correctly. You will +need to recreate these in the `onInit` function. */ /*JSON{ "type" : "function", @@ -159,14 +169,15 @@ This command only executes when the Interpreter returns to the Idle state - for instance ```a=1;load();a=2;``` will still leave 'a' as undefined (or what it was set to in the saved program). -Espruino will resume from where it was when you last typed `save()`. -If you want code to be executed right after loading (for instance to initialise -devices connected to Espruino), add an `init` event handler to `E` with -`E.on('init', function() { ... your_code ... });`. This will then be automatically -executed by Espruino every time it starts. +Espruino will resume from where it was when you last typed `save()`. If you want +code to be executed right after loading (for instance to initialise devices +connected to Espruino), add an `init` event handler to `E` with `E.on('init', +function() { ... your_code ... });`. This will then be automatically executed by +Espruino every time it starts. -**If you specify a filename in the argument then that file will be loaded -from Storage after reset** in much the same way as calling `reset()` then `eval(require("Storage").read(filename))` +**If you specify a filename in the argument then that file will be loaded from +Storage after reset** in much the same way as calling `reset()` then +`eval(require("Storage").read(filename))` */ void jswrap_interface_load(JsVar *storageName) { jsiStatus |= JSIS_TODO_FLASH_LOAD; @@ -181,27 +192,31 @@ void jswrap_interface_load(JsVar *storageName) { "#if" : "!defined(BANGLEJS)" } Save the state of the interpreter into flash (including the results of calling -`setWatch`, `setInterval`, `pinMode`, and any listeners). The state will then be loaded automatically - every time Espruino powers on or is hard-reset. To see what will get saved you can call `dump()`. +`setWatch`, `setInterval`, `pinMode`, and any listeners). The state will then be +loaded automatically every time Espruino powers on or is hard-reset. To see what +will get saved you can call `dump()`. -**Note:** If you set up intervals/etc in `onInit()` and you have already called `onInit` -before running `save()`, when Espruino resumes there will be two copies of your intervals - -the ones from before the save, and the ones from after - which may cause you problems. +**Note:** If you set up intervals/etc in `onInit()` and you have already called +`onInit` before running `save()`, when Espruino resumes there will be two copies +of your intervals - the ones from before the save, and the ones from after - +which may cause you problems. -For more information about this and other options for saving, please see -the [Saving code on Espruino](https://www.espruino.com/Saving) page. +For more information about this and other options for saving, please see the +[Saving code on Espruino](https://www.espruino.com/Saving) page. This command only executes when the Interpreter returns to the Idle state - for instance ```a=1;save();a=2;``` will save 'a' as 2. -When Espruino powers on, it will resume from where it was when you typed `save()`. -If you want code to be executed right after loading (for instance to initialise -devices connected to Espruino), add a function called `onInit`, or add a `init` -event handler to `E` with `E.on('init', function() { ... your_code ... });`. -This will then be automatically executed by Espruino every time it starts. +When Espruino powers on, it will resume from where it was when you typed +`save()`. If you want code to be executed right after loading (for instance to +initialise devices connected to Espruino), add a function called `onInit`, or +add a `init` event handler to `E` with `E.on('init', function() { ... your_code +... });`. This will then be automatically executed by Espruino every time it +starts. In order to stop the program saved with this command being loaded automatically, -check out [the Troubleshooting guide](https://www.espruino.com/Troubleshooting#espruino-stopped-working-after-i-typed-save-) +check out [the Troubleshooting +guide](https://www.espruino.com/Troubleshooting#espruino-stopped-working-after-i-typed-save-) */ /*JSON{ "type" : "function", @@ -211,18 +226,21 @@ check out [the Troubleshooting guide](https://www.espruino.com/Troubleshooting#e ["clearFlash","bool","Remove saved code from flash as well"] ] } -Reset the interpreter - clear program memory in RAM, and do not load a saved program from flash. This does NOT reset the underlying hardware (which allows you to reset the device without it disconnecting from USB). +Reset the interpreter - clear program memory in RAM, and do not load a saved +program from flash. This does NOT reset the underlying hardware (which allows +you to reset the device without it disconnecting from USB). -This command only executes when the Interpreter returns to the Idle state - for instance ```a=1;reset();a=2;``` will still leave 'a' as undefined. +This command only executes when the Interpreter returns to the Idle state - for +instance ```a=1;reset();a=2;``` will still leave 'a' as undefined. The safest way to do a full reset is to hit the reset button. -If `reset()` is called with no arguments, it will reset the board's state in -RAM but will not reset the state in flash. When next powered on (or when -`load()` is called) the board will load the previously saved code. +If `reset()` is called with no arguments, it will reset the board's state in RAM +but will not reset the state in flash. When next powered on (or when `load()` is +called) the board will load the previously saved code. -Calling `reset(true)` will cause *all saved code in flash memory to -be cleared as well*. +Calling `reset(true)` will cause *all saved code in flash memory to be cleared +as well*. */ void jswrap_interface_reset(bool clearFlash) { @@ -240,7 +258,10 @@ void jswrap_interface_reset(bool clearFlash) { } Print the supplied string(s) to the console - **Note:** If you're connected to a computer (not a wall adaptor) via USB but **you are not running a terminal app** then when you print data Espruino may pause execution and wait until the computer requests the data it is trying to print. + **Note:** If you're connected to a computer (not a wall adaptor) via USB but + **you are not running a terminal app** then when you print data Espruino may + pause execution and wait until the computer requests the data it is trying to + print. */ /*JSON{ "type" : "staticmethod", @@ -253,7 +274,10 @@ Print the supplied string(s) to the console } Print the supplied string(s) to the console - **Note:** If you're connected to a computer (not a wall adaptor) via USB but **you are not running a terminal app** then when you print data Espruino may pause execution and wait until the computer requests the data it is trying to print. + **Note:** If you're connected to a computer (not a wall adaptor) via USB but + **you are not running a terminal app** then when you print data Espruino may + pause execution and wait until the computer requests the data it is trying to + print. */ void jswrap_interface_print(JsVar *v) { assert(jsvIsArray(v)); @@ -287,7 +311,8 @@ void jswrap_interface_print(JsVar *v) { } Fill the console with the contents of the given function, so you can edit it. -NOTE: This is a convenience function - it will not edit 'inner functions'. For that, you must edit the 'outer function' and re-execute it. +NOTE: This is a convenience function - it will not edit 'inner functions'. For +that, you must edit the 'outer function' and re-execute it. */ void jswrap_interface_edit(JsVar *funcName) { JsVar *func = 0; @@ -351,7 +376,9 @@ void jswrap_interface_edit(JsVar *funcName) { ["echoOn","bool",""] ] } -Should Espruino echo what you type back to you? true = yes (Default), false = no. When echo is off, the result of executing a command is not returned. Instead, you must use 'print' to send output. +Should Espruino echo what you type back to you? true = yes (Default), false = +no. When echo is off, the result of executing a command is not returned. +Instead, you must use 'print' to send output. */ void jswrap_interface_echo(bool echoOn) { if (echoOn) @@ -377,14 +404,13 @@ Return the current system time in Seconds (as a floating point number) ["time","float",""] ] } -Set the current system time in seconds (`time` can be a floating -point value). +Set the current system time in seconds (`time` can be a floating point value). -This is used with `getTime`, the time reported from `setWatch`, as -well as when using `new Date()`. +This is used with `getTime`, the time reported from `setWatch`, as well as when +using `new Date()`. -`Date.prototype.getTime()` reports the time in milliseconds, so -you can set the time to a `Date` object using: +`Date.prototype.getTime()` reports the time in milliseconds, so you can set the +time to a `Date` object using: ``` setTime((new Date("Tue, 19 Feb 2019 10:57")).getTime()/1000) @@ -440,7 +466,8 @@ JsVar *jswrap_interface_getSerial() { ], "return" : ["JsVar","An ID that can be passed to clearInterval"] } -Call the function (or evaluate the string) specified REPEATEDLY after the timeout in milliseconds. +Call the function (or evaluate the string) specified REPEATEDLY after the +timeout in milliseconds. For instance: @@ -453,7 +480,8 @@ setInterval('console.log("Hello World");', 1000); // both print 'Hello World' every second ``` -You can also specify extra arguments that will be sent to the function when it is executed. For example: +You can also specify extra arguments that will be sent to the function when it +is executed. For example: ``` setInterval(function (a,b) { @@ -462,10 +490,13 @@ setInterval(function (a,b) { // prints 'Hello World' every second ``` -If you want to stop your function from being called, pass the number that -was returned by `setInterval` into the `clearInterval` function. +If you want to stop your function from being called, pass the number that was +returned by `setInterval` into the `clearInterval` function. - **Note:** If `setDeepSleep(true)` has been called and the interval is greater than 5 seconds, Espruino may execute the interval up to 1 second late. This is because Espruino can only wake from deep sleep every second - and waking early would cause Espruino to waste power while it waited for the correct time. + **Note:** If `setDeepSleep(true)` has been called and the interval is greater + than 5 seconds, Espruino may execute the interval up to 1 second late. This is + because Espruino can only wake from deep sleep every second - and waking early + would cause Espruino to waste power while it waited for the correct time. */ /*JSON{ "type" : "function", @@ -478,7 +509,8 @@ was returned by `setInterval` into the `clearInterval` function. ], "return" : ["JsVar","An ID that can be passed to clearTimeout"] } -Call the function (or evaluate the string) specified ONCE after the timeout in milliseconds. +Call the function (or evaluate the string) specified ONCE after the timeout in +milliseconds. For instance: @@ -491,7 +523,8 @@ setTimeout('console.log("Hello World");', 1000); // both print 'Hello World' after a second ``` -You can also specify extra arguments that will be sent to the function when it is executed. For example: +You can also specify extra arguments that will be sent to the function when it +is executed. For example: ``` setTimeout(function (a,b) { @@ -500,10 +533,13 @@ setTimeout(function (a,b) { // prints 'Hello World' after 1 second ``` -If you want to stop the function from being called, pass the number that -was returned by `setTimeout` into the `clearTimeout` function. +If you want to stop the function from being called, pass the number that was +returned by `setTimeout` into the `clearTimeout` function. - **Note:** If `setDeepSleep(true)` has been called and the interval is greater than 5 seconds, Espruino may execute the interval up to 1 second late. This is because Espruino can only wake from deep sleep every second - and waking early would cause Espruino to waste power while it waited for the correct time. + **Note:** If `setDeepSleep(true)` has been called and the interval is greater + than 5 seconds, Espruino may execute the interval up to 1 second late. This is + because Espruino can only wake from deep sleep every second - and waking early + would cause Espruino to waste power while it waited for the correct time. */ JsVar *_jswrap_interface_setTimeoutOrInterval(JsVar *func, JsVarFloat interval, JsVar *args, bool isTimeout) { // NOTE: The 5 sec delay mentioned in the description is handled by jshSleep @@ -633,8 +669,8 @@ Change the Interval on a callback created with `setInterval`, for example: ```changeInterval(id, 1500); // now runs every 1.5 seconds``` This takes effect immediately and resets the timeout, so in the example above, -regardless of when you call `changeInterval`, the next interval will occur 1500ms -after it. +regardless of when you call `changeInterval`, the next interval will occur +1500ms after it. */ void jswrap_interface_changeInterval(JsVar *idVar, JsVarFloat interval) { JsVar *timerArrayPtr = jsvLock(timerArray); diff --git a/src/jswrap_io.c b/src/jswrap_io.c index c748723c37..aa54b0c1cf 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -164,7 +164,8 @@ This is different to Arduino which only returns an integer between 0 and 1023 However only pins connected to an ADC will work (see the datasheet) - **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"analog"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset pin's state to `"analog"` */ /*JSON{ "type" : "function", @@ -180,11 +181,14 @@ Set the analog Value of a pin. It will be output using PWM. Objects can contain: -* `freq` - pulse frequency in Hz, eg. ```analogWrite(A0,0.5,{ freq : 10 });``` - specifying a frequency will force PWM output, even if the pin has a DAC +* `freq` - pulse frequency in Hz, eg. ```analogWrite(A0,0.5,{ freq : 10 });``` - + specifying a frequency will force PWM output, even if the pin has a DAC * `soft` - boolean, If true software PWM is used if hardware is not available. -* `forceSoft` - boolean, If true software PWM is used even if hardware PWM or a DAC is available +* `forceSoft` - boolean, If true software PWM is used even if hardware PWM or a + DAC is available - **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset pin's state to `"output"` */ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { JsVarFloat freq = 0; @@ -210,13 +214,20 @@ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { ["time","JsVar","A time in milliseconds, or an array of times (in which case a square wave will be output starting with a pulse of 'value')"] ] } -Pulse the pin with the value for the given time in milliseconds. It uses a hardware timer to produce accurate pulses, and returns immediately (before the pulse has finished). Use `digitalPulse(A0,1,0)` to wait until a previous pulse has finished. +Pulse the pin with the value for the given time in milliseconds. It uses a +hardware timer to produce accurate pulses, and returns immediately (before the +pulse has finished). Use `digitalPulse(A0,1,0)` to wait until a previous pulse +has finished. -eg. `digitalPulse(A0,1,5);` pulses A0 high for 5ms. `digitalPulse(A0,1,[5,2,4]);` pulses A0 high for 5ms, low for 2ms, and high for 4ms +eg. `digitalPulse(A0,1,5);` pulses A0 high for 5ms. +`digitalPulse(A0,1,[5,2,4]);` pulses A0 high for 5ms, low for 2ms, and high for +4ms - **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset pin's state to `"output"` -digitalPulse is for SHORT pulses that need to be very accurate. If you're doing anything over a few milliseconds, use setTimeout instead. +digitalPulse is for SHORT pulses that need to be very accurate. If you're doing +anything over a few milliseconds, use setTimeout instead. */ void jswrap_io_digitalPulse(Pin pin, bool value, JsVar *times) { if (!jshIsPinValid(pin)) { @@ -271,14 +282,17 @@ void jswrap_io_digitalPulse(Pin pin, bool value, JsVar *times) { } Set the digital value of the given pin. - **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset pin's state to `"output"` -If pin argument is an array of pins (eg. `[A2,A1,A0]`) the value argument will be treated -as an array of bits where the last array element is the least significant bit. +If pin argument is an array of pins (eg. `[A2,A1,A0]`) the value argument will +be treated as an array of bits where the last array element is the least +significant bit. -In this case, pin values are set least significant bit first (from the right-hand side -of the array of pins). This means you can use the same pin multiple times, for -example `digitalWrite([A1,A1,A0,A0],0b0101)` would pulse A0 followed by A1. +In this case, pin values are set least significant bit first (from the +right-hand side of the array of pins). This means you can use the same pin +multiple times, for example `digitalWrite([A1,A1,A0,A0],0b0101)` would pulse A0 +followed by A1. If the pin argument is an object with a `write` method, the `write` method will be called with the value passed through. @@ -326,13 +340,15 @@ void jswrap_io_digitalWrite( } Get the digital value of the given pin. - **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"input"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset pin's state to `"input"` -If the pin argument is an array of pins (eg. `[A2,A1,A0]`) the value returned will be an number where -the last array element is the least significant bit, for example if `A0=A1=1` and `A2=0`, `digitalRead([A2,A1,A0]) == 0b011` +If the pin argument is an array of pins (eg. `[A2,A1,A0]`) the value returned +will be an number where the last array element is the least significant bit, for +example if `A0=A1=1` and `A2=0`, `digitalRead([A2,A1,A0]) == 0b011` -If the pin argument is an object with a `read` method, the `read` method will be called and the integer value it returns -passed back. +If the pin argument is an object with a `read` method, the `read` method will be +called and the integer value it returns passed back. */ JsVarInt jswrap_io_digitalRead(JsVar *pinVar) { // Hadnle the case where it is an array of pins. @@ -378,21 +394,27 @@ JsVarInt jswrap_io_digitalRead(JsVar *pinVar) { } Set the mode of the given pin. - * `auto`/`undefined` - Don't change state, but allow `digitalWrite`/etc to automatically change state as appropriate + * `auto`/`undefined` - Don't change state, but allow `digitalWrite`/etc to + automatically change state as appropriate * `analog` - Analog input * `input` - Digital input * `input_pullup` - Digital input with internal ~40k pull-up resistor * `input_pulldown` - Digital input with internal ~40k pull-down resistor * `output` - Digital output - * `opendrain` - Digital output that only ever pulls down to 0v. Sending a logical `1` leaves the pin open circuit - * `opendrain_pullup` - Digital output that pulls down to 0v. Sending a logical `1` enables internal ~40k pull-up resistor + * `opendrain` - Digital output that only ever pulls down to 0v. Sending a + logical `1` leaves the pin open circuit + * `opendrain_pullup` - Digital output that pulls down to 0v. Sending a logical + `1` enables internal ~40k pull-up resistor * `af_output` - Digital output from built-in peripheral - * `af_opendrain` - Digital output from built-in peripheral that only ever pulls down to 0v. Sending a logical `1` leaves the pin open circuit - - **Note:** `digitalRead`/`digitalWrite`/etc set the pin mode automatically *unless* `pinMode` has been called first. -If you want `digitalRead`/etc to set the pin mode automatically after you have called `pinMode`, simply call it again -with no mode argument (`pinMode(pin)`), `auto` as the argument (`pinMode(pin, "auto")`), or with the 3rd 'automatic' -argument set to true (`pinMode(pin, "output", true)`). + * `af_opendrain` - Digital output from built-in peripheral that only ever pulls + down to 0v. Sending a logical `1` leaves the pin open circuit + + **Note:** `digitalRead`/`digitalWrite`/etc set the pin mode automatically +*unless* `pinMode` has been called first. If you want `digitalRead`/etc to set +the pin mode automatically after you have called `pinMode`, simply call it again +with no mode argument (`pinMode(pin)`), `auto` as the argument (`pinMode(pin, +"auto")`), or with the 3rd 'automatic' argument set to true (`pinMode(pin, +"output", true)`). */ void jswrap_io_pinMode( Pin pin, @@ -436,7 +458,8 @@ void jswrap_io_pinMode( ], "return" : ["JsVar","The pin mode, as a string"] } -Return the current mode of the given pin. See `pinMode` for more information on returned values. +Return the current mode of the given pin. See `pinMode` for more information on +returned values. */ JsVar *jswrap_io_getPinMode(Pin pin) { if (!jshIsPinValid(pin)) { @@ -514,8 +537,8 @@ void jswrap_io_shiftOutCallback(int val, void *data) { ["data","JsVar","The data to shift out (see `E.toUint8Array` for info on the forms this can take)"] ] } -Shift an array of data out using the pins supplied *least significant bit first*, -for example: +Shift an array of data out using the pins supplied *least significant bit +first*, for example: ``` // shift out to single clk+data @@ -542,9 +565,9 @@ shiftOut([A3,A2,A1,A0], { clk : A4 }, [1,2,3,4]); } ``` -Each item in the `data` array will be output to the pins, with the first -pin in the array being the MSB and the last the LSB, then the clock will be -pulsed in the polarity given. +Each item in the `data` array will be output to the pins, with the first pin in +the array being the MSB and the last the LSB, then the clock will be pulsed in +the polarity given. `repeat` is the amount of times shift data out for each array item. For instance we may want to shift 8 bits out through 2 pins - in which case we need to set @@ -625,9 +648,11 @@ void jswrap_io_shiftOut(JsVar *pins, JsVar *options, JsVar *data) { ], "return" : ["JsVar","An ID that can be passed to clearWatch"] } -Call the function specified when the pin changes. Watches set with `setWatch` can be removed using `clearWatch`. +Call the function specified when the pin changes. Watches set with `setWatch` +can be removed using `clearWatch`. -If the `options` parameter is an object, it can contain the following information (all optional): +If the `options` parameter is an object, it can contain the following +information (all optional): ``` { @@ -652,30 +677,39 @@ If the `options` parameter is an object, it can contain the following informatio } ``` -The `function` callback is called with an argument, which is an object of type `{state:bool, time:float, lastTime:float}`. +The `function` callback is called with an argument, which is an object of type +`{state:bool, time:float, lastTime:float}`. * `state` is whether the pin is currently a `1` or a `0` * `time` is the time in seconds at which the pin changed state - * `lastTime` is the time in seconds at which the **pin last changed state**. When using `edge:'rising'` or `edge:'falling'`, this is not the same as when the function was last called. - * `data` is included if `data:pin` was specified in the options, and can be used for reading in clocked data - -For instance, if you want to measure the length of a positive pulse you could use `setWatch(function(e) { console.log(e.time-e.lastTime); }, BTN, { repeat:true, edge:'falling' });`. -This will only be called on the falling edge of the pulse, but will be able to measure the width of the pulse because `e.lastTime` is the time of the rising edge. - -Internally, an interrupt writes the time of the pin's state change into a queue with the exact -time that it happened, and the function supplied to `setWatch` is executed only from the main -message loop. However, if the callback is a native function `void (bool state)` then you can -add `irq:true` to options, which will cause the function to be called from within the IRQ. -When doing this, interrupts will happen on both edges and there will be no debouncing. - -**Note:** if you didn't call `pinMode` beforehand then this function will reset pin's state to `"input"` - -**Note:** The STM32 chip (used in the [Espruino Board](/EspruinoBoard) and [Pico](/Pico)) cannot -watch two pins with the same number - eg `A0` and `B0`. - -**Note:** On nRF52 chips (used in Puck.js, Pixl.js, MDBT42Q) `setWatch` disables the GPIO -output on that pin. In order to be able to write to the pin again you need to disable -the watch with `clearWatch`. + * `lastTime` is the time in seconds at which the **pin last changed state**. + When using `edge:'rising'` or `edge:'falling'`, this is not the same as when + the function was last called. + * `data` is included if `data:pin` was specified in the options, and can be + used for reading in clocked data + +For instance, if you want to measure the length of a positive pulse you could +use `setWatch(function(e) { console.log(e.time-e.lastTime); }, BTN, { +repeat:true, edge:'falling' });`. This will only be called on the falling edge +of the pulse, but will be able to measure the width of the pulse because +`e.lastTime` is the time of the rising edge. + +Internally, an interrupt writes the time of the pin's state change into a queue +with the exact time that it happened, and the function supplied to `setWatch` is +executed only from the main message loop. However, if the callback is a native +function `void (bool state)` then you can add `irq:true` to options, which will +cause the function to be called from within the IRQ. When doing this, interrupts +will happen on both edges and there will be no debouncing. + +**Note:** if you didn't call `pinMode` beforehand then this function will reset +pin's state to `"input"` + +**Note:** The STM32 chip (used in the [Espruino Board](/EspruinoBoard) and +[Pico](/Pico)) cannot watch two pins with the same number - eg `A0` and `B0`. + +**Note:** On nRF52 chips (used in Puck.js, Pixl.js, MDBT42Q) `setWatch` disables +the GPIO output on that pin. In order to be able to write to the pin again you +need to disable the watch with `clearWatch`. */ JsVar *jswrap_interface_setWatch( diff --git a/src/jswrap_json.c b/src/jswrap_json.c index b8abd4a699..9c98ec7da8 100644 --- a/src/jswrap_json.c +++ b/src/jswrap_json.c @@ -46,12 +46,14 @@ An Object that handles conversion to and from the JSON data interchange format ], "return" : ["JsVar","A JSON string"] } -Convert the given object into a JSON string which can subsequently be parsed with JSON.parse or eval. +Convert the given object into a JSON string which can subsequently be parsed +with JSON.parse or eval. **Note:** This differs from JavaScript's standard `JSON.stringify` in that: * The `replacer` argument is ignored -* Typed arrays like `new Uint8Array(5)` will be dumped as if they were arrays, not as if they were objects (since it is more compact) +* Typed arrays like `new Uint8Array(5)` will be dumped as if they were arrays, + not as if they were objects (since it is more compact) */ JsVar *jswrap_json_stringify(JsVar *v, JsVar *replacer, JsVar *space) { NOT_USED(replacer); @@ -169,7 +171,8 @@ JsVar *jswrap_json_parse_internal() { } Parse the given JSON string into a JavaScript object -NOTE: This implementation uses eval() internally, and as such it is unsafe as it can allow arbitrary JS commands to be executed. +NOTE: This implementation uses eval() internally, and as such it is unsafe as it +can allow arbitrary JS commands to be executed. */ JsVar *jswrap_json_parse(JsVar *v) { JsLex lex; diff --git a/src/jswrap_modules.c b/src/jswrap_modules.c index c5c01cefc0..3bbe54f1cb 100644 --- a/src/jswrap_modules.c +++ b/src/jswrap_modules.c @@ -59,8 +59,8 @@ print(s.read("test")); // prints "hello world" ``` -Check out [the page on Modules](/Modules) for an explanation -of what modules are and how you can use them. +Check out [the page on Modules](/Modules) for an explanation of what modules are +and how you can use them. */ JsVar *jswrap_require(JsVar *moduleName) { if (!jsvIsString(moduleName)) { diff --git a/src/jswrap_object.c b/src/jswrap_object.c index 8b13b30bde..527c1fcd11 100644 --- a/src/jswrap_object.c +++ b/src/jswrap_object.c @@ -168,7 +168,8 @@ Return all enumerable keys of the given object ], "return" : ["JsVar","An array of the Object's own properties"] } -Returns an array of all properties (enumerable or not) found directly on a given object. +Returns an array of all properties (enumerable or not) found directly on a given +object. */ static void _jswrap_object_keys_or_property_names_iterator( @@ -360,7 +361,8 @@ JsVar *jswrap_object_values_or_entries(JsVar *object, bool returnEntries) { ], "return" : ["JsVar","A new object"] } -Creates a new object with the specified prototype object and properties. properties are currently unsupported. +Creates a new object with the specified prototype object and properties. +properties are currently unsupported. */ JsVar *jswrap_object_create(JsVar *proto, JsVar *propertiesObject) { if (!jsvIsObject(proto) && !jsvIsNull(proto)) { @@ -444,7 +446,8 @@ JsVar *jswrap_object_getOwnPropertyDescriptor(JsVar *parent, JsVar *name) { } Return true if the object (not its prototype) has the given property. -NOTE: This currently returns false-positives for built-in functions in prototypes +NOTE: This currently returns false-positives for built-in functions in +prototypes */ bool jswrap_object_hasOwnProperty(JsVar *parent, JsVar *name) { JsVar *propName = jsvAsArrayIndex(name); @@ -491,14 +494,20 @@ bool jswrap_object_hasOwnProperty(JsVar *parent, JsVar *name) { } Add a new property to the Object. 'Desc' is an object with the following fields: -* `configurable` (bool = false) - can this property be changed/deleted (not implemented) -* `enumerable` (bool = false) - can this property be enumerated (not implemented) +* `configurable` (bool = false) - can this property be changed/deleted (not + implemented) +* `enumerable` (bool = false) - can this property be enumerated (not + implemented) * `value` (anything) - the value of this property -* `writable` (bool = false) - can the value be changed with the assignment operator? -* `get` (function) - the getter function, or undefined if no getter (only supported on some platforms) -* `set` (function) - the setter function, or undefined if no setter (only supported on some platforms) +* `writable` (bool = false) - can the value be changed with the assignment + operator? +* `get` (function) - the getter function, or undefined if no getter (only + supported on some platforms) +* `set` (function) - the setter function, or undefined if no setter (only + supported on some platforms) -**Note:** `configurable`, `enumerable` and `writable` are not implemented and will be ignored. +**Note:** `configurable`, `enumerable` and `writable` are not implemented and +will be ignored. */ JsVar *jswrap_object_defineProperty(JsVar *parent, JsVar *propName, JsVar *desc) { @@ -552,7 +561,8 @@ JsVar *jswrap_object_defineProperty(JsVar *parent, JsVar *propName, JsVar *desc) ], "return" : ["JsVar","The object, obj."] } -Adds new properties to the Object. See `Object.defineProperty` for more information +Adds new properties to the Object. See `Object.defineProperty` for more +information */ JsVar *jswrap_object_defineProperties(JsVar *parent, JsVar *props) { if (!jsvIsObject(parent)) { @@ -605,8 +615,8 @@ JsVar *jswrap_object_getPrototypeOf(JsVar *object) { ], "return" : ["JsVar","The object passed in"] } -Set the prototype of the given object - this is like writing -`object.__proto__ = prototype` but is the 'proper' ES6 way of doing it +Set the prototype of the given object - this is like writing `object.__proto__ = +prototype` but is the 'proper' ES6 way of doing it */ JsVar *jswrap_object_setPrototypeOf(JsVar *object, JsVar *proto) { JsVar *v = (jsvIsFunction(object)||jsvIsObject(object)) ? jsvFindChildFromString(object, "__proto__", true) : 0; @@ -700,10 +710,11 @@ void jswrap_object_addEventListener(JsVar *parent, const char *eventName, void ( ["listener","JsVar","The listener to call when this event is received"] ] } -Register an event listener for this object, for instance `Serial1.on('data', function(d) {...})`. +Register an event listener for this object, for instance `Serial1.on('data', +function(d) {...})`. -This is the same as Node.js's [EventEmitter](https://nodejs.org/api/events.html) but on Espruino -the functionality is built into every object: +This is the same as Node.js's [EventEmitter](https://nodejs.org/api/events.html) +but on Espruino the functionality is built into every object: * `Object.on` * `Object.emit` @@ -794,7 +805,8 @@ void jswrap_object_on(JsVar *parent, JsVar *event, JsVar *listener) { ["args","JsVarArray","Optional arguments"] ] } -Call any event listeners that were added to this object with `Object.on`, for instance `obj.emit('data', 'Foo')`. +Call any event listeners that were added to this object with `Object.on`, for +instance `obj.emit('data', 'Foo')`. For more information see `Object.on` */ @@ -967,8 +979,9 @@ void jswrap_object_removeAllListeners_cstr(JsVar *parent, const char *event) { ["newFunc","JsVar","The new function to replace this function with"] ] } -This replaces the function with the one in the argument - while keeping the old function's scope. -This allows inner functions to be edited, and is used when edit() is called on an inner function. +This replaces the function with the one in the argument - while keeping the old +function's scope. This allows inner functions to be edited, and is used when +edit() is called on an inner function. */ void jswrap_function_replaceWith(JsVar *oldFunc, JsVar *newFunc) { if ((!jsvIsFunction(oldFunc)) || (!jsvIsFunction(newFunc))) { diff --git a/src/jswrap_onewire.c b/src/jswrap_onewire.c index 6367a10ec2..ec8f0350df 100644 --- a/src/jswrap_onewire.c +++ b/src/jswrap_onewire.c @@ -21,7 +21,8 @@ "type" : "class", "class" : "OneWire" } -This class provides a software-defined OneWire master. It is designed to be similar to Arduino's OneWire library. +This class provides a software-defined OneWire master. It is designed to be +similar to Arduino's OneWire library. */ static Pin onewire_getpin(JsVar *parent) { diff --git a/src/jswrap_pin.c b/src/jswrap_pin.c index ca69bc3ed0..2b857ee954 100644 --- a/src/jswrap_pin.c +++ b/src/jswrap_pin.c @@ -24,7 +24,8 @@ } This is the built-in class for Pins, such as D0,D1,LED1, or BTN -You can call the methods on Pin, or you can use Wiring-style functions such as digitalWrite +You can call the methods on Pin, or you can use Wiring-style functions such as +digitalWrite */ /*JSON{ @@ -59,7 +60,8 @@ JsVar *jswrap_pin_constructor(JsVar *val) { } Returns the input state of the pin as a boolean. - **Note:** if you didn't call `pinMode` beforehand then this function will also reset the pin's state to `"input"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset the pin's state to `"input"` */ bool jswrap_pin_read(JsVar *parent) { Pin pin = jshGetPinFromVar(parent); @@ -74,7 +76,8 @@ bool jswrap_pin_read(JsVar *parent) { } Sets the output state of the pin to a 1 - **Note:** if you didn't call `pinMode` beforehand then this function will also reset the pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset the pin's state to `"output"` */ void jswrap_pin_set(JsVar *parent) { Pin pin = jshGetPinFromVar(parent); @@ -89,7 +92,8 @@ void jswrap_pin_set(JsVar *parent) { } Sets the output state of the pin to a 0 - **Note:** if you didn't call `pinMode` beforehand then this function will also reset the pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset the pin's state to `"output"` */ void jswrap_pin_reset(JsVar *parent) { Pin pin = jshGetPinFromVar(parent); @@ -107,7 +111,8 @@ void jswrap_pin_reset(JsVar *parent) { } Sets the output state of the pin to the parameter given - **Note:** if you didn't call `pinMode` beforehand then this function will also reset the pin's state to `"output"` + **Note:** if you didn't call `pinMode` beforehand then this function will also + reset the pin's state to `"output"` */ void jswrap_pin_write( JsVar *parent, //!< The class instance representing the Pin. @@ -130,7 +135,8 @@ void jswrap_pin_write( } Sets the output state of the pin to the parameter given at the specified time. - **Note:** this **doesn't** change the mode of the pin to an output. To do that, you need to use `pin.write(0)` or `pinMode(pin, 'output')` first. + **Note:** this **doesn't** change the mode of the pin to an output. To do that, + you need to use `pin.write(0)` or `pinMode(pin, 'output')` first. */ void jswrap_pin_writeAtTime(JsVar *parent, bool value, JsVarFloat time) { Pin pin = jshGetPinFromVar(parent); @@ -161,7 +167,8 @@ JsVar *jswrap_pin_getMode(JsVar *parent) { ["mode", "JsVar", "The mode - a string that is either 'analog', 'input', 'input_pullup', 'input_pulldown', 'output', 'opendrain', 'af_output' or 'af_opendrain'. Do not include this argument if you want to revert to automatic pin mode setting."] ] } -Set the mode of the given pin. See [`pinMode`](#l__global_pinMode) for more information on pin modes. +Set the mode of the given pin. See [`pinMode`](#l__global_pinMode) for more +information on pin modes. */ void jswrap_pin_mode(JsVar *parent, JsVar *mode) { jswrap_io_pinMode(jshGetPinFromVar(parent), mode, false); @@ -178,7 +185,8 @@ Toggles the state of the pin from off to on, or from on to off. **Note:** This method doesn't currently work on the ESP8266 port of Espruino. -**Note:** if you didn't call `pinMode` beforehand then this function will also reset the pin's state to `"output"` +**Note:** if you didn't call `pinMode` beforehand then this function will also +reset the pin's state to `"output"` */ bool jswrap_pin_toggle(JsVar *parent) { Pin pin = jshGetPinFromVar(parent); diff --git a/src/jswrap_process.c b/src/jswrap_process.c index a29e683d4c..4fdb3427d0 100644 --- a/src/jswrap_process.c +++ b/src/jswrap_process.c @@ -37,10 +37,12 @@ This class contains information about Espruino itself "name" : "uncaughtException", "params" : [["exception","JsVar","The uncaught exception"]] } -This event is called when an exception gets thrown and isn't caught (eg. it gets all the way back to the event loop). +This event is called when an exception gets thrown and isn't caught (eg. it gets +all the way back to the event loop). -You can use this for logging potential problems that might occur during execution when you -might not be able to see what is written to the console, for example: +You can use this for logging potential problems that might occur during +execution when you might not be able to see what is written to the console, for +example: ``` var lastError; @@ -54,8 +56,8 @@ function checkError() { } ``` -**Note:** When this is used, exceptions will cease to be reported on the console - which -may make debugging difficult! +**Note:** When this is used, exceptions will cease to be reported on the +console - which may make debugging difficult! */ /*JSON{ @@ -108,15 +110,21 @@ Returns an Object containing various pre-defined variables. * `RAM` - total amount of on-chip RAM in bytes * `FLASH` - total amount of on-chip flash memory in bytes * `SPIFLASH` - (on Bangle.js) total amount of off-chip flash memory in bytes -* `HWVERSION` - For Puck.js this is the board revision (1, 2, 2.1), or for Bangle.js it's 1 or 2 +* `HWVERSION` - For Puck.js this is the board revision (1, 2, 2.1), or for + Bangle.js it's 1 or 2 * `STORAGE` - memory in bytes dedicated to the `Storage` module * `SERIAL` - the serial number of this chip -* `CONSOLE` - the name of the current console device being used (`Serial1`, `USB`, `Bluetooth`, etc) +* `CONSOLE` - the name of the current console device being used (`Serial1`, + `USB`, `Bluetooth`, etc) * `MODULES` - a list of built-in modules separated by commas -* `EXPTR` - The address of the `exportPtrs` structure in flash (this includes links to built-in functions that compiled JS code needs) -* `APP_RAM_BASE` - On nRF5x boards, this is the RAM required by the Softdevice *if it doesn't exactly match what was allocated*. You can use this to update `LD_APP_RAM_BASE` in the `BOARD.py` file - -For example, to get a list of built-in modules, you can use `process.env.MODULES.split(',')` +* `EXPTR` - The address of the `exportPtrs` structure in flash (this includes + links to built-in functions that compiled JS code needs) +* `APP_RAM_BASE` - On nRF5x boards, this is the RAM required by the Softdevice + *if it doesn't exactly match what was allocated*. You can use this to update + `LD_APP_RAM_BASE` in the `BOARD.py` file + +For example, to get a list of built-in modules, you can use +`process.env.MODULES.split(',')` */ JsVar *jswrap_process_env() { JsVar *obj = jsvNewObject(); @@ -163,22 +171,33 @@ JsVar *jswrap_process_env() { ], "return" : ["JsVar","Information about memory usage"] } -Run a Garbage Collection pass, and return an object containing information on memory usage. +Run a Garbage Collection pass, and return an object containing information on +memory usage. -* `free` : Memory that is available to be used (in blocks) +* `free` : Memory that is available to be used (in blocks) * `usage` : Memory that has been used (in blocks) * `total` : Total memory (in blocks) -* `history` : Memory used for command history - that is freed if memory is low. Note that this is INCLUDED in the figure for 'free' -* `gc` : Memory freed during the GC pass -* `gctime` : Time taken for GC pass (in milliseconds) +* `history` : Memory used for command history - that is freed if memory is low. + Note that this is INCLUDED in the figure for 'free' +* `gc` : Memory freed during the GC pass +* `gctime` : Time taken for GC pass (in milliseconds) * `blocksize` : Size of a block (variable) in bytes -* `stackEndAddress` : (on ARM) the address (that can be used with peek/poke/etc) of the END of the stack. The stack grows down, so unless you do a lot of recursion the bytes above this can be used. -* `flash_start` : (on ARM) the address of the start of flash memory (usually `0x8000000`) -* `flash_binary_end` : (on ARM) the address in flash memory of the end of Espruino's firmware. -* `flash_code_start` : (on ARM) the address in flash memory of pages that store any code that you save with `save()`. -* `flash_length` : (on ARM) the amount of flash memory this firmware was built for (in bytes). **Note:** Some STM32 chips actually have more memory than is advertised. - -Memory units are specified in 'blocks', which are around 16 bytes each (depending on your device). The actual size is available in `blocksize`. See http://www.espruino.com/Performance for more information. +* `stackEndAddress` : (on ARM) the address (that can be used with peek/poke/etc) + of the END of the stack. The stack grows down, so unless you do a lot of + recursion the bytes above this can be used. +* `flash_start` : (on ARM) the address of the start of flash memory (usually + `0x8000000`) +* `flash_binary_end` : (on ARM) the address in flash memory of the end of + Espruino's firmware. +* `flash_code_start` : (on ARM) the address in flash memory of pages that store + any code that you save with `save()`. +* `flash_length` : (on ARM) the amount of flash memory this firmware was built + for (in bytes). **Note:** Some STM32 chips actually have more memory than is + advertised. + +Memory units are specified in 'blocks', which are around 16 bytes each +(depending on your device). The actual size is available in `blocksize`. See +http://www.espruino.com/Performance for more information. **Note:** To find free areas of flash memory, see `require('Flash').getFree()` */ diff --git a/src/jswrap_promise.c b/src/jswrap_promise.c index bd984ffe83..0722bb888e 100644 --- a/src/jswrap_promise.c +++ b/src/jswrap_promise.c @@ -207,8 +207,8 @@ void jspromise_reject(JsVar *promise, JsVar *data) { "return" : ["JsVar","A Promise"], "typescript": "new(executor: (resolve: (value: T) => void, reject: (reason?: any) => void) => void): Promise;" } -Create a new Promise. The executor function is executed immediately (before the constructor even returns) -and +Create a new Promise. The executor function is executed immediately (before the +constructor even returns) and */ JsVar *jswrap_promise_constructor(JsVar *executor) { JsVar *obj = jspromise_create(); @@ -247,8 +247,8 @@ JsVar *jswrap_promise_constructor(JsVar *executor) { "return" : ["JsVar","A new Promise"], "typescript": "all(promises: Promise[]): Promise;" } -Return a new promise that is resolved when all promises in the supplied -array are resolved. +Return a new promise that is resolved when all promises in the supplied array +are resolved. */ JsVar *jswrap_promise_all(JsVar *arr) { if (!jsvIsIterable(arr)) { @@ -305,8 +305,7 @@ JsVar *jswrap_promise_all(JsVar *arr) { "return" : ["JsVar","A new Promise"], "typescript": "resolve(promises: T): Promise;" } -Return a new promise that is already resolved (at idle it'll -call `.then`) +Return a new promise that is already resolved (at idle it'll call `.then`) */ JsVar *jswrap_promise_resolve(JsVar *data) { JsVar *promise = 0; @@ -340,8 +339,7 @@ JsVar *jswrap_promise_resolve(JsVar *data) { ], "return" : ["JsVar","A new Promise"] } -Return a new promise that is already rejected (at idle it'll -call `.catch`) +Return a new promise that is already rejected (at idle it'll call `.catch`) */ JsVar *jswrap_promise_reject(JsVar *data) { JsVar *promise = jspromise_create(); diff --git a/src/jswrap_regexp.c b/src/jswrap_regexp.c index 672a804d46..08e4c43ac1 100644 --- a/src/jswrap_regexp.c +++ b/src/jswrap_regexp.c @@ -275,7 +275,8 @@ static JsVar *matchhere(char *regexp, JsvStringIterator *txtIt, matchInfo info) The built-in class for handling Regular Expressions **Note:** Espruino's regular expression parser does not contain all the features -present in a full ES6 JS engine. However it does contain support for the all the basics. +present in a full ES6 JS engine. However it does contain support for the all the +basics. */ /*JSON{ @@ -321,7 +322,8 @@ JsVar *jswrap_regexp_constructor(JsVar *str, JsVar *flags) { "generate" : "jswrap_regexp_exec", "return" : ["JsVar","A result array, or null"] } -Test this regex on a string - returns a result array on success, or `null` otherwise. +Test this regex on a string - returns a result array on success, or `null` +otherwise. `/Wo/.exec("Hello World")` will return: @@ -391,7 +393,8 @@ JsVar *jswrap_regexp_exec(JsVar *parent, JsVar *arg) { "generate" : "jswrap_regexp_test", "return" : ["bool","true for a match, or false"] } -Test this regex on a string - returns `true` on a successful match, or `false` otherwise +Test this regex on a string - returns `true` on a successful match, or `false` +otherwise */ bool jswrap_regexp_test(JsVar *parent, JsVar *str) { JsVar *v = jswrap_regexp_exec(parent, str); diff --git a/src/jswrap_serial.c b/src/jswrap_serial.c index 89e78b713e..ad9ca0ee29 100644 --- a/src/jswrap_serial.c +++ b/src/jswrap_serial.c @@ -24,7 +24,10 @@ } This class allows use of the built-in USARTs -Methods may be called on the `USB`, `Serial1`, `Serial2`, `Serial3`, `Serial4`, `Serial5` and `Serial6` objects. While different processors provide different numbers of USARTs, on official Espruino boards you can always rely on at least `Serial1` being available +Methods may be called on the `USB`, `Serial1`, `Serial2`, `Serial3`, `Serial4`, +`Serial5` and `Serial6` objects. While different processors provide different +numbers of USARTs, on official Espruino boards you can always rely on at least +`Serial1` being available */ /*JSON{ "type" : "constructor", @@ -33,7 +36,8 @@ Methods may be called on the `USB`, `Serial1`, `Serial2`, `Serial3`, `Serial4`, "generate" : "jswrap_serial_constructor", "return" : ["JsVar","A Serial object"] } -Create a software Serial port. This has limited functionality (only low baud rates), but it can work on any pins. +Create a software Serial port. This has limited functionality (only low baud +rates), but it can work on any pins. Use `Serial.setup` to configure this port. */ @@ -48,7 +52,9 @@ JsVar *jswrap_serial_constructor() { ["data","JsVar","A string containing one or more characters of received data"] ] } -The `data` event is called when data is received. If a handler is defined with `X.on('data', function(data) { ... })` then it will be called, otherwise data will be stored in an internal buffer, where it can be retrieved with `X.read()` +The `data` event is called when data is received. If a handler is defined with +`X.on('data', function(data) { ... })` then it will be called, otherwise data +will be stored in an internal buffer, where it can be retrieved with `X.read()` */ /*JSON{ @@ -57,31 +63,34 @@ The `data` event is called when data is received. If a handler is defined with ` "name" : "framing" } The `framing` event is called when there was activity on the input to the UART -but the `STOP` bit wasn't in the correct place. This is either because there -was noise on the line, or the line has been pulled to 0 for a long period -of time. +but the `STOP` bit wasn't in the correct place. This is either because there was +noise on the line, or the line has been pulled to 0 for a long period of time. -To enable this, you must initialise Serial with `SerialX.setup(..., { ..., errors:true });` +To enable this, you must initialise Serial with `SerialX.setup(..., { ..., +errors:true });` **Note:** Even though there was an error, the byte will still be received and passed to the `data` handler. -**Note:** This only works on STM32 and NRF52 based devices (eg. all official Espruino boards) +**Note:** This only works on STM32 and NRF52 based devices (eg. all official +Espruino boards) */ /*JSON{ "type" : "event", "class" : "Serial", "name" : "parity" } -The `parity` event is called when the UART was configured with a parity bit, -and this doesn't match the bits that have actually been received. +The `parity` event is called when the UART was configured with a parity bit, and +this doesn't match the bits that have actually been received. -To enable this, you must initialise Serial with `SerialX.setup(..., { ..., errors:true });` +To enable this, you must initialise Serial with `SerialX.setup(..., { ..., +errors:true });` **Note:** Even though there was an error, the byte will still be received and passed to the `data` handler. -**Note:** This only works on STM32 and NRF52 based devices (eg. all official Espruino boards) +**Note:** This only works on STM32 and NRF52 based devices (eg. all official +Espruino boards) */ // this is created in jsiIdle based on EV_SERIALx_STATUS ecents @@ -95,7 +104,8 @@ passed to the `data` handler. ], "return" : ["JsVar","An object of type `Serial`, or `undefined` if one couldn't be found."] } -Try and find a USART (Serial) hardware device that will work on this pin (eg. `Serial1`) +Try and find a USART (Serial) hardware device that will work on this pin (eg. +`Serial1`) May return undefined if no device can be found. */ @@ -163,14 +173,16 @@ The sixth Serial (USART) port "name" : "LoopbackA", "instanceof" : "Serial" } -A loopback serial device. Data sent to `LoopbackA` comes out of `LoopbackB` and vice versa +A loopback serial device. Data sent to `LoopbackA` comes out of `LoopbackB` and +vice versa */ /*JSON{ "type" : "object", "name" : "LoopbackB", "instanceof" : "Serial" } -A loopback serial device. Data sent to `LoopbackA` comes out of `LoopbackB` and vice versa +A loopback serial device. Data sent to `LoopbackA` comes out of `LoopbackB` and +vice versa */ /*JSON{ "type" : "object", @@ -178,7 +190,8 @@ A loopback serial device. Data sent to `LoopbackA` comes out of `LoopbackB` and "instanceof" : "Serial", "#if" : "defined(USE_TELNET)" } -A telnet serial device that maps to the built-in telnet console server (devices that have built-in wifi only). +A telnet serial device that maps to the built-in telnet console server (devices +that have built-in wifi only). */ @@ -194,8 +207,8 @@ A telnet serial device that maps to the built-in telnet console server (devices } Set this Serial port as the port for the JavaScript console (REPL). -Unless `force` is set to true, changes in the connection state of the board -(for instance plugging in USB) will cause the console to change. +Unless `force` is set to true, changes in the connection state of the board (for +instance plugging in USB) will cause the console to change. See `E.setConsole` for a more flexible version of this function. */ @@ -244,31 +257,31 @@ The second argument can contain: } ``` -You can find out which pins to use by looking at [your board's reference page](#boards) -and searching for pins with the `UART`/`USART` markers. +You can find out which pins to use by looking at [your board's reference +page](#boards) and searching for pins with the `UART`/`USART` markers. -If not specified in options, the default pins are used for rx and tx -(usually the lowest numbered pins on the lowest port that supports -this peripheral). `ck` and `cts` are not used unless specified. +If not specified in options, the default pins are used for rx and tx (usually +the lowest numbered pins on the lowest port that supports this peripheral). `ck` +and `cts` are not used unless specified. -Note that even after changing the RX and TX pins, if you have called setup +Note that even after changing the RX and TX pins, if you have called setup before then the previous RX and TX pins will still be connected to the Serial port as well - until you set them to something else using `digitalWrite` or `pinMode`. -Flow control can be xOn/xOff (`flow:'xon'`) or hardware flow control -(receive only) if `cts` is specified. If `cts` is set to a pin, the -pin's value will be 0 when Espruino is ready for data and 1 when it isn't. +Flow control can be xOn/xOff (`flow:'xon'`) or hardware flow control (receive +only) if `cts` is specified. If `cts` is set to a pin, the pin's value will be 0 +when Espruino is ready for data and 1 when it isn't. By default, framing or parity errors don't create `framing` or `parity` events -on the `Serial` object because storing these errors uses up additional -storage in the queue. If you're intending to receive a lot of malformed -data then the queue might overflow `E.getErrorFlags()` would return `FIFO_FULL`. -However if you need to respond to `framing` or `parity` errors then -you'll need to use `errors:true` when initialising serial. +on the `Serial` object because storing these errors uses up additional storage +in the queue. If you're intending to receive a lot of malformed data then the +queue might overflow `E.getErrorFlags()` would return `FIFO_FULL`. However if +you need to respond to `framing` or `parity` errors then you'll need to use +`errors:true` when initialising serial. -On Linux builds there is no default Serial device, so you must specify -a path to a device - for instance: `Serial1.setup(9600,{path:"/dev/ttyACM0"})` +On Linux builds there is no default Serial device, so you must specify a path to +a device - for instance: `Serial1.setup(9600,{path:"/dev/ttyACM0"})` You can also set up 'software serial' using code like: @@ -277,7 +290,8 @@ var s = new Serial(); s.setup(9600,{rx:a_pin, tx:a_pin}); ``` -However software serial doesn't use `ck`, `cts`, `parity`, `flow` or `errors` parts of the initialisation object. +However software serial doesn't use `ck`, `cts`, `parity`, `flow` or `errors` +parts of the initialisation object. */ void jswrap_serial_setup(JsVar *parent, JsVar *baud, JsVar *options) { if (!jsvIsObject(parent)) return; @@ -338,8 +352,7 @@ void jswrap_serial_setup(JsVar *parent, JsVar *baud, JsVar *options) { "name" : "unsetup", "generate" : "jswrap_serial_unsetup" } -If the serial (or software serial) device was set up, -uninitialise it. +If the serial (or software serial) device was set up, uninitialise it. */ #ifndef SAVE_ON_FLASH void jswrap_serial_unsetup(JsVar *parent) { @@ -413,7 +426,8 @@ void _jswrap_serial_print(JsVar *parent, JsVar *arg, bool isPrint, bool newLine) } Print a string to the serial port - without a line feed - **Note:** This function replaces any occurances of `\n` in the string with `\r\n`. To avoid this, use `Serial.write`. + **Note:** This function replaces any occurances of `\n` in the string with + `\r\n`. To avoid this, use `Serial.write`. */ /*JSON{ "type" : "method", @@ -426,7 +440,9 @@ Print a string to the serial port - without a line feed } Print a line to the serial port with a newline (`\r\n`) at the end of it. - **Note:** This function converts data to a string first, eg `Serial.print([1,2,3])` is equivalent to `Serial.print("1,2,3"). If you'd like to write raw bytes, use `Serial.write`. + **Note:** This function converts data to a string first, eg + `Serial.print([1,2,3])` is equivalent to `Serial.print("1,2,3"). If you'd like + to write raw bytes, use `Serial.write`. */ void jswrap_serial_print(JsVar *parent, JsVar *str) { _jswrap_serial_print(parent, str, true, false); @@ -445,7 +461,9 @@ void jswrap_serial_println(JsVar *parent, JsVar *str) { } Write a character or array of data to the serial port -This method writes unmodified data, eg `Serial.write([1,2,3])` is equivalent to `Serial.write("\1\2\3")`. If you'd like data converted to a string first, use `Serial.print`. +This method writes unmodified data, eg `Serial.write([1,2,3])` is equivalent to +`Serial.write("\1\2\3")`. If you'd like data converted to a string first, use +`Serial.print`. */ void jswrap_serial_write(JsVar *parent, JsVar *args) { _jswrap_serial_print(parent, args, false, false); @@ -470,8 +488,8 @@ Serial1.inject('Hello World'); // prints "Got Hel","Got lo World" (characters can be split over multiple callbacks) ``` -This is most useful if you wish to send characters to Espruino's -REPL (console) while it is on another device. +This is most useful if you wish to send characters to Espruino's REPL (console) +while it is on another device. */ static void _jswrap_serial_inject_cb(int data, void *userData) { IOEventFlags device = *(IOEventFlags*)userData; @@ -490,7 +508,8 @@ void jswrap_serial_inject(JsVar *parent, JsVar *args) { "generate" : "jswrap_stream_available", "return" : ["int","How many bytes are available"] } -Return how many bytes are available to read. If there is already a listener for data, this will always return 0. +Return how many bytes are available to read. If there is already a listener for +data, this will always return 0. */ /*JSON{ diff --git a/src/jswrap_spi_i2c.c b/src/jswrap_spi_i2c.c index 3b2c51d059..1d42aa16f0 100644 --- a/src/jswrap_spi_i2c.c +++ b/src/jswrap_spi_i2c.c @@ -24,7 +24,8 @@ "type" : "class", "class" : "SPI" } -This class allows use of the built-in SPI ports. Currently it is SPI master only. +This class allows use of the built-in SPI ports. Currently it is SPI master +only. */ /*JSON{ @@ -59,7 +60,8 @@ The third SPI port "generate" : "jswrap_spi_constructor", "return" : ["JsVar","A SPI object"] } -Create a software SPI port. This has limited functionality (no baud rate), but it can work on any pins. +Create a software SPI port. This has limited functionality (no baud rate), but +it can work on any pins. Use `SPI.setup` to configure this port. */ @@ -107,13 +109,21 @@ Options can contain the following (defaults are shown where relevant): } ``` -If `sck`,`miso` and `mosi` are left out, they will automatically be chosen. However if one or more is specified then the unspecified pins will not be set up. +If `sck`,`miso` and `mosi` are left out, they will automatically be chosen. +However if one or more is specified then the unspecified pins will not be set +up. -You can find out which pins to use by looking at [your board's reference page](#boards) and searching for pins with the `SPI` marker. Some boards such as those based on `nRF52` chips can have SPI on any pins, so don't have specific markings. +You can find out which pins to use by looking at [your board's reference +page](#boards) and searching for pins with the `SPI` marker. Some boards such as +those based on `nRF52` chips can have SPI on any pins, so don't have specific +markings. -The SPI `mode` is between 0 and 3 - see http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus#Clock_polarity_and_phase +The SPI `mode` is between 0 and 3 - see +http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus#Clock_polarity_and_phase -On STM32F1-based parts, you cannot mix AF and non-AF pins (SPI pins are usually grouped on the chip - and you can't mix pins from two groups). Espruino will not warn you about this. +On STM32F1-based parts, you cannot mix AF and non-AF pins (SPI pins are usually +grouped on the chip - and you can't mix pins from two groups). Espruino will not +warn you about this. */ void jswrap_spi_setup( JsVar *parent, //!< The variable that is the class instance of this function. @@ -168,11 +178,16 @@ void jswrap_spi_setup( ], "return" : ["JsVar","The data that was returned"] } -Send data down SPI, and return the result. Sending an integer will return an integer, a String will return a String, and anything else will return a Uint8Array. +Send data down SPI, and return the result. Sending an integer will return an +integer, a String will return a String, and anything else will return a +Uint8Array. -Sending multiple bytes in one call to send is preferable as they can then be transmitted end to end. Using multiple calls to send() will result in significantly slower transmission speeds. +Sending multiple bytes in one call to send is preferable as they can then be +transmitted end to end. Using multiple calls to send() will result in +significantly slower transmission speeds. -For maximum speeds, please pass either Strings or Typed Arrays as arguments. Note that you can even pass arrays of arrays, like `[1,[2,3,4],5]` +For maximum speeds, please pass either Strings or Typed Arrays as arguments. +Note that you can even pass arrays of arrays, like `[1,[2,3,4],5]` */ typedef struct { @@ -299,7 +314,8 @@ void jswrap_spi_write_cb( ["data","JsVarArray",["One or more items to write. May be ints, strings, arrays, or special objects (see `E.toUint8Array` for more info).","If the last argument is a pin, it is taken to be the NSS pin"]] ] } -Write a character or array of characters to SPI - without reading the result back. +Write a character or array of characters to SPI - without reading the result +back. For maximum speeds, please pass either Strings or Typed Arrays as arguments. */ @@ -357,9 +373,12 @@ void jswrap_spi_write( ["nss_pin","pin","An nSS pin - this will be lowered before SPI output and raised afterwards (optional). There will be a small delay between when this is lowered and when sending starts, and also between sending finishing and it being raised."] ] } -Send data down SPI, using 4 bits for each 'real' bit (MSB first). This can be useful for faking one-wire style protocols +Send data down SPI, using 4 bits for each 'real' bit (MSB first). This can be +useful for faking one-wire style protocols -Sending multiple bytes in one call to send is preferable as they can then be transmitted end to end. Using multiple calls to send() will result in significantly slower transmission speeds. +Sending multiple bytes in one call to send is preferable as they can then be +transmitted end to end. Using multiple calls to send() will result in +significantly slower transmission speeds. */ void jswrap_spi_send4bit(JsVar *parent, JsVar *srcdata, int bit0, int bit1, Pin nss_pin) { if (!jsvIsObject(parent)) return; @@ -427,9 +446,12 @@ void jswrap_spi_send4bit(JsVar *parent, JsVar *srcdata, int bit0, int bit1, Pin ["nss_pin","pin","An nSS pin - this will be lowered before SPI output and raised afterwards (optional). There will be a small delay between when this is lowered and when sending starts, and also between sending finishing and it being raised"] ] } -Send data down SPI, using 8 bits for each 'real' bit (MSB first). This can be useful for faking one-wire style protocols +Send data down SPI, using 8 bits for each 'real' bit (MSB first). This can be +useful for faking one-wire style protocols -Sending multiple bytes in one call to send is preferable as they can then be transmitted end to end. Using multiple calls to send() will result in significantly slower transmission speeds. +Sending multiple bytes in one call to send is preferable as they can then be +transmitted end to end. Using multiple calls to send() will result in +significantly slower transmission speeds. */ void jswrap_spi_send8bit(JsVar *parent, JsVar *srcdata, int bit0, int bit1, Pin nss_pin) { if (!jsvIsObject(parent)) return; @@ -487,9 +509,11 @@ void jswrap_spi_send8bit(JsVar *parent, JsVar *srcdata, int bit0, int bit1, Pin "type" : "class", "class" : "I2C" } -This class allows use of the built-in I2C ports. Currently it allows I2C Master mode only. +This class allows use of the built-in I2C ports. Currently it allows I2C Master +mode only. -All addresses are in 7 bit format. If you have an 8 bit address then you need to shift it one bit to the right. +All addresses are in 7 bit format. If you have an 8 bit address then you need to +shift it one bit to the right. */ /*JSON{ "type" : "constructor", @@ -498,7 +522,8 @@ All addresses are in 7 bit format. If you have an 8 bit address then you need to "generate" : "jswrap_i2c_constructor", "return" : ["JsVar","An I2C object"] } -Create a software I2C port. This has limited functionality (no baud rate), but it can work on any pins. +Create a software I2C port. This has limited functionality (no baud rate), but +it can work on any pins. Use `I2C.setup` to configure this port. */ @@ -559,7 +584,8 @@ The third I2C port } Set up this I2C port -If not specified in options, the default pins are used (usually the lowest numbered pins on the lowest port that supports this peripheral) +If not specified in options, the default pins are used (usually the lowest +numbered pins on the lowest port that supports this peripheral) */ void jswrap_i2c_setup(JsVar *parent, JsVar *options) { if (!jsvIsObject(parent)) return; @@ -621,7 +647,8 @@ static NO_INLINE int i2c_get_address(JsVar *address, bool *sendStop) { ["data","JsVarArray","One or more items to write. May be ints, strings, arrays, or special objects (see `E.toUint8Array` for more info)."] ] } -Transmit to the slave device with the given address. This is like Arduino's beginTransmission, write, and endTransmission rolled up into one. +Transmit to the slave device with the given address. This is like Arduino's +beginTransmission, write, and endTransmission rolled up into one. */ void jswrap_i2c_writeTo(JsVar *parent, JsVar *addressVar, JsVar *args) { @@ -663,7 +690,9 @@ void jswrap_i2c_writeTo(JsVar *parent, JsVar *addressVar, JsVar *args) { "return" : ["JsVar","The data that was returned - as a Uint8Array"], "return_object" : "Uint8Array" } -Request bytes from the given slave device, and return them as a Uint8Array (packed array of bytes). This is like using Arduino Wire's requestFrom, available and read functions. Sends a STOP +Request bytes from the given slave device, and return them as a Uint8Array +(packed array of bytes). This is like using Arduino Wire's requestFrom, +available and read functions. Sends a STOP */ JsVar *jswrap_i2c_readFrom(JsVar *parent, JsVar *addressVar, int nBytes) { if (!jsvIsObject(parent)) return 0; diff --git a/src/jswrap_storage.c b/src/jswrap_storage.c index 1698e2be5a..e571aedc37 100644 --- a/src/jswrap_storage.c +++ b/src/jswrap_storage.c @@ -44,25 +44,26 @@ const int STORAGEFILE_CHUNKSIZE = "class" : "Storage" } -This module allows you to read and write part of the nonvolatile flash -memory of your device using a filesystem-like API. +This module allows you to read and write part of the nonvolatile flash memory of +your device using a filesystem-like API. -Also see the `Flash` library, which provides a low level, more dangerous way -to access all parts of your flash memory. +Also see the `Flash` library, which provides a low level, more dangerous way to +access all parts of your flash memory. The `Storage` library provides two distinct types of file: -* `require("Storage").write(...)`/`require("Storage").read(...)`/etc create simple -contiguous files of fixed length. This is the recommended file type. -* `require("Storage").open(...)` creates a `StorageFile`, which stores the file in -numbered chunks (`"filename\1"`/`"filename\2"`/etc). It allows data to be appended -and for the file to be read line by line. +* `require("Storage").write(...)`/`require("Storage").read(...)`/etc create +simple contiguous files of fixed length. This is the recommended file type. +* `require("Storage").open(...)` creates a `StorageFile`, which stores the file +in numbered chunks (`"filename\1"`/`"filename\2"`/etc). It allows data to be +appended and for the file to be read line by line. -You must read a file using the same method you used to write it - eg. you can't create a -file with `require("Storage").open(...)` and then read it with `require("Storage").read(...)`. +You must read a file using the same method you used to write it - eg. you can't +create a file with `require("Storage").open(...)` and then read it with +`require("Storage").read(...)`. -**Note:** In firmware 2v05 and later, the maximum length for filenames -is 28 characters. However in 2v04 and earlier the max length is 8. +**Note:** In firmware 2v05 and later, the maximum length for filenames is 28 +characters. However in 2v04 and earlier the max length is 8. */ /*JSON{ @@ -71,9 +72,9 @@ is 28 characters. However in 2v04 and earlier the max length is 8. "name" : "eraseAll", "generate" : "jswrap_storage_eraseAll" } -Erase the flash storage area. This will remove all files -created with `require("Storage").write(...)` as well -as any code saved with `save()` or `E.setBootCode()`. +Erase the flash storage area. This will remove all files created with +`require("Storage").write(...)` as well as any code saved with `save()` or +`E.setBootCode()`. */ void jswrap_storage_eraseAll() { jsfEraseAll(); @@ -91,8 +92,8 @@ void jswrap_storage_eraseAll() { } Erase a single file from the flash storage area. -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ void jswrap_storage_erase(JsVar *name) { jsfEraseFile(jsfNameFromVar(name)); @@ -111,20 +112,20 @@ void jswrap_storage_erase(JsVar *name) { "return" : ["JsVar","A string of data, or `undefined` if the file is not found"], "typescript" : "read(name: string, offset?: number, length?: number): string | undefined;" } -Read a file from the flash storage area that has -been written with `require("Storage").write(...)`. +Read a file from the flash storage area that has been written with +`require("Storage").write(...)`. -This function returns a memory-mapped String that points to the actual -memory area in read-only memory, so it won't use up RAM. +This function returns a memory-mapped String that points to the actual memory +area in read-only memory, so it won't use up RAM. -As such you can check if a file exists efficiently using `require("Storage").read(filename)!==undefined`. +As such you can check if a file exists efficiently using +`require("Storage").read(filename)!==undefined`. -If you evaluate this string with `eval`, any functions -contained in the String will keep their code stored -in flash memory. +If you evaluate this string with `eval`, any functions contained in the String +will keep their code stored in flash memory. -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ JsVar *jswrap_storage_read(JsVar *name, int offset, int length) { return jsfReadFile(jsfNameFromVar(name), offset, length); @@ -143,16 +144,14 @@ JsVar *jswrap_storage_read(JsVar *name, int offset, int length) { "return" : ["JsVar","An object containing parsed JSON from the file, or undefined"], "typescript" : "readJSON(name: string, noExceptions: boolean): any;" } -Read a file from the flash storage area that has -been written with `require("Storage").write(...)`, -and parse JSON in it into a JavaScript object. +Read a file from the flash storage area that has been written with +`require("Storage").write(...)`, and parse JSON in it into a JavaScript object. -This is identical to `JSON.parse(require("Storage").read(...))`. -It will throw an exception if the data in the file is not -valid JSON. +This is identical to `JSON.parse(require("Storage").read(...))`. It will throw +an exception if the data in the file is not valid JSON. -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ JsVar *jswrap_storage_readJSON(JsVar *name, bool noExceptions) { JsVar *v = jsfReadFile(jsfNameFromVar(name),0,0); @@ -178,17 +177,18 @@ JsVar *jswrap_storage_readJSON(JsVar *name, bool noExceptions) { "return" : ["JsVar","An ArrayBuffer containing data from the file, or undefined"], "typescript" : "readArrayBuffer(name: string): ArrayBuffer | undefined;" } -Read a file from the flash storage area that has -been written with `require("Storage").write(...)`, -and return the raw binary data as an ArrayBuffer. +Read a file from the flash storage area that has been written with +`require("Storage").write(...)`, and return the raw binary data as an +ArrayBuffer. This can be used: * In a `DataView` with `new DataView(require("Storage").readArrayBuffer("x"))` -* In a `Uint8Array/Float32Array/etc` with `new Uint8Array(require("Storage").readArrayBuffer("x"))` +* In a `Uint8Array/Float32Array/etc` with `new + Uint8Array(require("Storage").readArrayBuffer("x"))` -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ JsVar *jswrap_storage_readArrayBuffer(JsVar *name) { JsVar *v = jsfReadFile(jsfNameFromVar(name),0,0); @@ -212,25 +212,24 @@ JsVar *jswrap_storage_readArrayBuffer(JsVar *name) { "return" : ["bool","True on success, false on failure"], "typescript" : "write(name: string | ArrayBuffer | ArrayBufferView | number[] | object, data: any, offset?: number, size?: number): boolean;" } -Write/create a file in the flash storage area. This is -nonvolatile and will not disappear when the device resets -or power is lost. +Write/create a file in the flash storage area. This is nonvolatile and will not +disappear when the device resets or power is lost. -Simply write `require("Storage").write("MyFile", "Some data")` to write -a new file, and `require("Storage").read("MyFile")` to read it. +Simply write `require("Storage").write("MyFile", "Some data")` to write a new +file, and `require("Storage").read("MyFile")` to read it. If you supply: * A String, it will be written as-is * An array, will be written as a byte array (but read back as a String) -* An object, it will automatically be converted to -a JSON string before being written. +* An object, it will automatically be converted to a JSON string before being +written. -**Note:** If an array is supplied it will not be converted to JSON. -To be explicit about the conversion you can use `Storage.writeJSON` +**Note:** If an array is supplied it will not be converted to JSON. To be +explicit about the conversion you can use `Storage.writeJSON` -You may also create a file and then populate data later **as long as you -don't try and overwrite data that already exists**. For instance: +You may also create a file and then populate data later **as long as you don't +try and overwrite data that already exists**. For instance: ``` var f = require("Storage"); @@ -242,12 +241,12 @@ f.write("a"," ",0); // Writing to location 0 again will cause the file to be re- print(f.read("a")); // " " ``` -This can be useful if you've got more data to write than you -have RAM available - for instance the Web IDE uses this method -to write large files into onboard storage. +This can be useful if you've got more data to write than you have RAM +available - for instance the Web IDE uses this method to write large files into +onboard storage. -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ bool jswrap_storage_write(JsVar *name, JsVar *data, JsVarInt offset, JsVarInt _size) { JsVar *d; @@ -276,17 +275,16 @@ bool jswrap_storage_write(JsVar *name, JsVar *data, JsVarInt offset, JsVarInt _s "return" : ["bool","True on success, false on failure"], "typescript" : "writeJSON(name: string, data: any): boolean;" } -Write/create a file in the flash storage area. This is -nonvolatile and will not disappear when the device resets -or power is lost. +Write/create a file in the flash storage area. This is nonvolatile and will not +disappear when the device resets or power is lost. -Simply write `require("Storage").writeJSON("MyFile", [1,2,3])` to write -a new file, and `require("Storage").readJSON("MyFile")` to read it. +Simply write `require("Storage").writeJSON("MyFile", [1,2,3])` to write a new +file, and `require("Storage").readJSON("MyFile")` to read it. This is equivalent to: `require("Storage").write(name, JSON.stringify(data))` -**Note:** This function should be used with normal files, and not -`StorageFile`s created with `require("Storage").open(filename, ...)` +**Note:** This function should be used with normal files, and not `StorageFile`s +created with `require("Storage").open(filename, ...)` */ bool jswrap_storage_writeJSON(JsVar *name, JsVar *data) { JsVar *d = jswrap_json_stringify(data,0,0); @@ -323,8 +321,8 @@ require("Storage").list(undefined, {sf:true}) require("Storage").list(undefined, {sf:false}) ``` -**Note:** This will output system files (eg. saved code) as well as -files that you may have written. +**Note:** This will output system files (eg. saved code) as well as files that +you may have written. */ JsVar *jswrap_storage_list(JsVar *regex, JsVar *filter) { JsfFileFlags containing = 0; @@ -353,11 +351,12 @@ JsVar *jswrap_storage_list(JsVar *regex, JsVar *filter) { "return" : ["int","A hash of the files matching"], "typescript" : "hash(regex: RegExp): number;" } -List all files in the flash storage area matching the specfied regex (ignores StorageFiles), -and then hash their filenames *and* file locations. +List all files in the flash storage area matching the specfied regex (ignores +StorageFiles), and then hash their filenames *and* file locations. -Identical files may have different hashes (eg. if Storage is compacted and the file moves) but -the changes of different files having the same hash are extremely small. +Identical files may have different hashes (eg. if Storage is compacted and the +file moves) but the changes of different files having the same hash are +extremely small. ``` // Hash files @@ -366,10 +365,9 @@ require("Storage").hash() require("Storage").hash(/\.boot\.js$/) ``` -**Note:** This function is used by Bangle.js as a way to cache files. -For instance the bootloader will add all `.boot.js` files together into -a single `.boot0` file, but it needs to know quickly whether anything has -changed. +**Note:** This function is used by Bangle.js as a way to cache files. For +instance the bootloader will add all `.boot.js` files together into a single +`.boot0` file, but it needs to know quickly whether anything has changed. */ JsVarInt jswrap_storage_hash(JsVar *regex) { return jsfHashFiles(regex, 0, JSFF_STORAGEFILE); @@ -382,21 +380,19 @@ JsVarInt jswrap_storage_hash(JsVar *regex) { "name" : "compact", "generate" : "jswrap_storage_compact" } -The Flash Storage system is journaling. To make the most of the limited -write cycles of Flash memory, Espruino marks deleted/replaced files as -garbage and moves on to a fresh part of flash memory. Espruino only -fully erases those files when it is running low on flash, or when -`compact` is called. - -`compact` may fail if there isn't enough RAM free on the stack to -use as swap space, however in this case it will not lose data. - -**Note:** `compact` rearranges the contents of memory. If code is -referencing that memory (eg. functions that have their code stored in flash) -then they may become garbled when compaction happens. To avoid this, -call `eraseFiles` before uploading data that you intend to reference to -ensure that uploaded files are right at the start of flash and cannot be -compacted further. +The Flash Storage system is journaling. To make the most of the limited write +cycles of Flash memory, Espruino marks deleted/replaced files as garbage and +moves on to a fresh part of flash memory. Espruino only fully erases those files +when it is running low on flash, or when `compact` is called. + +`compact` may fail if there isn't enough RAM free on the stack to use as swap +space, however in this case it will not lose data. + +**Note:** `compact` rearranges the contents of memory. If code is referencing +that memory (eg. functions that have their code stored in flash) then they may +become garbled when compaction happens. To avoid this, call `eraseFiles` before +uploading data that you intend to reference to ensure that uploaded files are +right at the start of flash and cannot be compacted further. */ void jswrap_storage_compact() { jsfCompact(); @@ -409,9 +405,8 @@ void jswrap_storage_compact() { "name" : "debug", "generate" : "jswrap_storage_debug" } -This writes information about all blocks in flash -memory to the console - and is only useful for debugging -flash storage. +This writes information about all blocks in flash memory to the console - and is +only useful for debugging flash storage. */ void jswrap_storage_debug() { jsfDebugFiles(); @@ -425,10 +420,9 @@ void jswrap_storage_debug() { "generate" : "jswrap_storage_getFree", "return" : ["int","The amount of free bytes"] } -Return the amount of free bytes available in -Storage. Due to fragmentation there may be more -bytes available, but this represents the maximum -size of file that can be written. +Return the amount of free bytes available in Storage. Due to fragmentation there +may be more bytes available, but this represents the maximum size of file that +can be written. */ int jswrap_storage_getFree() { return (int)jsfGetStorageStats(0,true).free; @@ -475,8 +469,8 @@ JsVar *jswrap_storage_getStats() { "name" : "optimise", "generate" : "jswrap_storage_optimise" } -Writes a lookup table for files into Bangle.js's storage. This allows any file stored -up to that point to be accessed quickly. +Writes a lookup table for files into Bangle.js's storage. This allows any file +stored up to that point to be accessed quickly. */ void jswrap_storage_optimise() { #ifdef ESPR_STORAGE_FILENAME_TABLE @@ -594,22 +588,20 @@ JsVar *jswrap_storage_open(JsVar *name, JsVar *modeVar) { "ifndef" : "SAVE_ON_FLASH" } -These objects are created from `require("Storage").open` -and allow Storage items to be read/written. +These objects are created from `require("Storage").open` and allow Storage items +to be read/written. -The `Storage` library writes into Flash memory (which -can only be erased in chunks), and unlike a normal filesystem -it allocates files in one long contiguous area to allow them -to be accessed easily from Espruino. +The `Storage` library writes into Flash memory (which can only be erased in +chunks), and unlike a normal filesystem it allocates files in one long +contiguous area to allow them to be accessed easily from Espruino. -This presents a challenge for `StorageFile` which allows you -to append to a file, so instead `StorageFile` stores files -in chunks. It uses the last character of the filename -to denote the chunk number (eg `"foobar\1"`, `"foobar\2"`, etc). +This presents a challenge for `StorageFile` which allows you to append to a +file, so instead `StorageFile` stores files in chunks. It uses the last +character of the filename to denote the chunk number (eg `"foobar\1"`, +`"foobar\2"`, etc). -This means that while `StorageFile` files exist in the same -area as those from `Storage`, they should be -read using `Storage.open` (and not `Storage.read`). +This means that while `StorageFile` files exist in the same area as those from +`Storage`, they should be read using `Storage.open` (and not `Storage.read`). ``` f = s.open("foobar","w"); @@ -636,9 +628,9 @@ f.readLine() // undefined f.erase(); ``` -**Note:** `StorageFile` uses the fact that all bits of erased flash memory -are 1 to detect the end of a file. As such you should not write character -code 255 (`"\xFF"`) to these files. +**Note:** `StorageFile` uses the fact that all bits of erased flash memory are 1 +to detect the end of a file. As such you should not write character code 255 +(`"\xFF"`) to these files. */ JsVar *jswrap_storagefile_read_internal(JsVar *f, int len) { @@ -731,10 +723,11 @@ JsVar *jswrap_storagefile_read_internal(JsVar *f, int len) { "return" : ["JsVar","A String, or undefined "], "return_object" : "String" } -Read 'len' bytes of data from the file, and return a String containing those bytes. +Read 'len' bytes of data from the file, and return a String containing those +bytes. -If the end of the file is reached, the String may be smaller than the amount of bytes -requested, or if the file is already at the end, `undefined` is returned. +If the end of the file is reached, the String may be smaller than the amount of +bytes requested, or if the file is already at the end, `undefined` is returned. */ JsVar *jswrap_storagefile_read(JsVar *f, int len) { if (len<0) len=0; @@ -764,8 +757,8 @@ JsVar *jswrap_storagefile_readLine(JsVar *f) { } Return the length of the current file. -This requires Espruino to read the file from scratch, -which is not a fast operation. +This requires Espruino to read the file from scratch, which is not a fast +operation. */ int jswrap_storagefile_getLength(JsVar *f) { // Get name and position of name digit @@ -830,7 +823,8 @@ int jswrap_storagefile_getLength(JsVar *f) { ], "typescript" : "write(data: string): void;" } -Append the given data to a file. You should not attempt to append `"\xFF"` (character code 255). +Append the given data to a file. You should not attempt to append `"\xFF"` +(character code 255). */ void jswrap_storagefile_write(JsVar *f, JsVar *_data) { char mode = (char)jsvGetIntegerAndUnLock(jsvObjectGetChild(f,"mode",0)); diff --git a/src/jswrap_string.c b/src/jswrap_string.c index 9ab1db6770..878dc6083e 100644 --- a/src/jswrap_string.c +++ b/src/jswrap_string.c @@ -27,7 +27,8 @@ } This is the built-in class for Text Strings. -Text Strings in Espruino are not zero-terminated, so you can store zeros in them. +Text Strings in Espruino are not zero-terminated, so you can store zeros in +them. */ /*JSON{ @@ -125,7 +126,8 @@ JsVar *jswrap_string_charAt(JsVar *parent, JsVarInt idx) { ], "return" : ["int32","The integer value of a character in the string"] } -Return the integer value of a single character at the given position in the String. +Return the integer value of a single character at the given position in the +String. Note that this returns 0 not 'NaN' for out of bounds characters */ @@ -303,7 +305,9 @@ JsVar *jswrap_string_match(JsVar *parent, JsVar *subStr) { ], "return" : ["JsVar","This string with `subStr` replaced"] } -Search and replace ONE occurrance of `subStr` with `newSubStr` and return the result. This doesn't alter the original string. Regular expressions not supported. +Search and replace ONE occurrance of `subStr` with `newSubStr` and return the +result. This doesn't alter the original string. Regular expressions not +supported. */ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) { JsVar *str = jsvAsString(parent); @@ -476,9 +480,11 @@ JsVar *jswrap_string_slice(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { ], "return" : ["JsVar","Part of this string from start for len characters"] } -Return an array made by splitting this string up by the separator. eg. ```'1,2,3'.split(',')==['1', '2', '3']``` +Return an array made by splitting this string up by the separator. eg. +```'1,2,3'.split(',')==['1', '2', '3']``` -Regular Expressions can also be used to split strings, eg. `'1a2b3 4'.split(/[^0-9]/)==['1', '2', '3', '4']`. +Regular Expressions can also be used to split strings, eg. `'1a2b3 +4'.split(/[^0-9]/)==['1', '2', '3', '4']`. */ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) { if (!jsvIsString(parent)) return 0; @@ -636,7 +642,8 @@ JsVar *jswrap_string_trim(JsVar *parent) { ], "return" : ["JsVar","The result of appending all arguments to this string"] } -Append all arguments to this `String` and return the result. Does not modify the original `String`. +Append all arguments to this `String` and return the result. Does not modify the +original `String`. */ JsVar *jswrap_string_concat(JsVar *parent, JsVar *args) { if (!jsvIsString(parent)) return 0; diff --git a/src/jswrap_waveform.c b/src/jswrap_waveform.c index f01bf9711e..c76f6757ea 100644 --- a/src/jswrap_waveform.c +++ b/src/jswrap_waveform.c @@ -29,7 +29,8 @@ "ifndef" : "SAVE_ON_FLASH", "class" : "Waveform" } -This class handles waveforms. In Espruino, a Waveform is a set of data that you want to input or output. +This class handles waveforms. In Espruino, a Waveform is a set of data that you +want to input or output. */ static JsVar *jswrap_waveform_getBuffer(JsVar *waveform, int bufferNumber, bool *is16Bit) { @@ -145,9 +146,13 @@ void jswrap_waveform_kill() { // be sure to remove all waveforms... ], "return" : ["JsVar","An Waveform object"] } -Create a waveform class. This allows high speed input and output of waveforms. It has an internal variable called `buffer` (as well as `buffer2` when double-buffered - see `options` below) which contains the data to input/output. +Create a waveform class. This allows high speed input and output of waveforms. +It has an internal variable called `buffer` (as well as `buffer2` when +double-buffered - see `options` below) which contains the data to input/output. -When double-buffered, a 'buffer' event will be emitted each time a buffer is finished with (the argument is that buffer). When the recording stops, a 'finish' event will be emitted (with the first argument as the buffer). +When double-buffered, a 'buffer' event will be emitted each time a buffer is +finished with (the argument is that buffer). When the recording stops, a +'finish' event will be emitted (with the first argument as the buffer). */ JsVar *jswrap_waveform_constructor(int samples, JsVar *options) { if (samples<=0) { @@ -253,7 +258,9 @@ static void jswrap_waveform_start(JsVar *waveform, Pin pin, JsVarFloat freq, JsV ["options","JsVar","Optional options struct `{time:float,repeat:bool}` where: `time` is the that the waveform with start output at, e.g. `getTime()+1` (otherwise it is immediate), `repeat` is a boolean specifying whether to repeat the give sample"] ] } -Will start outputting the waveform on the given pin - the pin must have previously been initialised with analogWrite. If not repeating, it'll emit a `finish` event when it is done. +Will start outputting the waveform on the given pin - the pin must have +previously been initialised with analogWrite. If not repeating, it'll emit a +`finish` event when it is done. */ void jswrap_waveform_startOutput(JsVar *waveform, Pin pin, JsVarFloat freq, JsVar *options) { jswrap_waveform_start(waveform, pin, freq, options, true/*write*/); @@ -271,7 +278,8 @@ void jswrap_waveform_startOutput(JsVar *waveform, Pin pin, JsVarFloat freq, JsVa ["options","JsVar","Optional options struct `{time:float,repeat:bool}` where: `time` is the that the waveform with start output at, e.g. `getTime()+1` (otherwise it is immediate), `repeat` is a boolean specifying whether to repeat the give sample"] ] } -Will start inputting the waveform on the given pin that supports analog. If not repeating, it'll emit a `finish` event when it is done. +Will start inputting the waveform on the given pin that supports analog. If not +repeating, it'll emit a `finish` event when it is done. */ void jswrap_waveform_startInput(JsVar *waveform, Pin pin, JsVarFloat freq, JsVar *options) { // Setup analog, and also bail out on failure diff --git a/targets/esp32/jswrap_esp32.c b/targets/esp32/jswrap_esp32.c index ca393df14f..d32212b6ab 100644 --- a/targets/esp32/jswrap_esp32.c +++ b/targets/esp32/jswrap_esp32.c @@ -38,7 +38,8 @@ "class" : "ESP32", "ifdef" : "ESP32" } -Class containing utility functions for the [ESP32](http://www.espruino.com/ESP32) +Class containing utility functions for the +[ESP32](http://www.espruino.com/ESP32) */ /*JSON{ @@ -95,13 +96,14 @@ void jswrap_ESP32_deepSleep(int us) { "generate" : "jswrap_ESP32_getState", "return" : ["JsVar", "The state of the ESP32"] } -Returns an object that contains details about the state of the ESP32 with the following fields: +Returns an object that contains details about the state of the ESP32 with the +following fields: -* `sdkVersion` - Version of the SDK. -* `freeHeap` - Amount of free heap in bytes. -* `BLE` - Status of BLE, enabled if true. -* `Wifi` - Status of Wifi, enabled if true. -* `minHeap` - Minimum heap, calculated by heap_caps_get_minimum_free_size +* `sdkVersion` - Version of the SDK. +* `freeHeap` - Amount of free heap in bytes. +* `BLE` - Status of BLE, enabled if true. +* `Wifi` - Status of Wifi, enabled if true. +* `minHeap` - Minimum heap, calculated by heap_caps_get_minimum_free_size */ JsVar *jswrap_ESP32_getState() { @@ -144,8 +146,8 @@ void jswrap_ESP32_setBLE_Debug(int level){ ], "ifdef" : "BLUETOOTH" } -Switches Bluetooth off/on, removes saved code from Flash, resets the board, -and on restart creates jsVars depending on available heap (actual additional 1800) +Switches Bluetooth off/on, removes saved code from Flash, resets the board, and +on restart creates jsVars depending on available heap (actual additional 1800) */ void jswrap_ESP32_enableBLE(bool enable){ //may be later, we will support BLEenable(ALL/SERVER/CLIENT) ESP32_Set_NVS_Status(ESP_NETWORK_BLE,enable); @@ -163,8 +165,8 @@ void jswrap_ESP32_enableBLE(bool enable){ //may be later, we will support BLEena ["enable", "bool", "switches Wifi on or off" ] ] } -Switches Wifi off/on, removes saved code from Flash, resets the board, -and on restart creates jsVars depending on available heap (actual additional 3900) +Switches Wifi off/on, removes saved code from Flash, resets the board, and on +restart creates jsVars depending on available heap (actual additional 3900) */ void jswrap_ESP32_enableWifi(bool enable){ //may be later, we will support BLEenable(ALL/SERVER/CLIENT) ESP32_Set_NVS_Status(ESP_NETWORK_WIFI,enable); diff --git a/targets/esp8266/jswrap_esp8266.c b/targets/esp8266/jswrap_esp8266.c index d0c3b5d54d..8566637c89 100644 --- a/targets/esp8266/jswrap_esp8266.c +++ b/targets/esp8266/jswrap_esp8266.c @@ -40,7 +40,8 @@ typedef long long int64_t; "class" : "ESP8266", "ifdef" : "ESP8266" } -Class containing utility functions for the [ESP8266](http://www.espruino.com/EspruinoESP8266) +Class containing utility functions for the +[ESP8266](http://www.espruino.com/EspruinoESP8266) */ // ESP8266.reboot @@ -72,9 +73,11 @@ void jswrap_ESP8266_reboot() { "generate" : "jswrap_ESP8266_getResetInfo", "return" : ["JsVar","An object with the reset cause information"] } -At boot time the esp8266's firmware captures the cause of the reset/reboot. This function returns this information in an object with the following fields: +At boot time the esp8266's firmware captures the cause of the reset/reboot. This +function returns this information in an object with the following fields: -* `reason`: "power on", "wdt reset", "exception", "soft wdt", "restart", "deep sleep", or "reset pin" +* `reason`: "power on", "wdt reset", "exception", "soft wdt", "restart", "deep + sleep", or "reset pin" * `exccause`: exception cause * `epc1`, `epc2`, `epc3`: instruction pointers * `excvaddr`: address being accessed @@ -108,7 +111,9 @@ JsVar *jswrap_ESP8266_getResetInfo() { ["enable", "bool", "Enable or disable the debug logging."] ] } -Enable or disable the logging of debug information. A value of `true` enables debug logging while a value of `false` disables debug logging. Debug output is sent to UART1 (gpio2). +Enable or disable the logging of debug information. A value of `true` enables +debug logging while a value of `false` disables debug logging. Debug output is +sent to UART1 (gpio2). */ void jswrap_ESP8266_logDebug(bool enable) { os_printf("ESP8266.logDebug, enable=%d\n", enable); @@ -125,7 +130,8 @@ void jswrap_ESP8266_logDebug(bool enable) { ["mode", "int", "Debug log mode: 0=off, 1=in-memory only, 2=in-mem and uart0, 3=in-mem and uart1."] ] } -Set the debug logging mode. It can be disabled (which frees ~1.2KB of heap), enabled in-memory only, or in-memory and output to a UART. +Set the debug logging mode. It can be disabled (which frees ~1.2KB of heap), +enabled in-memory only, or in-memory and output to a UART. */ void jswrap_ESP8266_setLog(int mode) { os_printf("ESP8266 setLog, mode=%d\n", mode); @@ -171,7 +177,8 @@ Returns one line from the log or up to 128 characters. "name" : "dumpSocketInfo", "generate" : "jswrap_ESP8266_dumpSocketInfo" } -Dumps info about all sockets to the log. This is for troubleshooting the socket implementation. +Dumps info about all sockets to the log. This is for troubleshooting the socket +implementation. */ void jswrap_ESP8266_dumpSocketInfo(void) { esp8266_dumpAllSocketData(); @@ -189,11 +196,12 @@ void jswrap_ESP8266_dumpSocketInfo(void) { ["freq", "JsVar", "Desired frequency - either 80 or 160."] ] } -**Note:** This is deprecated. Use `E.setClock(80/160)` -**Note:** -Set the operating frequency of the ESP8266 processor. The default is 160Mhz. +**Note:** This is deprecated. Use `E.setClock(80/160)` **Note:** Set the +operating frequency of the ESP8266 processor. The default is 160Mhz. -**Warning**: changing the cpu frequency affects the timing of some I/O operations, notably of software SPI and I2C, so things may be a bit slower at 80Mhz. +**Warning**: changing the cpu frequency affects the timing of some I/O +operations, notably of software SPI and I2C, so things may be a bit slower at +80Mhz. */ void jswrap_ESP8266_setCPUFreq( @@ -212,15 +220,17 @@ void jswrap_ESP8266_setCPUFreq( "generate" : "jswrap_ESP8266_getState", "return" : ["JsVar", "The state of the ESP8266"] } -Returns an object that contains details about the state of the ESP8266 with the following fields: +Returns an object that contains details about the state of the ESP8266 with the +following fields: -* `sdkVersion` - Version of the SDK. +* `sdkVersion` - Version of the SDK. * `cpuFrequency` - CPU operating frequency in Mhz. -* `freeHeap` - Amount of free heap in bytes. -* `maxCon` - Maximum number of concurrent connections. -* `flashMap` - Configured flash size&map: '512KB:256/256' .. '4MB:512/512' -* `flashKB` - Configured flash size in KB as integer -* `flashChip` - Type of flash chip as string with manufacturer & chip, ex: '0xEF 0x4016` +* `freeHeap` - Amount of free heap in bytes. +* `maxCon` - Maximum number of concurrent connections. +* `flashMap` - Configured flash size&map: '512KB:256/256' .. '4MB:512/512' +* `flashKB` - Configured flash size in KB as integer +* `flashChip` - Type of flash chip as string with manufacturer & chip, ex: '0xEF + 0x4016` */ JsVar *jswrap_ESP8266_getState() { @@ -331,7 +341,8 @@ JsVar *jswrap_ESP8266_crc32(JsVar *jsData) { ] } -**This function is deprecated.** Please use `require("neopixel").write(pin, data)` instead +**This function is deprecated.** Please use `require("neopixel").write(pin, +data)` instead */ void jswrap_ESP8266_neopixelWrite(Pin pin, JsVar *jsArrayOfData) { jswrap_neopixel_write(pin, jsArrayOfData); @@ -349,12 +360,13 @@ void jswrap_ESP8266_neopixelWrite(Pin pin, JsVar *jsArrayOfData) { ["option", "JsVar", "posible values are 0, 1, 2 or 4"] ] } -Put the ESP8266 into 'deep sleep' for the given number of microseconds, -reducing power consumption drastically. +Put the ESP8266 into 'deep sleep' for the given number of microseconds, reducing +power consumption drastically. meaning of option values: -0 - the 108th Byte of init parameter decides whether RF calibration will be performed or not. +0 - the 108th Byte of init parameter decides whether RF calibration will be +performed or not. 1 - run RF calibration after waking up. Power consumption is high. @@ -362,10 +374,13 @@ meaning of option values: 4 - no RF after waking up. Power consumption is the lowest. -**Note:** unlike normal Espruino boards' 'deep sleep' mode, ESP8266 deep sleep actually turns off the processor. After the given number of microseconds have elapsed, the ESP8266 will restart as if power had been turned off and then back on. *All contents of RAM will be lost*. -Connect GPIO 16 to RST to enable wakeup. +**Note:** unlike normal Espruino boards' 'deep sleep' mode, ESP8266 deep sleep +actually turns off the processor. After the given number of microseconds have +elapsed, the ESP8266 will restart as if power had been turned off and then back +on. *All contents of RAM will be lost*. Connect GPIO 16 to RST to enable wakeup. -**Special:** 0 microseconds cause sleep forever until external wakeup RST pull down occurs. +**Special:** 0 microseconds cause sleep forever until external wakeup RST pull +down occurs. */ void jswrap_ESP8266_deepSleep(JsVar *jsMicros, JsVar *jsOption) { diff --git a/targets/esp8266/jswrap_nodemcu.c b/targets/esp8266/jswrap_nodemcu.c index 9f868c9183..20539aa88a 100644 --- a/targets/esp8266/jswrap_nodemcu.c +++ b/targets/esp8266/jswrap_nodemcu.c @@ -20,7 +20,8 @@ "type" : "class", "class" : "NodeMCU" } -This is a built-in class to allow you to use the ESP8266 NodeMCU boards's pin namings to access pins. It is only available on ESP8266-based boards. +This is a built-in class to allow you to use the ESP8266 NodeMCU boards's pin +namings to access pins. It is only available on ESP8266-based boards. */ // TODO: Sigh - because everyone is using `Pin(..)` now, we can't have a proper 'A0' pin defined because it'd shift all the pins created by`Pin(..)` From 6e73a8ed03ddb9d86a95b1589b2cf82819ff2cc1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 27 Jul 2022 14:54:51 +0100 Subject: [PATCH 0232/1183] First try, using Graphics instance (should move to image) --- libs/banglejs/jswrap_bangle.c | 29 +++++++++++++++ libs/banglejs/jswrap_bangle.h | 1 + libs/graphics/lcd_memlcd.c | 66 +++++++++++++++++++++++++++++++---- libs/graphics/lcd_memlcd.h | 2 ++ 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index c6dddcf2c0..9bc8dea989 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -1957,6 +1957,33 @@ void jswrap_banglejs_setLCDOffset(int y) { #endif } +/*JSON{ + "type" : "staticmethod", + "class" : "Bangle", + "name" : "setLCDOverlay", + "generate" : "jswrap_banglejs_setLCDOverlay", + "params" : [ + ["gfx","JsVar","A Graphics instance"], + ["x","int","The X offset the graphics instance should be overlaid on the screen with"], + ["y","int","The Y offset the graphics instance should be overlaid on the screen with"] + ], + "ifdef" : "BANGLEJS2" +} +Overlay a graphics instance on top of the contents of the graphics buffer. + +This only works on Bangle.js 2 because Bangle.js 1 doesn't have an offscreen buffer accessible from the CPU. +*/ +void jswrap_banglejs_setLCDOverlay(JsVar *gfxVar, int x, int y) { +#ifdef LCD_CONTROLLER_LPM013M126 + lcdMemLCD_setOverlay(gfxVar, x, y); + // set all as modified + graphicsInternal.data.modMinX = 0; + graphicsInternal.data.modMinY = 0; + graphicsInternal.data.modMaxX = LCD_WIDTH-1; + graphicsInternal.data.modMaxY = LCD_HEIGHT-1; +#endif +} + /*JSON{ "type" : "staticmethod", "class" : "Bangle", @@ -3424,6 +3451,8 @@ void jswrap_banglejs_kill() { jshPinWatch(BTN5_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN5_PININDEX,false); #endif + // ensure we remove any overlay we might have set + lcdMemLCD_setOverlay(NULL, 0, 0); // Graphics var is getting removed, so set this to null. jsvUnLock(graphicsInternal.graphicsVar); graphicsInternal.graphicsVar = NULL; diff --git a/libs/banglejs/jswrap_bangle.h b/libs/banglejs/jswrap_bangle.h index 08bb2cb7a7..08ac481adc 100644 --- a/libs/banglejs/jswrap_bangle.h +++ b/libs/banglejs/jswrap_bangle.h @@ -20,6 +20,7 @@ void jswrap_banglejs_setLCDBrightness(JsVarFloat v); void jswrap_banglejs_setLCDMode(JsVar *mode); JsVar *jswrap_banglejs_getLCDMode(); void jswrap_banglejs_setLCDOffset(int y); +void jswrap_banglejs_setLCDOverlay(JsVar *gfxVar, int x, int y); void jswrap_banglejs_setLCDTimeout(JsVarFloat timeout); int jswrap_banglejs_isLCDOn(); void jswrap_banglejs_setLocked(bool isLocked); diff --git a/libs/graphics/lcd_memlcd.c b/libs/graphics/lcd_memlcd.c index 76a12c1d5f..04db2fbfc5 100644 --- a/libs/graphics/lcd_memlcd.c +++ b/libs/graphics/lcd_memlcd.c @@ -24,8 +24,15 @@ #define LCD_ROWHEADER 2 #define LCD_STRIDE (LCD_ROWHEADER+((LCD_WIDTH*LCD_BPP+7)>>3)) // data in required BPP, plus 2 bytes LCD command -unsigned char lcdBuffer[LCD_STRIDE*LCD_HEIGHT +2/*2 bytes end of transfer*/ +4/*allow extra for fast scroll*/]; -bool isBacklightOn; +/** Buffer for our LCD data. + - We add one extra line (LCD_HEIGHT+1) as a scratch area for doing the overlay + - 2 bytes at end of transfer (needed by LCD) included in that extra line + - 4 bytes at end (needed to allow fast scrolling) also handled by the extra line + */ +unsigned char lcdBuffer[LCD_STRIDE*(LCD_HEIGHT+1)]; +bool isBacklightOn; ///< is LCD backlight on? If so we need to toggle EXTCOMIN faster +JsVar *lcdOverlayGraphics; ///< if set, a Graphics instance to use for overlays +unsigned char lcdOverlayX,lcdOverlayY; ///< coordinates of the graphics instance #ifdef EMULATED bool EMSCRIPTEN_GFX_CHANGED; @@ -160,7 +167,6 @@ void lcdMemLCD_scroll(struct JsGraphics *gfx, int xdir, int ydir, int x1, int y1 } // ----------------------------------------------------------------------------- - void lcdMemLCD_flip(JsGraphics *gfx) { if (gfx->data.modMinY > gfx->data.modMaxY) return; // nothing to do! @@ -168,10 +174,44 @@ void lcdMemLCD_flip(JsGraphics *gfx) { int y2 = gfx->data.modMaxY; int l = 1+y2-y1; + bool hasOverlay = false; + JsGraphics overlayGfx; + if (lcdOverlayGraphics) + hasOverlay = graphicsGetFromVar(&overlayGfx, lcdOverlayGraphics); + jshPinSetValue(LCD_SPI_CS, 1); - //jshDelayMicroseconds(10000); - jshSPISendMany(LCD_SPI, &lcdBuffer[LCD_STRIDE*y1], NULL, (l*LCD_STRIDE)+2, NULL); - //jshDelayMicroseconds(10000); + if (hasOverlay) { + /* If lcdOverlayGraphics is defined, we want to overlay this graphics + * instance on top of what we have in our LCD buffer. Do this line by + * line. It's slower but it won't use a bunch of memory. + * + * We use an extra line added to the end of lcdBuffer for this, which + * allows us to use lcdMemLCD_setPixel to do color conversion and dither + * without loads of duplicate code. + * + * Optimisation: we could just send any non-overlaid stuff above or below + * the overlay... + */ + unsigned char *buf = &lcdBuffer[LCD_STRIDE*LCD_HEIGHT]; // point to line right on the end of gfx + for (int y=y1;y<=y2;y++) { + // copy original line in + memcpy(buf, &lcdBuffer[LCD_STRIDE*y], LCD_STRIDE); + // overwrite areas with overlay + if (y>=lcdOverlayY && ydata.modMaxX = -32768; @@ -230,6 +270,20 @@ void lcdMemLCD_extcominBacklight(bool isOn) { } } +// Enable overlay mode (to overlay a graphics instance on top of the LCD contents) +void lcdMemLCD_setOverlay(JsVar *gfxVar, int x, int y) { + if (lcdOverlayGraphics) jsvUnLock(lcdOverlayGraphics); + if (gfxVar) { + lcdOverlayGraphics = jsvLockAgain(gfxVar); + lcdOverlayX = (unsigned char)x; + lcdOverlayY = (unsigned char)y; + } else { + lcdOverlayGraphics = 0; + lcdOverlayX = 0; + lcdOverlayY = 0; + } +} + void lcdMemLCD_setCallbacks(JsGraphics *gfx) { gfx->setPixel = lcdMemLCD_setPixel; #if LCD_BPP==3 diff --git a/libs/graphics/lcd_memlcd.h b/libs/graphics/lcd_memlcd.h index 3b3da63afc..9199c1c2e6 100644 --- a/libs/graphics/lcd_memlcd.h +++ b/libs/graphics/lcd_memlcd.h @@ -23,3 +23,5 @@ void lcdMemLCD_cmd(int cmd, int dataLen, const char *data); // to send specific void lcdMemLCD_extcominToggle(); /// If backlight is on, we need to raise EXTCOMIN freq (use HW PWM) void lcdMemLCD_extcominBacklight(bool isOn); +// Enable overlay mode (to overlay a graphics instance on top of the LCD contents) +void lcdMemLCD_setOverlay(JsVar *gfxVar, int x, int y); From 0ff89a939ae51a679c3713d0bbb24d089cf42bfa Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 16:23:58 +0200 Subject: [PATCH 0233/1183] More typos --- libs/bluetooth/jswrap_bluetooth.c | 16 ++++++++-------- libs/microbit/jswrap_microbit.c | 6 +++--- libs/network/jswrap_wifi.c | 6 +++--- libs/network/wiznet/jswrap_wiznet.c | 7 +++---- src/jswrap_date.c | 10 +++++----- src/jswrap_functions.c | 2 +- src/jswrap_io.c | 12 ++++++------ src/jswrap_process.c | 4 ++-- src/jswrap_serial.c | 14 +++++++------- src/jswrap_spi_i2c.c | 4 ++-- src/jswrap_storage.c | 14 +++++++------- src/jswrap_string.c | 10 +++++----- targets/esp8266/jswrap_nodemcu.c | 2 +- 13 files changed, 53 insertions(+), 54 deletions(-) diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 3ef747cc11..37ed5b1fce 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -615,7 +615,7 @@ void jswrap_ble_restart(JsVar *callback) { } Get this device's default Bluetooth MAC address. -For Puck.js, the last 5 characters of this (eg. `ee:ff`) are used in the +For Puck.js, the last 5 characters of this (e.g. `ee:ff`) are used in the device's advertised Bluetooth name. */ JsVar *jswrap_ble_getAddress() { @@ -826,7 +826,7 @@ NRF.setAdvertising({},{ ``` If you're using [EspruinoHub](https://github.com/espruino/EspruinoHub) then it -will automatically decode this into the folling MQTT topics: +will automatically decode this into the following MQTT topics: * `/ble/advertise/ma:c_:_a:dd:re:ss/espruino` -> `{"a":10,"b":15}` * `/ble/advertise/ma:c_:_a:dd:re:ss/a` -> `1` @@ -1738,7 +1738,7 @@ bool jswrap_ble_filter_device(JsVar *filters, JsVar *device) { } Start/stop listening for BLE advertising packets within range. Returns a -`BluetoothDevice` for each advertsing packet. **By default this is not an active +`BluetoothDevice` for each advertising packet. **By default this is not an active scan, so Scan Response advertising data is not included (see below)** ``` @@ -2775,7 +2775,7 @@ void jswrap_ble_ancsAction(int uid, bool isPositive) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Get ANCS info for a notification, eg: +Get ANCS info for a notification, e.g.: @@ -3028,9 +3028,9 @@ here, Espruino will pick the FIRST device it finds, or it'll call `catch`. * `filters` - a list of filters that a device must match before it is returned (see below) * `timeout` - the maximum time to scan for in milliseconds (scanning stops when -a match is found. eg. `NRF.requestDevice({ timeout:2000, filters: [ ... ] })` +a match is found. e.g. `NRF.requestDevice({ timeout:2000, filters: [ ... ] })` * `active` - whether to perform active scanning (requesting 'scan response' -packets from any devices that are found). eg. `NRF.requestDevice({ active:true, +packets from any devices that are found). e.g. `NRF.requestDevice({ active:true, filters: [ ... ] })` * `phy` - (NRF52840 only) use the long-range coded phy (`"1mbps"` default, can be `"1mbps/2mbps/both/coded"`) @@ -3269,7 +3269,7 @@ void jswrap_ble_setWhitelist(bool whitelist) { ] } When connected, Bluetooth LE devices communicate at a set interval. Lowering the -interval (eg. more packets/second) means a lower delay when sending data, higher +interval (e.g. more packets/second) means a lower delay when sending data, higher bandwidth, but also more power consumption. By default, when connected as a peripheral Espruino automatically adjusts the @@ -3358,7 +3358,7 @@ NRF.setSecurity({passkey:"123456", mitm:1, display:1}); ``` However, while most devices will request a passkey for pairing at this point it -is still possible for a device to connect without requiring one (eg. using the +is still possible for a device to connect without requiring one (e.g. using the 'NRF Connect' app). diff --git a/libs/microbit/jswrap_microbit.c b/libs/microbit/jswrap_microbit.c index 4987c9879e..f7096f7fe4 100644 --- a/libs/microbit/jswrap_microbit.c +++ b/libs/microbit/jswrap_microbit.c @@ -230,11 +230,11 @@ Show an image on the in-built 5x5 LED screen. Image can be: -* A number where each bit represents a pixel (so 25 bits). eg. `5` or +* A number where each bit represents a pixel (so 25 bits). e.g. `5` or `0x1FFFFFF` -* A string, eg: `show("10001")`. Newlines are ignored, and anything that is not +* A string, e.g: `show("10001")`. Newlines are ignored, and anything that is not a space or `0` is treated as a 1. -* An array of 4 bytes (more will be ignored), eg `show([1,2,3,0])` +* An array of 4 bytes (more will be ignored), e.g `show([1,2,3,0])` For instance the following works for images: diff --git a/libs/network/jswrap_wifi.c b/libs/network/jswrap_wifi.c index 3dd0983741..bc6737a958 100644 --- a/libs/network/jswrap_wifi.c +++ b/libs/network/jswrap_wifi.c @@ -235,7 +235,7 @@ passed as parameters. Put differently, if the passed SSID and password are identical to the currently connected AP then nothing is changed. When the connection attempt completes the callback function is invoked with one `err` parameter, which is NULL if there is no error and a string message if there is -an error. If DHCP is enabled the callback occurs once an IP addres has been +an error. If DHCP is enabled the callback occurs once an IP address has been obtained, if a static IP is set the callback occurs once the AP's network has been joined. The callback is also invoked if a connection already exists and does not need to be changed. @@ -568,7 +568,7 @@ connecting to an access point. ["callback", "JsVar", "An optional `callback()` function to be called back when the hostname is set"] ] } -Set the hostname. Depending on implemenation, the hostname is sent with every +Set the hostname. Depending on implementation, the hostname is sent with every DHCP request and is broadcast via mDNS. The DHCP hostname may be visible in the access point and may be forwarded into DNS as hostname.local. If a DHCP lease currently exists changing the hostname will cause a disconnect and reconnect in @@ -667,6 +667,6 @@ Switch to using a higher communication speed with the WiFi module. * `true` = 921600 baud * `false` = 115200 -* `1843200` (or any number) = use a specific baud rate. * eg. +* `1843200` (or any number) = use a specific baud rate. * e.g. `wifi.turbo(true,callback)` or `wifi.turbo(1843200,callback)` */ diff --git a/libs/network/wiznet/jswrap_wiznet.c b/libs/network/wiznet/jswrap_wiznet.c index c7c72362c3..ecb3116289 100644 --- a/libs/network/wiznet/jswrap_wiznet.c +++ b/libs/network/wiznet/jswrap_wiznet.c @@ -334,10 +334,9 @@ bool jswrap_ethernet_setIP(JsVar *wlanObj, JsVar *options, JsVar *callback) { ], "return" : ["bool","True on success"] } -Set hostname allow to set the hosname used during the dhcp request. min 8 and -max 12 char, best set before calling `eth.setIP()` Default is WIZnet010203, -010203 is the default nic as part of the mac. Best to set the hosname before -calling setIP(). +Set hostname used during the DHCP request. Minimum 8 and maximum 12 characters, +best set before calling `eth.setIP()`. Default is WIZnet010203, 010203 is the +default nic as part of the mac. */ bool jswrap_ethernet_setHostname(JsVar *wlanObj, JsVar *jsHostname, JsVar *callback){ NOT_USED(wlanObj); diff --git a/src/jswrap_date.c b/src/jswrap_date.c index 621483f26d..913bfe4ef4 100644 --- a/src/jswrap_date.c +++ b/src/jswrap_date.c @@ -477,7 +477,7 @@ int jswrap_date_getMonth(JsVar *parent) { "generate" : "jswrap_date_getFullYear", "return" : ["int32",""] } -The year, eg. 2014 +The year, e.g. 2014 */ int jswrap_date_getFullYear(JsVar *parent) { return getCalendarDateFromDateVar(parent, false/*system timezone*/).year; @@ -675,7 +675,7 @@ JsVarFloat jswrap_date_setFullYear(JsVar *parent, int yearValue, JsVar *monthVal "return" : ["JsVar","A String"], "typescript" : "toString(): string;" } -Converts to a String, eg: `Fri Jun 20 2014 14:52:20 GMT+0000` +Converts to a String, e.g: `Fri Jun 20 2014 14:52:20 GMT+0000` **Note:** This uses whatever timezone was set with `E.setTimeZone()` or `E.setDST()` @@ -706,7 +706,7 @@ JsVar *jswrap_date_toString(JsVar *parent) { "return" : ["JsVar","A String"], "typescript" : "toUTCString(): string;" } -Converts to a String, eg: `Fri, 20 Jun 2014 14:52:20 GMT` +Converts to a String, e.g: `Fri, 20 Jun 2014 14:52:20 GMT` **Note:** This always assumes a timezone of GMT */ @@ -725,7 +725,7 @@ JsVar *jswrap_date_toUTCString(JsVar *parent) { "return" : ["JsVar","A String"], "typescript" : "toISOString(): string;" } -Converts to a ISO 8601 String, eg: `2014-06-20T14:52:20.123Z` +Converts to a ISO 8601 String, e.g: `2014-06-20T14:52:20.123Z` **Note:** This always assumes a timezone of GMT */ @@ -754,7 +754,7 @@ JsVar *jswrap_date_toISOString(JsVar *parent) { "return" : ["JsVar","A String"], "typescript" : "toLocalISOString(): string;" } -Converts to a ISO 8601 String (with timezone information), eg: +Converts to a ISO 8601 String (with timezone information), e.g: `2014-06-20T14:52:20.123-0500` */ JsVar *jswrap_date_toLocalISOString(JsVar *parent) { diff --git a/src/jswrap_functions.c b/src/jswrap_functions.c index 2638488f8d..e74801c4a2 100644 --- a/src/jswrap_functions.c +++ b/src/jswrap_functions.c @@ -217,7 +217,7 @@ JsVarFloat jswrap_parseFloat(JsVar *v) { ], "return" : ["bool","True is the value is a Finite number, false if not."] } -Is the parameter a finite num,ber or not? If needed, the parameter is first +Is the parameter a finite number or not? If needed, the parameter is first converted to a number. */ bool jswrap_isFinite(JsVar *v) { diff --git a/src/jswrap_io.c b/src/jswrap_io.c index aa54b0c1cf..49739a581c 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -158,7 +158,7 @@ void jswrap_io_poke(JsVarInt addr, JsVar *data, int wordSize) { ], "return" : ["float","The analog Value of the Pin between 0 and 1"] } -Get the analog value of the given pin +Get the analogue value of the given pin This is different to Arduino which only returns an integer between 0 and 1023 @@ -181,7 +181,7 @@ Set the analog Value of a pin. It will be output using PWM. Objects can contain: -* `freq` - pulse frequency in Hz, eg. ```analogWrite(A0,0.5,{ freq : 10 });``` - +* `freq` - pulse frequency in Hz, e.g. ```analogWrite(A0,0.5,{ freq : 10 });``` - specifying a frequency will force PWM output, even if the pin has a DAC * `soft` - boolean, If true software PWM is used if hardware is not available. * `forceSoft` - boolean, If true software PWM is used even if hardware PWM or a @@ -219,7 +219,7 @@ hardware timer to produce accurate pulses, and returns immediately (before the pulse has finished). Use `digitalPulse(A0,1,0)` to wait until a previous pulse has finished. -eg. `digitalPulse(A0,1,5);` pulses A0 high for 5ms. +e.g. `digitalPulse(A0,1,5);` pulses A0 high for 5ms. `digitalPulse(A0,1,[5,2,4]);` pulses A0 high for 5ms, low for 2ms, and high for 4ms @@ -285,7 +285,7 @@ Set the digital value of the given pin. **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"output"` -If pin argument is an array of pins (eg. `[A2,A1,A0]`) the value argument will +If pin argument is an array of pins (e.g. `[A2,A1,A0]`) the value argument will be treated as an array of bits where the last array element is the least significant bit. @@ -343,7 +343,7 @@ Get the digital value of the given pin. **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"input"` -If the pin argument is an array of pins (eg. `[A2,A1,A0]`) the value returned +If the pin argument is an array of pins (e.g. `[A2,A1,A0]`) the value returned will be an number where the last array element is the least significant bit, for example if `A0=A1=1` and `A2=0`, `digitalRead([A2,A1,A0]) == 0b011` @@ -705,7 +705,7 @@ will happen on both edges and there will be no debouncing. pin's state to `"input"` **Note:** The STM32 chip (used in the [Espruino Board](/EspruinoBoard) and -[Pico](/Pico)) cannot watch two pins with the same number - eg `A0` and `B0`. +[Pico](/Pico)) cannot watch two pins with the same number - e.g. `A0` and `B0`. **Note:** On nRF52 chips (used in Puck.js, Pixl.js, MDBT42Q) `setWatch` disables the GPIO output on that pin. In order to be able to write to the pin again you diff --git a/src/jswrap_process.c b/src/jswrap_process.c index 4fdb3427d0..7b1e010000 100644 --- a/src/jswrap_process.c +++ b/src/jswrap_process.c @@ -37,7 +37,7 @@ This class contains information about Espruino itself "name" : "uncaughtException", "params" : [["exception","JsVar","The uncaught exception"]] } -This event is called when an exception gets thrown and isn't caught (eg. it gets +This event is called when an exception gets thrown and isn't caught (e.g. it gets all the way back to the event loop). You can use this for logging potential problems that might occur during @@ -106,7 +106,7 @@ Returns an Object containing various pre-defined variables. * `VERSION` - is the Espruino version * `GIT_COMMIT` - is Git commit hash this firmware was built from -* `BOARD` - the board's ID (eg. `PUCKJS`) +* `BOARD` - the board's ID (e.g. `PUCKJS`) * `RAM` - total amount of on-chip RAM in bytes * `FLASH` - total amount of on-chip flash memory in bytes * `SPIFLASH` - (on Bangle.js) total amount of off-chip flash memory in bytes diff --git a/src/jswrap_serial.c b/src/jswrap_serial.c index ad9ca0ee29..d55dc3af9b 100644 --- a/src/jswrap_serial.c +++ b/src/jswrap_serial.c @@ -72,7 +72,7 @@ errors:true });` **Note:** Even though there was an error, the byte will still be received and passed to the `data` handler. -**Note:** This only works on STM32 and NRF52 based devices (eg. all official +**Note:** This only works on STM32 and NRF52 based devices (e.g. all official Espruino boards) */ /*JSON{ @@ -89,7 +89,7 @@ errors:true });` **Note:** Even though there was an error, the byte will still be received and passed to the `data` handler. -**Note:** This only works on STM32 and NRF52 based devices (eg. all official +**Note:** This only works on STM32 and NRF52 based devices (e.g. all official Espruino boards) */ // this is created in jsiIdle based on EV_SERIALx_STATUS ecents @@ -104,7 +104,7 @@ Espruino boards) ], "return" : ["JsVar","An object of type `Serial`, or `undefined` if one couldn't be found."] } -Try and find a USART (Serial) hardware device that will work on this pin (eg. +Try and find a USART (Serial) hardware device that will work on this pin (e.g. `Serial1`) May return undefined if no device can be found. @@ -233,7 +233,7 @@ void jswrap_serial_setConsole(JsVar *parent, bool force) { } Setup this Serial port with the given baud rate and options. -eg. +e.g. ``` Serial1.setup(9600,{rx:a_pin, tx:a_pin}); @@ -426,7 +426,7 @@ void _jswrap_serial_print(JsVar *parent, JsVar *arg, bool isPrint, bool newLine) } Print a string to the serial port - without a line feed - **Note:** This function replaces any occurances of `\n` in the string with + **Note:** This function replaces any occurrences of `\n` in the string with `\r\n`. To avoid this, use `Serial.write`. */ /*JSON{ @@ -440,7 +440,7 @@ Print a string to the serial port - without a line feed } Print a line to the serial port with a newline (`\r\n`) at the end of it. - **Note:** This function converts data to a string first, eg + **Note:** This function converts data to a string first, e.g. `Serial.print([1,2,3])` is equivalent to `Serial.print("1,2,3"). If you'd like to write raw bytes, use `Serial.write`. */ @@ -461,7 +461,7 @@ void jswrap_serial_println(JsVar *parent, JsVar *str) { } Write a character or array of data to the serial port -This method writes unmodified data, eg `Serial.write([1,2,3])` is equivalent to +This method writes unmodified data, e.g. `Serial.write([1,2,3])` is equivalent to `Serial.write("\1\2\3")`. If you'd like data converted to a string first, use `Serial.print`. */ diff --git a/src/jswrap_spi_i2c.c b/src/jswrap_spi_i2c.c index 1d42aa16f0..429fdf4fc2 100644 --- a/src/jswrap_spi_i2c.c +++ b/src/jswrap_spi_i2c.c @@ -79,7 +79,7 @@ JsVar *jswrap_spi_constructor() { ], "return" : ["JsVar","An object of type `SPI`, or `undefined` if one couldn't be found."] } -Try and find an SPI hardware device that will work on this pin (eg. `SPI1`) +Try and find an SPI hardware device that will work on this pin (e.g. `SPI1`) May return undefined if no device can be found. */ @@ -541,7 +541,7 @@ JsVar *jswrap_i2c_constructor() { ], "return" : ["JsVar","An object of type `I2C`, or `undefined` if one couldn't be found."] } -Try and find an I2C hardware device that will work on this pin (eg. `I2C1`) +Try and find an I2C hardware device that will work on this pin (e.g. `I2C1`) May return undefined if no device can be found. */ diff --git a/src/jswrap_storage.c b/src/jswrap_storage.c index e571aedc37..b007214ef6 100644 --- a/src/jswrap_storage.c +++ b/src/jswrap_storage.c @@ -58,7 +58,7 @@ simple contiguous files of fixed length. This is the recommended file type. in numbered chunks (`"filename\1"`/`"filename\2"`/etc). It allows data to be appended and for the file to be read line by line. -You must read a file using the same method you used to write it - eg. you can't +You must read a file using the same method you used to write it - e.g. you can't create a file with `require("Storage").open(...)` and then read it with `require("Storage").read(...)`. @@ -317,11 +317,11 @@ require("Storage").list() require("Storage").list(/\.js$/) // All Storage Files require("Storage").list(undefined, {sf:true}) -// All normal files (eg created with Storage.write) +// All normal files (e.g. created with Storage.write) require("Storage").list(undefined, {sf:false}) ``` -**Note:** This will output system files (eg. saved code) as well as files that +**Note:** This will output system files (e.g. saved code) as well as files that you may have written. */ JsVar *jswrap_storage_list(JsVar *regex, JsVar *filter) { @@ -351,10 +351,10 @@ JsVar *jswrap_storage_list(JsVar *regex, JsVar *filter) { "return" : ["int","A hash of the files matching"], "typescript" : "hash(regex: RegExp): number;" } -List all files in the flash storage area matching the specfied regex (ignores +List all files in the flash storage area matching the specified regex (ignores StorageFiles), and then hash their filenames *and* file locations. -Identical files may have different hashes (eg. if Storage is compacted and the +Identical files may have different hashes (e.g. if Storage is compacted and the file moves) but the changes of different files having the same hash are extremely small. @@ -389,7 +389,7 @@ when it is running low on flash, or when `compact` is called. space, however in this case it will not lose data. **Note:** `compact` rearranges the contents of memory. If code is referencing -that memory (eg. functions that have their code stored in flash) then they may +that memory (e.g. functions that have their code stored in flash) then they may become garbled when compaction happens. To avoid this, call `eraseFiles` before uploading data that you intend to reference to ensure that uploaded files are right at the start of flash and cannot be compacted further. @@ -597,7 +597,7 @@ contiguous area to allow them to be accessed easily from Espruino. This presents a challenge for `StorageFile` which allows you to append to a file, so instead `StorageFile` stores files in chunks. It uses the last -character of the filename to denote the chunk number (eg `"foobar\1"`, +character of the filename to denote the chunk number (e.g. `"foobar\1"`, `"foobar\2"`, etc). This means that while `StorageFile` files exist in the same area as those from diff --git a/src/jswrap_string.c b/src/jswrap_string.c index 878dc6083e..eeaa459cc1 100644 --- a/src/jswrap_string.c +++ b/src/jswrap_string.c @@ -231,7 +231,7 @@ Returns `null` if no match, or: ] ``` -'Global' RegEx matches just return an array of matches (with no indices): +'Global' RegExp matches just return an array of matches (with no indices): ``` "abcdefabcdef".match(/bcd/g) = [ @@ -305,7 +305,7 @@ JsVar *jswrap_string_match(JsVar *parent, JsVar *subStr) { ], "return" : ["JsVar","This string with `subStr` replaced"] } -Search and replace ONE occurrance of `subStr` with `newSubStr` and return the +Search and replace ONE occurrence of `subStr` with `newSubStr` and return the result. This doesn't alter the original string. Regular expressions not supported. */ @@ -480,10 +480,10 @@ JsVar *jswrap_string_slice(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { ], "return" : ["JsVar","Part of this string from start for len characters"] } -Return an array made by splitting this string up by the separator. eg. +Return an array made by splitting this string up by the separator. e.g. ```'1,2,3'.split(',')==['1', '2', '3']``` -Regular Expressions can also be used to split strings, eg. `'1a2b3 +Regular Expressions can also be used to split strings, e.g. `'1a2b3 4'.split(/[^0-9]/)==['1', '2', '3', '4']`. */ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) { @@ -757,7 +757,7 @@ JsVar *jswrap_string_repeat(JsVar *parent, int count) { "return" : ["JsVar","A string containing this string padded to the correct length"], "return_object" : "String" } -Pad this string at the beginnind to the required number of characters +Pad this string at the beginning to the required number of characters ``` "Hello".padStart(10) == " Hello" diff --git a/targets/esp8266/jswrap_nodemcu.c b/targets/esp8266/jswrap_nodemcu.c index 20539aa88a..947b17fd90 100644 --- a/targets/esp8266/jswrap_nodemcu.c +++ b/targets/esp8266/jswrap_nodemcu.c @@ -20,7 +20,7 @@ "type" : "class", "class" : "NodeMCU" } -This is a built-in class to allow you to use the ESP8266 NodeMCU boards's pin +This is a built-in class to allow you to use the ESP8266 NodeMCU boards' pin namings to access pins. It is only available on ESP8266-based boards. */ From 840320db695ddb5f9698d6ee26d2ae632e4b02d1 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 16:30:11 +0200 Subject: [PATCH 0234/1183] =?UTF-8?q?Allow=20=E2=80=98build=5Ftypes?= =?UTF-8?q?=E2=80=99=20script=20to=20work=20from=20anywhere?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 13ebfa2403..ba3de02392 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -489,7 +489,7 @@ function buildTypes() { buildTypes().then((content) => require("fs").writeFileSync( - "../BangleApps/typescript/types/main.d.ts", + __dirname + "/../../BangleApps/typescript/types/main.d.ts", content ) ); From d6d37dfb2e839936fe72f31da3e5917139ed4716 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 27 Jul 2022 15:58:22 +0100 Subject: [PATCH 0235/1183] Bangle.js2: Added `Bangle.setLCDOverlay(img,x,y)` to allow an image to be overlaid on top of screen contents (eg for notifications) --- ChangeLog | 7 ++- libs/banglejs/jswrap_bangle.c | 12 ++-- libs/banglejs/jswrap_bangle.h | 2 +- libs/graphics/jswrap_graphics.c | 40 +------------- libs/graphics/jswrap_graphics.h | 54 +++++++++++++++++- libs/graphics/lcd_memlcd.c | 98 +++++++++++++++++++++------------ libs/graphics/lcd_memlcd.h | 4 +- 7 files changed, 133 insertions(+), 84 deletions(-) diff --git a/ChangeLog b/ChangeLog index deb7df0293..fa6eb4b5c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,11 +17,12 @@ Bangle.js: Add "filename table" support to Bangle.js - avoids slow file read/list when there are many deleted/updated files in Storage (fix #2152) Storage: Don't align files <512 bytes to page boundaries - all files now stored in order (ref #2232) nRF5x: Call sd_ble_gattc_hv_confirm in response to BLE indications - Bangle.js 2: Make Bangle.setBarometerPower retry twice if it has an I2C error - Bangle.js 2: Fix `NRF.setAdvertising({},{scannable:false})` - Bangle.js 2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) + Bangle.js2: Make Bangle.setBarometerPower retry twice if it has an I2C error + Bangle.js2: Fix `NRF.setAdvertising({},{scannable:false})` + Bangle.js2: Initial long range functionality (via `phy:"coded"` in `NRF.setAdvertising/setScan/requestDevice/findDevices`) nRF52: Change from hard -> softfp calling convention (saves a few bytes, more compatible with compiled code) Fix 'console.log([1,2,3].splice(0, 1.0))' (fix #2245) + Bangle.js2: Added `Bangle.setLCDOverlay(img,x,y)` to allow an image to be overlaid on top of screen contents (eg for notifications) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 9bc8dea989..fb6e570a34 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -388,7 +388,7 @@ or smaller than 0. Coordinates from the `touch` event are clipped. "class" : "Bangle", "name" : "stroke", "params" : [["event","JsVar","Object of form `{xy:Uint8Array([x1,y1,x2,y2...])}` containing touch coordinates"]], - "ifdef" : "BANGLEJS2" + "ifdef" : "BANGLEJS_Q3" } Emitted when the touchscreen is dragged for a large enough distance to count as a gesture. @@ -1963,19 +1963,19 @@ void jswrap_banglejs_setLCDOffset(int y) { "name" : "setLCDOverlay", "generate" : "jswrap_banglejs_setLCDOverlay", "params" : [ - ["gfx","JsVar","A Graphics instance"], + ["img","JsVar","An image"], ["x","int","The X offset the graphics instance should be overlaid on the screen with"], ["y","int","The Y offset the graphics instance should be overlaid on the screen with"] ], - "ifdef" : "BANGLEJS2" + "ifdef" : "BANGLEJS_Q3" } Overlay a graphics instance on top of the contents of the graphics buffer. This only works on Bangle.js 2 because Bangle.js 1 doesn't have an offscreen buffer accessible from the CPU. */ -void jswrap_banglejs_setLCDOverlay(JsVar *gfxVar, int x, int y) { +void jswrap_banglejs_setLCDOverlay(JsVar *imgVar, int x, int y) { #ifdef LCD_CONTROLLER_LPM013M126 - lcdMemLCD_setOverlay(gfxVar, x, y); + lcdMemLCD_setOverlay(imgVar, x, y); // set all as modified graphicsInternal.data.modMinX = 0; graphicsInternal.data.modMinY = 0; @@ -3451,8 +3451,10 @@ void jswrap_banglejs_kill() { jshPinWatch(BTN5_PININDEX, false, JSPW_NONE); jshSetPinShouldStayWatched(BTN5_PININDEX,false); #endif +#ifdef LCD_CONTROLLER_LPM013M126 // ensure we remove any overlay we might have set lcdMemLCD_setOverlay(NULL, 0, 0); +#endif // Graphics var is getting removed, so set this to null. jsvUnLock(graphicsInternal.graphicsVar); graphicsInternal.graphicsVar = NULL; diff --git a/libs/banglejs/jswrap_bangle.h b/libs/banglejs/jswrap_bangle.h index 08ac481adc..e44e2e5752 100644 --- a/libs/banglejs/jswrap_bangle.h +++ b/libs/banglejs/jswrap_bangle.h @@ -20,7 +20,7 @@ void jswrap_banglejs_setLCDBrightness(JsVarFloat v); void jswrap_banglejs_setLCDMode(JsVar *mode); JsVar *jswrap_banglejs_getLCDMode(); void jswrap_banglejs_setLCDOffset(int y); -void jswrap_banglejs_setLCDOverlay(JsVar *gfxVar, int x, int y); +void jswrap_banglejs_setLCDOverlay(JsVar *imgVar, int x, int y); void jswrap_banglejs_setLCDTimeout(JsVarFloat timeout); int jswrap_banglejs_isLCDOn(); void jswrap_banglejs_setLocked(bool isLocked); diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 8314f84f6b..cf25f425ac 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -82,32 +82,14 @@ const uint16_t PALETTE_4BIT_TO_8BIT[16] = { 0, 43, 129, 172, 121, 78, 12, 18, 23 // ========================================================================================== -/// Info about an image to be used for rendering -typedef struct { - int width, height, bpp; - bool isTransparent; - unsigned int transparentCol; - JsVar *buffer; // must be unlocked! - uint32_t bitmapOffset; // start offset in imageBuffer - const uint16_t *palettePtr; - uint32_t paletteMask; - unsigned int bitMask; - unsigned int pixelsPerByteMask; - int stride; ///< bytes per line - unsigned short headerLength; ///< size of header (inc palette) - unsigned short bitmapLength; ///< size of data (excl header) - - uint16_t _simplePalette[16]; // used when a palette is created for rendering -} GfxDrawImageInfo; - -static void _jswrap_graphics_freeImageInfo(GfxDrawImageInfo *info) { +void _jswrap_graphics_freeImageInfo(GfxDrawImageInfo *info) { jsvUnLock(info->buffer); } /** Parse an image into GfxDrawImageInfo. See drawImage for image format docs. Returns true on success. * if 'image' is a string or ArrayBuffer, imageOffset is the offset within that (usually 0) */ -static bool _jswrap_graphics_parseImage(JsGraphics *gfx, JsVar *image, unsigned int imageOffset, GfxDrawImageInfo *info) { +bool _jswrap_graphics_parseImage(JsGraphics *gfx, JsVar *image, unsigned int imageOffset, GfxDrawImageInfo *info) { memset(info, 0, sizeof(GfxDrawImageInfo)); #ifndef SAVE_ON_FLASH if (jsvIsObject(image) && jsvIsInstanceOf(image,"Graphics")) { @@ -260,24 +242,6 @@ static bool _jswrap_graphics_parseImage(JsGraphics *gfx, JsVar *image, unsigned return true; } - - -/// This is for rotating and scaling layers -typedef struct { - int x1,y1,x2,y2; //x2/y2 is exclusive - double rotate; // radians - double scale; // 1 = 1:1, 2 = big - bool center; // center on x1/y1 (which are then offset) - bool repeat; // tile the image - GfxDrawImageInfo img; - // for rendering - JsvStringIterator it; - int mx,my; //< max - width and height << 8 - int sx,sy; //< iterator X increment - int px,py; //< y iterator position - int qx,qy; //< x iterator position -} GfxDrawImageLayer; - bool _jswrap_drawImageLayerGetPixel(GfxDrawImageLayer *l, unsigned int *result) { int qx = l->qx+127; int qy = l->qy+127; diff --git a/libs/graphics/jswrap_graphics.h b/libs/graphics/jswrap_graphics.h index b4ee70cce5..2fa20e67f0 100644 --- a/libs/graphics/jswrap_graphics.h +++ b/libs/graphics/jswrap_graphics.h @@ -14,6 +14,7 @@ #include "jsvar.h" #include "graphics.h" +#include "jsvariterator.h" #ifdef GRAPHICS_PALETTED_IMAGES // 16 color MAC OS palette @@ -34,7 +35,6 @@ JsVar *jswrap_graphics_createSDL(int width, int height, int bpp); #endif JsVar *jswrap_graphics_createImage(JsVar *data); - int jswrap_graphics_getWidthOrHeight(JsVar *parent, bool height); int jswrap_graphics_getBPP(JsVar *parent); JsVar *jswrap_graphics_reset(JsVar *parent); @@ -87,3 +87,55 @@ JsVar *jswrap_graphics_quadraticBezier(JsVar *parent, JsVar * arr, JsVar *option JsVar *jswrap_graphics_transformVertices(JsVar *parent, JsVar *verts, JsVar *transformation); JsVar *jswrap_graphics_theme(); JsVar *jswrap_graphics_setTheme(JsVar *parent, JsVar *theme); + + +/// Info about an image to be used for rendering +typedef struct { + int width, height, bpp; + bool isTransparent; + unsigned int transparentCol; + JsVar *buffer; // must be unlocked! + uint32_t bitmapOffset; // start offset in imageBuffer + const uint16_t *palettePtr; + uint32_t paletteMask; + unsigned int bitMask; + unsigned int pixelsPerByteMask; + int stride; ///< bytes per line + unsigned short headerLength; ///< size of header (inc palette) + unsigned short bitmapLength; ///< size of data (excl header) + + uint16_t _simplePalette[16]; // used when a palette is created for rendering +} GfxDrawImageInfo; + +void _jswrap_graphics_freeImageInfo(GfxDrawImageInfo *info); + +/** Parse an image into GfxDrawImageInfo. See drawImage for image format docs. Returns true on success. + * if 'image' is a string or ArrayBuffer, imageOffset is the offset within that (usually 0) + */ +bool _jswrap_graphics_parseImage(JsGraphics *gfx, JsVar *image, unsigned int imageOffset, GfxDrawImageInfo *info); + + +/// This is for rotating and scaling layers +typedef struct { + int x1,y1,x2,y2; //x2/y2 is exclusive + double rotate; // radians + double scale; // 1 = 1:1, 2 = big + bool center; // center on x1/y1 (which are then offset) + bool repeat; // tile the image + GfxDrawImageInfo img; + // for rendering + JsvStringIterator it; + int mx,my; //< max - width and height << 8 + int sx,sy; //< iterator X increment + int px,py; //< y iterator position + int qx,qy; //< x iterator position +} GfxDrawImageLayer; + +bool _jswrap_drawImageLayerGetPixel(GfxDrawImageLayer *l, unsigned int *result); +void _jswrap_drawImageLayerInit(GfxDrawImageLayer *l); +void _jswrap_drawImageLayerSetStart(GfxDrawImageLayer *l, int x, int y); +void _jswrap_drawImageLayerStartX(GfxDrawImageLayer *l); +void _jswrap_drawImageLayerNextX(GfxDrawImageLayer *l); +void _jswrap_drawImageLayerNextXRepeat(GfxDrawImageLayer *l); +void _jswrap_drawImageLayerNextY(GfxDrawImageLayer *l); +void _jswrap_drawImageSimple(JsGraphics *gfx, int xPos, int yPos, GfxDrawImageInfo *img, JsvStringIterator *it); diff --git a/libs/graphics/lcd_memlcd.c b/libs/graphics/lcd_memlcd.c index 04db2fbfc5..f706263484 100644 --- a/libs/graphics/lcd_memlcd.c +++ b/libs/graphics/lcd_memlcd.c @@ -17,6 +17,7 @@ #include "jshardware.h" #include "jsinteractive.h" #include "lcd_memlcd.h" +#include "jswrap_graphics.h" // ====================================================================== @@ -25,18 +26,20 @@ #define LCD_STRIDE (LCD_ROWHEADER+((LCD_WIDTH*LCD_BPP+7)>>3)) // data in required BPP, plus 2 bytes LCD command /** Buffer for our LCD data. - - We add one extra line (LCD_HEIGHT+1) as a scratch area for doing the overlay + - We add 2 extra lines (LCD_HEIGHT+2) as a scratch area for doing the overlay (if enabled) - 2 bytes at end of transfer (needed by LCD) included in that extra line - 4 bytes at end (needed to allow fast scrolling) also handled by the extra line */ -unsigned char lcdBuffer[LCD_STRIDE*(LCD_HEIGHT+1)]; +unsigned char lcdBuffer[LCD_STRIDE*(LCD_HEIGHT+2)]; bool isBacklightOn; ///< is LCD backlight on? If so we need to toggle EXTCOMIN faster -JsVar *lcdOverlayGraphics; ///< if set, a Graphics instance to use for overlays +JsVar *lcdOverlayImage; ///< if set, an Image to use for overlays unsigned char lcdOverlayX,lcdOverlayY; ///< coordinates of the graphics instance #ifdef EMULATED bool EMSCRIPTEN_GFX_CHANGED; +unsigned char fakeLCDBuffer[LCD_STRIDE*LCD_HEIGHT]; + bool jsGfxChanged() { bool b = EMSCRIPTEN_GFX_CHANGED; EMSCRIPTEN_GFX_CHANGED = false; @@ -44,7 +47,7 @@ bool jsGfxChanged() { } char *jsGfxGetPtr(int line) { if (line<0 || line>=LCD_HEIGHT) return 0; - return &lcdBuffer[LCD_ROWHEADER + (line*LCD_STRIDE)]; + return &fakeLCDBuffer[LCD_ROWHEADER + (line*LCD_STRIDE)]; } #endif @@ -82,9 +85,6 @@ unsigned int lcdMemLCD_getPixel(JsGraphics *gfx, int x, int y) { void lcdMemLCD_setPixel(JsGraphics *gfx, int x, int y, unsigned int col) { -#ifdef EMULATED - EMSCRIPTEN_GFX_CHANGED = true; -#endif col = lcdMemLCD_convert16to3(col,x,y); #if LCD_BPP==3 int bitaddr = LCD_ROWHEADER*8 + (x*3) + (y*LCD_STRIDE*8); @@ -102,9 +102,6 @@ void lcdMemLCD_setPixel(JsGraphics *gfx, int x, int y, unsigned int col) { #if LCD_BPP==3 void lcdMemLCD_fillRect(struct JsGraphics *gfx, int x1, int y1, int x2, int y2, unsigned int col) { -#ifdef EMULATED - EMSCRIPTEN_GFX_CHANGED = true; -#endif for (int y=y1;y<=y2;y++) { int bitaddr = LCD_ROWHEADER*8 + (x1*3) + (y*LCD_STRIDE*8); for (int x=x1;x<=x2;x++) { @@ -143,9 +140,6 @@ void lcdMemLCD_scrollX(struct JsGraphics *gfx, unsigned char *dst, unsigned char } void lcdMemLCD_scroll(struct JsGraphics *gfx, int xdir, int ydir, int x1, int y1, int x2, int y2) { -#ifdef EMULATED - EMSCRIPTEN_GFX_CHANGED = true; -#endif // if we can't shift entire line in one go, go with the slow method as this case would be a nightmare in 3 bits if (x1!=0 || x2!=LCD_WIDTH-1) return graphicsFallbackScroll(gfx, xdir, ydir, x1,y1,x2,y2); @@ -167,22 +161,29 @@ void lcdMemLCD_scroll(struct JsGraphics *gfx, int xdir, int ydir, int x1, int y1 } // ----------------------------------------------------------------------------- +// used to allow SPI send to work async (we don't care when it finishes) +void lcdMemLCD_flip_spi_callback() {} + +// send the data to the screen void lcdMemLCD_flip(JsGraphics *gfx) { if (gfx->data.modMinY > gfx->data.modMaxY) return; // nothing to do! +#ifdef EMULATED + EMSCRIPTEN_GFX_CHANGED = true; +#endif int y1 = gfx->data.modMinY; int y2 = gfx->data.modMaxY; int l = 1+y2-y1; bool hasOverlay = false; - JsGraphics overlayGfx; - if (lcdOverlayGraphics) - hasOverlay = graphicsGetFromVar(&overlayGfx, lcdOverlayGraphics); + GfxDrawImageInfo overlayImg; + if (lcdOverlayImage) + hasOverlay = _jswrap_graphics_parseImage(gfx, lcdOverlayImage, 0, &overlayImg); jshPinSetValue(LCD_SPI_CS, 1); if (hasOverlay) { - /* If lcdOverlayGraphics is defined, we want to overlay this graphics - * instance on top of what we have in our LCD buffer. Do this line by + /* If lcdOverlayImage is defined, we want to overlay this image + * on top of what we have in our LCD buffer. Do this line by * line. It's slower but it won't use a bunch of memory. * * We use an extra line added to the end of lcdBuffer for this, which @@ -192,25 +193,54 @@ void lcdMemLCD_flip(JsGraphics *gfx) { * Optimisation: we could just send any non-overlaid stuff above or below * the overlay... */ - unsigned char *buf = &lcdBuffer[LCD_STRIDE*LCD_HEIGHT]; // point to line right on the end of gfx + + // initialise image layer + GfxDrawImageLayer l; + l.x1 = 0; + l.y1 = 0; + l.img = overlayImg; + l.rotate = 0; + l.scale = 1; + l.center = false; + l.repeat = false; + jsvStringIteratorNew(&l.it, l.img.buffer, (size_t)l.img.bitmapOffset); + _jswrap_drawImageLayerInit(&l); + _jswrap_drawImageLayerSetStart(&l, 0, 0); for (int y=y1;y<=y2;y++) { + int bufferLine = LCD_HEIGHT + (y&1); // alternate lines so we still get dither AND we can send while + unsigned char *buf = &lcdBuffer[LCD_STRIDE*bufferLine]; // point to line right on the end of gfx // copy original line in memcpy(buf, &lcdBuffer[LCD_STRIDE*y], LCD_STRIDE); - // overwrite areas with overlay - if (y>=lcdOverlayY && y=lcdOverlayY && y Date: Wed, 27 Jul 2022 16:02:09 +0100 Subject: [PATCH 0236/1183] oops - fix merge error --- libs/banglejs/jswrap_bangle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index cd7e69d64a..fb5c745e26 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -481,7 +481,7 @@ the `touch` event are clipped. "class" : "Bangle", "name" : "stroke", "params" : [["event","JsVar","Object of form `{xy:Uint8Array([x1,y1,x2,y2...])}` containing touch coordinates"]], - "ifdef" : "BANGLEJS_Q3" + "ifdef" : "BANGLEJS_Q3", "typescript" : "on(event: \"stroke\", callback: (event: { xy: Uint8Array, stroke?: string }) => void): void;" } Emitted when the touchscreen is dragged for a large enough distance to count as From 27250b62c6c1cbff4afdc68d1384a50b18102606 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:05:03 +0200 Subject: [PATCH 0237/1183] =?UTF-8?q?Don't=20include=20=E2=80=98interface?= =?UTF-8?q?=E2=80=99=20keyword=20in=20declarations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_types.js | 2 +- src/jswrap_array.c | 2 +- src/jswrap_promise.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index ba3de02392..9597e29be1 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -324,7 +324,7 @@ function getBuiltinClassDeclaration(name, c, types) { `\n}\n\n` + (name.endsWith("Array") && !name.startsWith("Array") // is a typed array? ? `type ${name} = ArrayBufferView<${name}>;\n` - : `${c.object?.typescript || "interface " + name} {\n` + + : `interface ${c.object?.typescript || name} {\n` + indent( c.prototype .map((property) => diff --git a/src/jswrap_array.c b/src/jswrap_array.c index c92f93df8f..c5c6651a0c 100644 --- a/src/jswrap_array.c +++ b/src/jswrap_array.c @@ -25,7 +25,7 @@ "type" : "class", "class" : "Array", "check" : "jsvIsArray(var)", - "typescript" : "interface Array" + "typescript" : "Array" } This is the built-in JavaScript class for arrays. diff --git a/src/jswrap_promise.c b/src/jswrap_promise.c index 0722bb888e..6b72ce9501 100644 --- a/src/jswrap_promise.c +++ b/src/jswrap_promise.c @@ -28,7 +28,7 @@ /*JSON{ "type" : "class", "class" : "Promise", - "typescript": "interface Promise", + "typescript": "Promise", "ifndef" : "SAVE_ON_FLASH" } This is the built-in class for ES6 Promises From 57c9f4d18840030c70a031b9a419ed74e0832027 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:05:18 +0200 Subject: [PATCH 0238/1183] TypeScript: Fix Graphics.setTheme --- libs/graphics/jswrap_graphics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index 7945620d80..f3a79b4530 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -3899,7 +3899,7 @@ JsVar *jswrap_graphics_theme(JsVar *parent) { ], "return" : ["JsVar","The instance of Graphics this was called on, to allow call chaining"], "return_object" : "Graphics", - "typescript" : "setTheme(theme: { [key in keyof Theme]?: Theme[key] extends number ? ColorResolvable | Theme[key] }): Graphics;" + "typescript" : "setTheme(theme: { [key in keyof Theme]?: Theme[key] extends number ? ColorResolvable : Theme[key] }): Graphics;" } Set the global colour scheme. On Bangle.js, this is reloaded from `settings.json` for each new app loaded. From 8d4378c12b5060e73bcd9c642909f40cab7c3a03 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:05:35 +0200 Subject: [PATCH 0239/1183] Build types: show done message --- scripts/build_types.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 9597e29be1..32fa4e14a4 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -255,7 +255,11 @@ function getAll(objects) { objects.forEach(function (object) { if (["class", "object", "library"].includes(object.type)) { // already handled in `getClases` - } else if (["include", "init", "idle", "kill"].includes(object.type)) { + } else if ( + ["include", "init", "idle", "kill", "hwinit", "EV_SERIAL1"].includes( + object.type + ) + ) { // internal } else if (object.type === "constructor") { // set as constructor @@ -487,9 +491,10 @@ function buildTypes() { }); } -buildTypes().then((content) => +buildTypes().then((content) => { require("fs").writeFileSync( __dirname + "/../../BangleApps/typescript/types/main.d.ts", content - ) -); + ); + console.log("Generated build types!"); +}); From 395444ec3de15aa5a10f4fb5942fcf5bed3e2d4a Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:06:36 +0200 Subject: [PATCH 0240/1183] Add TypeScript Readme --- TYPESCRIPT.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 TYPESCRIPT.md diff --git a/TYPESCRIPT.md b/TYPESCRIPT.md new file mode 100644 index 0000000000..4a269bd4fc --- /dev/null +++ b/TYPESCRIPT.md @@ -0,0 +1,107 @@ +# Espruino and TypeScript + +## Build script + +The build script at `scripts/build_types.js` will automatically generate types +from documentation comments. To use it run: + +```sh +node scripts/build_types.js +``` + +This will update the file located at `typescript/types/main.d.ts` in the +BangleApps repository! + +**Note**: The script currently only works if this repository and `BangleApps` +are in the same directory on your file system. +in the same folder do: + +## Making manual declarations + +The script can automatically generate some TypeScript declarations from the +information in JSON comments, but others have to be done manually. To add a +declaration for a function or variable add a `"typescript"` field to its JSON +comment. Here's an example from `Graphics.drawString`: + +```json +"typescript" : "drawString(str: string, x: number, y: number, solid?: boolean): Graphics;" +``` + +To declare a function with multiple overloads, specify an array of strings: + +```json +"typescript" : [ + "drawRect(x1: number, y1: number, x2: number, y2: number): Graphics;", + "drawRect(rect: { x: number, y: number, x2: number, y2: number } | { x: number, y: number, w: number, h: number }): Graphics;" +] +``` + +You can also include declarations in comments starting with `TYPESCRIPT`. Use +these to declare types that are reused between functions or variables that for +whatever reason aren't defined in JSON comments. + +For example, the following type is used in Bangle.js's `"accel"` event and +`getAccel` method. + +```c +/*TYPESCRIPT +type AccelData = { + x: number; + y: number; + z: number; + diff: number; + mag: number; +}; +*/ +``` + +`Bangle.CLOCK` and `Bangle.strokes` aren't defined in any JSON comments so we do +it manually: + +```c +/*TYPESCRIPT{ + "class" : "Bangle" +} +static CLOCK: boolean; +static strokes: undefined | { [key: string]: Unistroke }; +*/ +``` + +Note that you can optionally add a JSON object of the form `{ "class" : string }` +to add the declarations to a specific class. Otherwise they will be declared +globally. + +Finally, also note that you can declare classes as generics where necessary. For +example, in the Array class: + +```json +"typescript" : "Array" +``` + +Then you can use this generic in the class's properties and methods: + +```json +"typescript" : "includes(value: T, startIndex?: number): boolean;" +``` + +## Guidelines + +Here are some guidelines for making manual declarations: + +- Only add a TypeScript declaration to a function or variable if the build + script can't generate it automatically. Check the `main.d.ts` file first to + see if it isn't already declared correctly. For example, `Bangle.setLCDPower` + doesn't need a TypeScript declaration since the script correctly declares it + automatically. + +- The build script can detect optional arguments if their description starts + with `"[optional]"`. If adding this keyword saves having to declare the + function manually, add it! + +- Try to keep argument names the same as the ones specified in the `"param"` + field. In cases that this isn't possible (with reserved keywords such as + `function` or `var`) you'll have to change the name a little (for example, + `callback` or `variable`). + +- In the `"typescript"` field do not add the `static` keyword to static methods + and properties - the build script will add it automatically. From 314555a6d88c080ccfbe92630da27c549d0962d0 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:09:16 +0200 Subject: [PATCH 0241/1183] TypeScript: Remove unneeded line --- TYPESCRIPT.md | 1 - 1 file changed, 1 deletion(-) diff --git a/TYPESCRIPT.md b/TYPESCRIPT.md index 4a269bd4fc..01fba23d5b 100644 --- a/TYPESCRIPT.md +++ b/TYPESCRIPT.md @@ -14,7 +14,6 @@ BangleApps repository! **Note**: The script currently only works if this repository and `BangleApps` are in the same directory on your file system. -in the same folder do: ## Making manual declarations From 5a99fbdafedf5b8a551ac53f2370c76f63be9523 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 27 Jul 2022 16:17:47 +0100 Subject: [PATCH 0242/1183] Fix overlay positioning for partial updates --- libs/graphics/lcd_memlcd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/graphics/lcd_memlcd.c b/libs/graphics/lcd_memlcd.c index f706263484..44e3453bbc 100644 --- a/libs/graphics/lcd_memlcd.c +++ b/libs/graphics/lcd_memlcd.c @@ -197,7 +197,7 @@ void lcdMemLCD_flip(JsGraphics *gfx) { // initialise image layer GfxDrawImageLayer l; l.x1 = 0; - l.y1 = 0; + l.y1 = lcdOverlayY; l.img = overlayImg; l.rotate = 0; l.scale = 1; @@ -205,7 +205,7 @@ void lcdMemLCD_flip(JsGraphics *gfx) { l.repeat = false; jsvStringIteratorNew(&l.it, l.img.buffer, (size_t)l.img.bitmapOffset); _jswrap_drawImageLayerInit(&l); - _jswrap_drawImageLayerSetStart(&l, 0, 0); + _jswrap_drawImageLayerSetStart(&l, 0, y1); for (int y=y1;y<=y2;y++) { int bufferLine = LCD_HEIGHT + (y&1); // alternate lines so we still get dither AND we can send while unsigned char *buf = &lcdBuffer[LCD_STRIDE*bufferLine]; // point to line right on the end of gfx @@ -220,8 +220,8 @@ void lcdMemLCD_flip(JsGraphics *gfx) { lcdMemLCD_setPixel(NULL, x+lcdOverlayX, bufferLine, c); _jswrap_drawImageLayerNextX(&l); } - _jswrap_drawImageLayerNextY(&l); } + _jswrap_drawImageLayerNextY(&l); // send the line #ifdef EMULATED memcpy(&fakeLCDBuffer[LCD_STRIDE*y], buf, LCD_STRIDE); From 50271ea2d7d65a8deab164083e17015fe784007f Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:34:24 +0200 Subject: [PATCH 0243/1183] TypeScript: IO --- src/jswrap_io.c | 65 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/src/jswrap_io.c b/src/jswrap_io.c index aa54b0c1cf..34ce0793d3 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -32,7 +32,11 @@ ["addr", "int", "The address in memory to read"], ["count", "int", "(optional) the number of items to read. If >1 a Uint8Array will be returned."] ], - "return" : ["JsVar","The value of memory at the given location"] + "return" : ["JsVar","The value of memory at the given location"], + "typescript" : [ + "declare function peek8(addr: number, count?: 1): number;", + "declare function peek8(addr: number, count: number): Uint8Array;" + ] } Read 8 bits of memory at the given location - DANGEROUS! */ @@ -43,7 +47,8 @@ Read 8 bits of memory at the given location - DANGEROUS! "params" : [ ["addr","int","The address in memory to write"], ["value","JsVar","The value to write, or an array of values"] - ] + ], + "typescript" : "declare function poke8(addr: number, value: number | number[]): void;" } Write 8 bits of memory at the given location - VERY DANGEROUS! */ @@ -55,7 +60,11 @@ Write 8 bits of memory at the given location - VERY DANGEROUS! ["addr","int","The address in memory to read"], ["count","int","(optional) the number of items to read. If >1 a Uint16Array will be returned."] ], - "return" : ["JsVar","The value of memory at the given location"] + "return" : ["JsVar","The value of memory at the given location"], + "typescript" : [ + "declare function peek16(addr: number, count?: 1): number;", + "declare function peek16(addr: number, count: number): Uint8Array;" + ] } Read 16 bits of memory at the given location - DANGEROUS! */ @@ -66,7 +75,8 @@ Read 16 bits of memory at the given location - DANGEROUS! "params" : [ ["addr","int","The address in memory to write"], ["value","JsVar","The value to write, or an array of values"] - ] + ], + "typescript" : "declare function poke16(addr: number, value: number | number[]): void;" } Write 16 bits of memory at the given location - VERY DANGEROUS! */ @@ -78,7 +88,11 @@ Write 16 bits of memory at the given location - VERY DANGEROUS! ["addr","int","The address in memory to read"], ["count","int","(optional) the number of items to read. If >1 a Uint32Array will be returned."] ], - "return" : ["JsVar","The value of memory at the given location"] + "return" : ["JsVar","The value of memory at the given location"], + "typescript" : [ + "declare function peek32(addr: number, count?: 1): number;", + "declare function peek32(addr: number, count: number): Uint8Array;" + ] } Read 32 bits of memory at the given location - DANGEROUS! */ @@ -89,7 +103,8 @@ Read 32 bits of memory at the given location - DANGEROUS! "params" : [ ["addr","int","The address in memory to write"], ["value","JsVar","The value to write, or an array of values"] - ] + ], + "typescript" : "declare function poke32(addr: number, value: number | number[]): void;" } Write 32 bits of memory at the given location - VERY DANGEROUS! */ @@ -175,7 +190,8 @@ However only pins connected to an ADC will work (see the datasheet) ["pin","pin",["The pin to use","You can find out which pins to use by looking at [your board's reference page](#boards) and searching for pins with the `PWM` or `DAC` markers."]], ["value","float","A value between 0 and 1"], ["options","JsVar",["An object containing options for analog output - see below"]] - ] + ], + "typescript" : "declare function analogWrite(pin: Pin, value: number, options?: { freq?: number, soft?: boolean, forceSoft?: boolean }): void;" } Set the analog Value of a pin. It will be output using PWM. @@ -212,7 +228,8 @@ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { ["pin","pin","The pin to use"], ["value","bool","Whether to pulse high (true) or low (false)"], ["time","JsVar","A time in milliseconds, or an array of times (in which case a square wave will be output starting with a pulse of 'value')"] - ] + ], + "typescript" : "declare function digitalPulse(pin: Pin, value: boolean, time: number | number[]): void;" } Pulse the pin with the value for the given time in milliseconds. It uses a hardware timer to produce accurate pulses, and returns immediately (before the @@ -278,7 +295,8 @@ void jswrap_io_digitalPulse(Pin pin, bool value, JsVar *times) { "params" : [ ["pin", "JsVar","The pin to use"], ["value", "int","Whether to pulse high (true) or low (false)"] - ] + ], + "typescript" : "declare function digitalWrite(pin: Pin, value: typeof HIGH | typeof LOW): void;" } Set the digital value of the given pin. @@ -336,7 +354,8 @@ void jswrap_io_digitalWrite( "params" : [ ["pin","JsVar","The pin to use"] ], - "return" : ["int","The digital Value of the Pin"] + "return" : ["int","The digital Value of the Pin"], + "typescript" : "declare function digitalRead(pin: Pin): number;" } Get the digital value of the given pin. @@ -382,6 +401,17 @@ JsVarInt jswrap_io_digitalRead(JsVar *pinVar) { } } +/*TYPESCRIPT +type PinMode = + | "analog" + | "input" + | "input_pullup" + | "input_pulldown" + | "output" + | "opendrain" + | "af_output" + | "af_opendrain"; +*/ /*JSON{ "type" : "function", "name" : "pinMode", @@ -390,7 +420,8 @@ JsVarInt jswrap_io_digitalRead(JsVar *pinVar) { ["pin", "pin", "The pin to set pin mode for"], ["mode", "JsVar", "The mode - a string that is either 'analog', 'input', 'input_pullup', 'input_pulldown', 'output', 'opendrain', 'af_output' or 'af_opendrain'. Do not include this argument or use 'auto' if you want to revert to automatic pin mode setting."], ["automatic", "bool", "Optional, default is false. If true, subsequent commands will automatically change the state (see notes below)"] - ] + ], + "typescript" : "declare function pinMode(pin: Pin, mode?: PinMode | \"auto\", automatic?: boolean): void;" } Set the mode of the given pin. @@ -456,7 +487,8 @@ void jswrap_io_pinMode( "params" : [ ["pin","pin","The pin to check"] ], - "return" : ["JsVar","The pin mode, as a string"] + "return" : ["JsVar","The pin mode, as a string"], + "typescript" : "declare function getPinMode(pin: Pin): PinMode;" } Return the current mode of the given pin. See `pinMode` for more information on returned values. @@ -535,7 +567,8 @@ void jswrap_io_shiftOutCallback(int val, void *data) { ["pins","JsVar","A pin, or an array of pins to use"], ["options","JsVar","Options, for instance the clock (see below)"], ["data","JsVar","The data to shift out (see `E.toUint8Array` for info on the forms this can take)"] - ] + ], + "typescript" : "declare function shiftOut(pins: Pin | Pin[], options: { clk?: Pin, clkPol?: boolean, repeat?: number }, data: Uint8ArrayResolvable): void;" } Shift an array of data out using the pins supplied *least significant bit first*, for example: @@ -646,7 +679,8 @@ void jswrap_io_shiftOut(JsVar *pins, JsVar *options, JsVar *data) { ["pin", "pin", "The pin to watch"], ["options", "JsVar","If a boolean or integer, it determines whether to call this once (false = default) or every time a change occurs (true). Can be an object of the form `{ repeat: true/false(default), edge:'rising'/'falling'/'both'(default), debounce:10}` - see below for more information."] ], - "return" : ["JsVar","An ID that can be passed to clearWatch"] + "return" : ["JsVar","An ID that can be passed to clearWatch"], + "typescript" : "declare function setWatch(func: ((arg: { state: boolean, time: number, lastTime: number }) => void) | string, pin: Pin, options?: boolean | { repeat?: boolean, edge?: \"rising\" | \"falling\" | \"both\", debounce?: number, irq?: boolean, data?: Pin, hispeed?: boolean }): number;" } Call the function specified when the pin changes. Watches set with `setWatch` can be removed using `clearWatch`. @@ -823,7 +857,8 @@ JsVar *jswrap_interface_setWatch( "generate" : "jswrap_interface_clearWatch", "params" : [ ["id","JsVarArray","The id returned by a previous call to setWatch. **Only one argument is allowed.**"] - ] + ], + "typescript" : "declare function clearWatch(id: number): void;" } Clear the Watch that was created with setWatch. If no parameter is supplied, all watches will be removed. From 8ed673b719e667503a8ab8e37abae4f379a0b735 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:34:30 +0200 Subject: [PATCH 0244/1183] Update TypeScript Readme --- TYPESCRIPT.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TYPESCRIPT.md b/TYPESCRIPT.md index 01fba23d5b..45565daba6 100644 --- a/TYPESCRIPT.md +++ b/TYPESCRIPT.md @@ -97,6 +97,8 @@ Here are some guidelines for making manual declarations: with `"[optional]"`. If adding this keyword saves having to declare the function manually, add it! +- Include the `declare` keyword in global functions and variables. + - Try to keep argument names the same as the ones specified in the `"param"` field. In cases that this isn't possible (with reserved keywords such as `function` or `var`) you'll have to change the name a little (for example, From 94940c642e0964cd3d1dbeffdb3469280f3f1bc0 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:37:32 +0200 Subject: [PATCH 0245/1183] TypeScript: HIGH and LOW --- src/jswrap_number.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/jswrap_number.c b/src/jswrap_number.c index 5afe55328d..73c309770a 100644 --- a/src/jswrap_number.c +++ b/src/jswrap_number.c @@ -141,12 +141,14 @@ JsVar *jswrap_number_toFixed(JsVar *parent, int decimals) { "type" : "variable", "name" : "HIGH", "generate_full" : "1", - "return" : ["int32","Logic 1 for Arduino compatibility - this is the same as just typing `1`"] + "return" : ["int32","Logic 1 for Arduino compatibility - this is the same as just typing `1`"], + "typescript" : "declare const HIGH: 1;" }*/ /*JSON{ "type" : "variable", "name" : "LOW", "generate_full" : "0", - "return" : ["int32","Logic 0 for Arduino compatibility - this is the same as just typing `0`"] + "return" : ["int32","Logic 0 for Arduino compatibility - this is the same as just typing `0`"], + "typescript" : "declare const LOW: 0;" }*/ From 12148963bce6237affe3a8806cbc57636952ad0b Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 17:37:41 +0200 Subject: [PATCH 0246/1183] TypeScript: Buttons 1 - 5 --- libs/banglejs/jswrap_bangle.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 7565f62836..cc9addbf7a 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -75,6 +75,12 @@ #endif /*TYPESCRIPT +declare const BTN1: Pin; +declare const BTN2: Pin; +declare const BTN3: Pin; +declare const BTN4: Pin; +declare const BTN5: Pin; + declare const g: Graphics; type WidgetArea = "tl" | "tr" | "bl" | "br"; From f747dc312c87022fce96dc92e7311df72077fb12 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 19:43:14 +0200 Subject: [PATCH 0247/1183] Use HIGH and LOW as booleans --- src/jswrap_io.c | 2 +- src/jswrap_number.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jswrap_io.c b/src/jswrap_io.c index 34ce0793d3..6f89681d9d 100644 --- a/src/jswrap_io.c +++ b/src/jswrap_io.c @@ -296,7 +296,7 @@ void jswrap_io_digitalPulse(Pin pin, bool value, JsVar *times) { ["pin", "JsVar","The pin to use"], ["value", "int","Whether to pulse high (true) or low (false)"] ], - "typescript" : "declare function digitalWrite(pin: Pin, value: typeof HIGH | typeof LOW): void;" + "typescript" : "declare function digitalWrite(pin: Pin, value: boolean): void;" } Set the digital value of the given pin. diff --git a/src/jswrap_number.c b/src/jswrap_number.c index 73c309770a..cf5e332446 100644 --- a/src/jswrap_number.c +++ b/src/jswrap_number.c @@ -142,7 +142,7 @@ JsVar *jswrap_number_toFixed(JsVar *parent, int decimals) { "name" : "HIGH", "generate_full" : "1", "return" : ["int32","Logic 1 for Arduino compatibility - this is the same as just typing `1`"], - "typescript" : "declare const HIGH: 1;" + "typescript" : "declare const HIGH: true;" }*/ /*JSON{ @@ -150,5 +150,5 @@ JsVar *jswrap_number_toFixed(JsVar *parent, int decimals) { "name" : "LOW", "generate_full" : "0", "return" : ["int32","Logic 0 for Arduino compatibility - this is the same as just typing `0`"], - "typescript" : "declare const LOW: 0;" + "typescript" : "declare const LOW: false;" }*/ From 520025cada2fc48073c47837c3801a1f7b6d1b83 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 19:44:12 +0200 Subject: [PATCH 0248/1183] TypeScript: Don't declare Bluetooth as a class --- libs/misc/jswrap_emulated.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/misc/jswrap_emulated.c b/libs/misc/jswrap_emulated.c index 956ad65d73..b8dcf46c4b 100644 --- a/libs/misc/jswrap_emulated.c +++ b/libs/misc/jswrap_emulated.c @@ -24,7 +24,8 @@ */ /*JSON{ "type" : "class", - "class" : "Bluetooth" + "class" : "Bluetooth", + "typescript" : null } */ @@ -68,6 +69,7 @@ "type" : "staticmethod", "class" : "Bluetooth", "name" : "setConsole", - "generate_full" : "" + "generate_full" : "", + "typescript" : null } */ From 649c271b058ffc8a8284751212943607495b7ab6 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 19:44:32 +0200 Subject: [PATCH 0249/1183] TypeScript: Declare modules as JS modules --- scripts/build_types.js | 116 +++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 32fa4e14a4..8dc48f2c8d 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -157,16 +157,23 @@ function getReturnType(method) { /** * Return the declaration of a function or variable. * @param {object} object - The object containing the function or variable's data. - * @param {boolean} [property] - True if the object is a property of a class, etc. + * @param {string} [context] - Either "global", "class" or "module". * @returns {string} The function or variable's declaration. */ -function getDeclaration(object, property) { - if ("typescript" in object) - return typeof object.typescript === "string" - ? object.typescript - : object.typescript.join("\n"); +function getDeclaration(object, context) { + if ("typescript" in object) { + let declaration = + typeof object.typescript === "string" + ? object.typescript + : object.typescript.join("\n"); + if (!declaration.startsWith("function") && context === "library") { + declaration = "function " + declaration; + } + return declaration; + } + if (object.type === "event") { - if (property) { + if (context === "class") { return `on(event: "${object.name}", callback: ${getArguments( object )} => void): void;`; @@ -180,24 +187,18 @@ function getDeclaration(object, property) { ) { // function const name = object.type === "constructor" ? "new" : object.name; - if (property) { - return `${name}${getArguments(object)}: ${getReturnType(object)};`; - } else { - return `declare function ${name}${getArguments(object)}: ${getReturnType( - object - )};`; - } + return `${context === "global" ? "declare " : ""}${ + context !== "class" ? "function " : "" + }${name}${getArguments(object)}: ${getReturnType(object)};`; } else { // property const type = object.type === "object" ? object.instanceof : getBasicType(object.return_object || object.return[0]); - if (property) { - return `${object.name}: ${type};`; - } else { - return `declare const ${object.name}: ${type};`; - } + return `${context === "global" ? "declare " : ""}${ + context !== "class" ? "const " : "" + }${object.name}: ${type};`; } } @@ -217,6 +218,7 @@ function getDeclaration(object, property) { function getClasses(objects) { const classes = {}; objects.forEach(function (object) { + if (object.typescript === null) return; if (object.type == "class" || object.type == "library") { classes[object.class] = { library: object.type === "library", @@ -253,7 +255,8 @@ function getAll(objects) { } objects.forEach(function (object) { - if (["class", "object", "library"].includes(object.type)) { + if (object.typescript === null) return; + if (["class", "library"].includes(object.type)) { // already handled in `getClases` } else if ( ["include", "init", "idle", "kill", "hwinit", "EV_SERIAL1"].includes( @@ -320,7 +323,7 @@ function getBuiltinClassDeclaration(name, c, types) { .map((property) => `${getDocumentation(property)}\n${getDeclaration( property, - true + "class" )}`.trim() ) .join("\n\n") @@ -334,7 +337,7 @@ function getBuiltinClassDeclaration(name, c, types) { .map((property) => `${getDocumentation(property)}\n${getDeclaration( property, - true + "class" )}`.trim() ) .concat(name === "Array" ? ["[index: number]: T"] : []) @@ -363,7 +366,7 @@ function getOtherClassDeclaration(name, c, types) { .concat([c.cons]) .filter((property) => property) .map((property) => - `${getDocumentation(property)}\n${getDeclaration(property, true) + `${getDocumentation(property)}\n${getDeclaration(property, "class") .split("\n") .map((dec) => "static " + dec) .join("\n")}`.trim() @@ -374,7 +377,7 @@ function getOtherClassDeclaration(name, c, types) { .map((property) => `${getDocumentation(property)}\n${getDeclaration( property, - true + "class" )}`.trim() ) .concat(name === "ArrayBufferView" ? ["[index: number]: number"] : []) @@ -418,12 +421,21 @@ function getClassDeclarations(classes, types) { * @param {object[]} globals - The list of global objects. * @returns {string} The global declarations. */ -function getGlobalDeclarations(globals) { +function getGlobalDeclarations(globals, classes) { return ( "\n\n// GLOBALS\n\n" + globals .map((global) => - global.name === "global" + global.name === "require" + ? Object.entries(classes) + .filter(([_, c]) => c.library) + .map( + ([name]) => + `declare function require(moduleName: "${name}"): typeof import("${name}");` + ) + .concat(["declare function require(moduleName: string): any;"]) + .join("\n") + : global.name === "global" ? `declare const global: {\n` + indent( globals @@ -432,7 +444,7 @@ function getGlobalDeclarations(globals) { .join("\n") ) + "\n}" - : `${getDocumentation(global)}\n${getDeclaration(global)}` + : `${getDocumentation(global)}\n${getDeclaration(global, "global")}` ) .join("\n\n") ); @@ -445,28 +457,25 @@ function getGlobalDeclarations(globals) { */ function getLibraryDeclarations(classes) { return ( - "\n\n// LIBRARIES\n\ntype Libraries = {\n" + - indent( - Object.entries(classes) - .filter(([_, c]) => c.library) - .map( - ([name, library]) => - `${getDocumentation(library.object)}\n${name}: {\n` + - indent( - library.staticProperties - .map((property) => - `${getDocumentation(property)}\n${getDeclaration( - property, - true - )}`.trim() - ) - .join("\n\n") - ) + - "\n}" - ) - .join("\n\n") - ) + - "\n}" + "\n\n// LIBRARIES\n\n" + + Object.entries(classes) + .filter(([_, c]) => c.library) + .map( + ([name, library]) => + `${getDocumentation(library.object)}\ndeclare module "${name}" {\n` + + indent( + library.staticProperties + .map((property) => + `${getDocumentation(property)}\n${getDeclaration( + property, + "library" + )}`.trim() + ) + .join("\n\n") + ) + + "\n}" + ) + .join("\n\n") ); } @@ -484,7 +493,7 @@ function buildTypes() { '/// \n\n' + getTypeDeclarations(types) + getClassDeclarations(classes, types) + - getGlobalDeclarations(globals) + + getGlobalDeclarations(globals, classes) + getLibraryDeclarations(classes) ); }); @@ -496,5 +505,12 @@ buildTypes().then((content) => { __dirname + "/../../BangleApps/typescript/types/main.d.ts", content ); + // Write to DefinitelyTyped if repository exists + try { + require("fs").writeFileSync( + __dirname + "/../../DefinitelyTyped/types/espruino/index.d.ts", + content + ); + } catch (e) {} console.log("Generated build types!"); }); From ff90ed7e28890b899e82ba1ad78d358ca8017f8b Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 19:55:55 +0200 Subject: [PATCH 0250/1183] TypeScript: Wifi.connect and Wifi.startAP --- libs/network/jswrap_wifi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/network/jswrap_wifi.c b/libs/network/jswrap_wifi.c index 3dd0983741..502f3bd818 100644 --- a/libs/network/jswrap_wifi.c +++ b/libs/network/jswrap_wifi.c @@ -227,7 +227,8 @@ re-enabled by calling `startAP`. ["ssid", "JsVar", "The access point network id."], ["options", "JsVar", "Connection options (optional)."], ["callback", "JsVar", "A `callback(err)` function to be called back on completion. `err` is null on success, or contains an error string on failure."] - ] + ], + "typescript" : "function connect(ssid: string, options?: { password?: string, dnsServers?: string[], channel?: number, bssid?: string }, callback?: (err: string | null) => void): void;" } Connect to an access point as a station. If there is an existing connection to an AP it is first disconnected if the SSID or password are different from those @@ -299,7 +300,8 @@ with an array of APs found, each AP is an object with: ["ssid", "JsVar", "The network id."], ["options", "JsVar", "Configuration options (optional)."], ["callback", "JsVar", "Optional `callback(err)` function to be called when the AP is successfully started. `err==null` on success, or an error string on failure."] - ] + ], + "typescript" : "function startAP(ssid: string, options?: { password?: string, authMode?: \"open\" | \"wpa2\" | \"wpa\" | \"wpa_wpa2\", channel?: number, hidden?: boolean }, callback?: (err: string | null) => void): void;" } Create a WiFi access point allowing stations to connect. If the password is NULL or an empty string the access point is open, otherwise it is encrypted. The From b4cf252826ca1b018fc83ef02bb72f35acd780ef Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 20:14:18 +0200 Subject: [PATCH 0251/1183] TypeScript: Some Bluetooth and Wifi functions --- libs/bluetooth/jswrap_bluetooth.c | 12 +++++++----- libs/network/jswrap_wifi.c | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index 3ef747cc11..6b09e55987 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -701,7 +701,7 @@ JsVarFloat jswrap_ble_getBattery() { "generate" : "jswrap_ble_setAdvertising", "params" : [ ["data","JsVar","The service data to advertise as an object - see below for more info"], - ["options","JsVar","An optional object of options"] + ["options","JsVar","[optional] Object of options"] ] } Change the data that Espruino advertises. @@ -1185,6 +1185,7 @@ void jswrap_ble_setScanResponse(JsVar *data) { } } +// TODO TypeScript improve /*JSON{ "type" : "staticmethod", "class" : "NRF", @@ -1192,8 +1193,9 @@ void jswrap_ble_setScanResponse(JsVar *data) { "generate" : "jswrap_ble_setServices", "params" : [ ["data","JsVar","The service (and characteristics) to advertise"], - ["options","JsVar","Optional object containing options"] - ] + ["options","JsVar","[optional] Object containing options"] + ], + "typescript" : "setServices(data: { [key: number]: { [key: number]: { value?: string, maxLen?: number, broadcast?: boolean, readable?: boolean, writable?: boolean, notify?: boolean, indicate?: boolean, description?: string, security?: { read?: { encrypted?: boolean, mitm?: boolean, lesc?: boolean, signed?: boolean }, write?: { encrypted?: boolean, mitm?: boolean, lesc?: boolean, signed?: boolean } }, onWrite?: (evt: { data: ArrayBuffer }) => void } } }, options?: any): void;" } Change the services and characteristics Espruino advertises. @@ -1994,7 +1996,7 @@ JsVar *jswrap_ble_filterDevices(JsVar *devices, JsVar *filters) { ["callback","JsVar","The callback to call with received advertising packets (as `BluetoothDevice`), or undefined to stop"], ["options","JsVar","[optional] A time in milliseconds to scan for (defaults to 2000), Or an optional object `{filters: ..., timeout : ..., active: bool}` (as would be passed to `NRF.requestDevice`) to filter devices by"] ], - "typescript" : "findDevices(callback: (devices: BluetoothDevice[]) => void, options?: number | { filters?: NRFFilters, timeout?: number, active?: boolean }): void;" + "typescript" : "findDevices(callback: (devices: BluetoothDevice[]) => void, options?: number | { filters?: NRFFilters[], timeout?: number, active?: boolean }): void;" } Utility function to return a list of BLE devices detected in range. Behind the scenes, this uses `NRF.setScan(...)` and collates the results. @@ -3016,7 +3018,7 @@ type NRFFilters = { "params" : [ ["options","JsVar","Options used to filter the device to use"] ], - "typescript" : "requestDevice(options?: { filters?: NRFFilters, timeout?: number, active?: boolean, phy?: string, extended?: boolean }): Promise;", + "typescript" : "requestDevice(options?: { filters?: NRFFilters[], timeout?: number, active?: boolean, phy?: string, extended?: boolean }): Promise;", "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } diff --git a/libs/network/jswrap_wifi.c b/libs/network/jswrap_wifi.c index 502f3bd818..5fa95f75f3 100644 --- a/libs/network/jswrap_wifi.c +++ b/libs/network/jswrap_wifi.c @@ -218,6 +218,7 @@ Stop being an access point and disable the AP operation mode. AP mode can be re-enabled by calling `startAP`. */ +// TODO TypeScript: Is authMode an option? /*JSON{ "type" : "staticmethod", "class" : "Wifi", @@ -228,7 +229,7 @@ re-enabled by calling `startAP`. ["options", "JsVar", "Connection options (optional)."], ["callback", "JsVar", "A `callback(err)` function to be called back on completion. `err` is null on success, or contains an error string on failure."] ], - "typescript" : "function connect(ssid: string, options?: { password?: string, dnsServers?: string[], channel?: number, bssid?: string }, callback?: (err: string | null) => void): void;" + "typescript" : "function connect(ssid: string, options?: { password?: string, dnsServers?: string[], authMode?: string, channel?: number, bssid?: string }, callback?: (err: string | null) => void): void;" } Connect to an access point as a station. If there is an existing connection to an AP it is first disconnected if the SSID or password are different from those From 149a7f6bace3a56c1892de47bd8baacfb3f496a5 Mon Sep 17 00:00:00 2001 From: qucchia Date: Wed, 27 Jul 2022 20:14:32 +0200 Subject: [PATCH 0252/1183] Build types: Edit start of file --- scripts/build_types.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/build_types.js b/scripts/build_types.js index 8dc48f2c8d..8aa3392d27 100644 --- a/scripts/build_types.js +++ b/scripts/build_types.js @@ -489,7 +489,9 @@ function buildTypes() { const [classes, globals] = getAll(objects, types); resolve( - "// NOTE: This file has been automatically generated.\n\n" + + "// Type definitions for Espruino latest\n" + + "// Project: http://www.espruino.com/, https://github.com/espruino/espruinotools" + + "// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n" + '/// \n\n' + getTypeDeclarations(types) + getClassDeclarations(classes, types) + From b01ed3dafa9c58686c89f6ea764f2a31a14b2b3c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 28 Jul 2022 09:23:17 +0100 Subject: [PATCH 0253/1183] docs (fix #2251) --- libs/bluetooth/jswrap_bluetooth.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/libs/bluetooth/jswrap_bluetooth.c b/libs/bluetooth/jswrap_bluetooth.c index dc1104b8c9..ad8c63d623 100644 --- a/libs/bluetooth/jswrap_bluetooth.c +++ b/libs/bluetooth/jswrap_bluetooth.c @@ -2695,10 +2695,12 @@ negative:true } ``` -You can then get more information with something like: +You can then get more information with `NRF.ancsGetNotificationInfo`, for instance: ``` -NRF.ancsGetNotificationInfo( event.uid ).then(a=>print("Notify",E.toJS(a))); +E.on('ANCS', event => { + NRF.ancsGetNotificationInfo( event.uid ).then(a=>print("Notify",E.toJS(a))); +}); ``` */ @@ -2777,9 +2779,29 @@ void jswrap_ble_ancsAction(int uid, bool isPositive) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Get ANCS info for a notification, e.g.: +Get ANCS info for a notification event received via `E.ANCS`, e.g.: + +``` +E.on('ANCS', event => { + NRF.ancsGetNotificationInfo( event.uid ).then(a=>print("Notify",E.toJS(a))); +}); +``` +Returns: +``` +{ + "uid" : integer, + "appId": string, + "title": string, + "subtitle": string, + "message": string, + "messageSize": string, + "date": string, + "posAction": string, + "negAction": string +} +``` */ JsVar *jswrap_ble_ancsGetNotificationInfo(JsVarInt uid) { @@ -2810,7 +2832,7 @@ JsVar *jswrap_ble_ancsGetNotificationInfo(JsVarInt uid) { "return" : ["JsVar", "A `Promise` that is resolved (or rejected) when the connection is complete" ], "return_object" : "Promise" } -Get ANCS info for an app (add id is available via `ancsGetNotificationInfo`) +Get ANCS info for an app (app id is available via `NRF.ancsGetNotificationInfo`) Promise returns: From 4cce3caa21c8ae5b8f7f4441379b65d777aa3164 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 28 Jul 2022 11:26:59 +0100 Subject: [PATCH 0254/1183] Fix issue parsing constant decls when not executing (fix #2255) --- ChangeLog | 1 + src/jsparse.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index fa6eb4b5c3..66fa2d7aeb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,7 @@ nRF52: Change from hard -> softfp calling convention (saves a few bytes, more compatible with compiled code) Fix 'console.log([1,2,3].splice(0, 1.0))' (fix #2245) Bangle.js2: Added `Bangle.setLCDOverlay(img,x,y)` to allow an image to be overlaid on top of screen contents (eg for notifications) + Fix issue parsing constant decls when not executing (fix #2255) 2v14 : Bangle.js2: Fix issue with E.showMenu creating a global `s` variable Bangle.js2: Recheck string wrapping after font change inside E.showMenu diff --git a/src/jsparse.c b/src/jsparse.c index 7fa5ad35b4..4d42a33237 100644 --- a/src/jsparse.c +++ b/src/jsparse.c @@ -2307,10 +2307,12 @@ NO_INLINE JsVar *jspeStatementVar() { jsvReplaceWith(a, var); jsvUnLock(var); } - if (isConstant) - a->flags |= JSV_CONSTANT; - jsvUnLock(lastDefined); - lastDefined = a; + if (JSP_SHOULD_EXECUTE) { + if (isConstant) + a->flags |= JSV_CONSTANT; + jsvUnLock(lastDefined); + lastDefined = a; + } hasComma = lex->tk == ','; if (hasComma) JSP_MATCH_WITH_RETURN(',', lastDefined); } From e59b07a73677dd280f1ec41dc224d8bb5bb63b67 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 28 Jul 2022 15:32:46 +0100 Subject: [PATCH 0255/1183] Improved document generation - and github links now point to that commit so the line numbers always match up --- boards/BANGLEJS.py | 10 +-- boards/BANGLEJS2.py | 7 +- boards/ESPRUINOBOARD.py | 2 +- boards/ESPRUINOWIFI.py | 2 +- boards/MDBT42Q.py | 2 +- boards/PICO_R1_3.py | 2 +- boards/PIXLJS.py | 3 +- boards/PUCKJS.py | 3 +- boards/PUCKJS_LITE.py | 3 +- boards/PUCKJS_MINIMAL.py | 3 +- scripts/build_board_docs.py | 144 ++++++++++++++++++------------------ scripts/build_docs.py | 10 ++- scripts/common.py | 25 +++++-- 13 files changed, 117 insertions(+), 99 deletions(-) diff --git a/boards/BANGLEJS.py b/boards/BANGLEJS.py index 6d718814a6..12bc9309d8 100644 --- a/boards/BANGLEJS.py +++ b/boards/BANGLEJS.py @@ -16,8 +16,8 @@ import pinutils; info = { - 'name' : "Espruino Bangle.js", - 'link' : [ "http://www.espruino.com/Bangle.js" ], + 'name' : "Bangle.js", + 'link' : [ "https://espruino.com/Bangle.js" ], 'espruino_page_link' : 'Bangle.js', 'default_console' : "EV_BLUETOOTH", 'variables' : 2584, # How many variables are allocated for Espruino to use. RAM will be overflowed if this number is too high and code won't compile. @@ -156,13 +156,7 @@ # left-right, or top-bottom order board = { - 'left' : [], - 'right' : [], - '_notes' : { - } }; -board["_css"] = """ -"""; def get_pins(): pins = pinutils.generate_pins(0,31) # 32 General Purpose I/O Pins. diff --git a/boards/BANGLEJS2.py b/boards/BANGLEJS2.py index 69f57b7eaa..a0413564c4 100644 --- a/boards/BANGLEJS2.py +++ b/boards/BANGLEJS2.py @@ -17,7 +17,7 @@ info = { 'name' : "Bangle.js 2", # Using SMA Q3 - 'link' : [ "https://www.espruino.com/Bangle.js2" ], + 'link' : [ "https://espruino.com/Bangle.js2" ], 'espruino_page_link' : 'Bangle.js2', 'default_console' : "EV_TERMINAL", #'default_console' : "EV_SERIAL1", @@ -36,7 +36,7 @@ 'GRAPHICS', 'CRYPTO','SHA256','SHA512', 'LCD_MEMLCD', - 'TENSORFLOW', +# 'TENSORFLOW', 'JIT' # JIT compiler enabled ], 'makefile' : [ @@ -183,8 +183,7 @@ # left-right, or top-bottom order board = { }; -board["_css"] = """ -"""; + def get_pins(): pins = pinutils.generate_pins(0,47) # 48 General Purpose I/O Pins. diff --git a/boards/ESPRUINOBOARD.py b/boards/ESPRUINOBOARD.py index b3acefdea4..17ac868054 100644 --- a/boards/ESPRUINOBOARD.py +++ b/boards/ESPRUINOBOARD.py @@ -16,7 +16,7 @@ import pinutils; info = { 'name' : "Original Espruino Board rev 1.3/1.4", - 'link' : [ "http://www.espruino.com/Original" ], + 'link' : [ "https://espruino.com/Original" ], 'espruino_page_link' : "EspruinoBoard", 'default_console' : "EV_SERIAL1", 'default_console_tx' : "A9", diff --git a/boards/ESPRUINOWIFI.py b/boards/ESPRUINOWIFI.py index 600da0bfee..4ed1780887 100644 --- a/boards/ESPRUINOWIFI.py +++ b/boards/ESPRUINOWIFI.py @@ -16,7 +16,7 @@ import pinutils; info = { 'name' : "Espruino WiFi", - 'link' : [ "http://www.espruino.com/EspruinoWiFi" ], + 'link' : [ "https://espruino.com/EspruinoWiFi" ], 'espruino_page_link' : 'EspruinoWiFi', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "B6", diff --git a/boards/MDBT42Q.py b/boards/MDBT42Q.py index d7dfe61482..b14e59ba01 100644 --- a/boards/MDBT42Q.py +++ b/boards/MDBT42Q.py @@ -17,7 +17,7 @@ info = { 'name' : "MDBT42Q Module", - 'link' : [ "http://www.espruino.com/MDBT42Q" ], + 'link' : [ "https://espruino.com/MDBT42Q" ], 'espruino_page_link' : 'MDBT42Q', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "D6", diff --git a/boards/PICO_R1_3.py b/boards/PICO_R1_3.py index 243fc606ac..c9a4f0d47e 100644 --- a/boards/PICO_R1_3.py +++ b/boards/PICO_R1_3.py @@ -16,7 +16,7 @@ import pinutils; info = { 'name' : "Espruino Pico rev 1.3/1.4", - 'link' : [ "http://www.espruino.com/Pico" ], + 'link' : [ "https://espruino.com/Pico" ], 'espruino_page_link' : 'Pico', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "B6", diff --git a/boards/PIXLJS.py b/boards/PIXLJS.py index d3d595fbac..96eb81764d 100644 --- a/boards/PIXLJS.py +++ b/boards/PIXLJS.py @@ -17,7 +17,8 @@ info = { 'name' : "Pixl.js", - 'link' : [ "http://www.espruino.com/Pixl.js" ], + 'link' : [ "https://espruino.com/Pixl.js" ], + 'espruino_page_link' : 'Pixl.js', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "D1", 'default_console_rx' : "D0", diff --git a/boards/PUCKJS.py b/boards/PUCKJS.py index cf84f6ea32..d7b9571ff6 100644 --- a/boards/PUCKJS.py +++ b/boards/PUCKJS.py @@ -17,7 +17,8 @@ info = { 'name' : "Puck.js", - 'link' : [ "http://www.espruino.com/PuckJS" ], + 'link' : [ "https://espruino.com/Puck.js" ], + 'espruino_page_link' : 'Puck.js', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "D28", 'default_console_rx' : "D29", diff --git a/boards/PUCKJS_LITE.py b/boards/PUCKJS_LITE.py index 7a44d20f1e..a4c90ecc35 100644 --- a/boards/PUCKJS_LITE.py +++ b/boards/PUCKJS_LITE.py @@ -20,7 +20,8 @@ # The Puck.js lite can use the same firmware as normal, but the bootloader needs to know # there's no LED3, so it can light up red instead of blue when connected 'boardname' : "PUCKJS", - 'link' : [ "http://www.espruino.com/PuckJS" ], + 'link' : [ "https://espruino.com/Puck.js" ], + 'espruino_page_link' : 'Puck.js', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "D28", 'default_console_rx' : "D29", diff --git a/boards/PUCKJS_MINIMAL.py b/boards/PUCKJS_MINIMAL.py index cda9b2f0c3..84f1f809a0 100644 --- a/boards/PUCKJS_MINIMAL.py +++ b/boards/PUCKJS_MINIMAL.py @@ -21,7 +21,8 @@ # It frees up roughly 60kB extra Flash memory which can be used for Storage, # bringing the total to 98kB. 'boardname' : "PUCKJS", - 'link' : [ "http://www.espruino.com/PuckJS" ], + 'link' : [ "https://espruino.com/Puck.js" ], + 'espruino_page_link' : 'Puck.js', 'default_console' : "EV_SERIAL1", 'default_console_tx' : "D28", 'default_console_rx' : "D29", diff --git a/scripts/build_board_docs.py b/scripts/build_board_docs.py index 60905a38dd..3811539824 100755 --- a/scripts/build_board_docs.py +++ b/scripts/build_board_docs.py @@ -158,6 +158,51 @@ def dump_pin(brd, pin, pinstrip): if reverse: writeHTML(pinHTML2+"\n"+pinHTML) writeHTML(' ') + +def writeBoard(brd, brdnum): + boardname = "board" + if brdnum!=0: boardname += str(brdnum+1) + + writeHTML(' ') + + writeHTML('
') + writeHTML('
') + + usedpins = [] + for pinstrip in brd: + if pinstrip[0]!='_': + writeHTML('
') + for pin in brd[pinstrip]: + usedpins.append(pin) + dump_pin(brd, pin, pinstrip) + writeHTML('
') + + otherpins=0 + for pinstruct in pins: + pin = pinstruct["name"] + if not pin in usedpins: + otherpins = otherpins + 1 + + writeHTML('
') + writeHTML('
') + + if otherpins>0 and not ('_hide_not_on_connectors' in brd and brd["_hide_not_on_connectors"]): + writeHTML('
') + writeHTML('

Pins not on connectors

') + for pinstruct in pins: + pin = pinstruct["name"] + if not pin in usedpins: + dump_pin(brd, pin, "otherpins") + writeHTML('
') + writeHTML('

') + if not embeddable: writeHTML(""" @@ -319,79 +364,34 @@ def dump_pin(brd, pin, pinstrip): writeHTML(' DACs'+(str(board.chip['dac']) if board.chip['dac']>0 else "No")+'') writeHTML(' SD Card'+("Yes" if "SD" in board.devices else "No")+'') writeHTML(' ') - writeHTML('

Like this? Please tell your friends, blog, or support us by buying our board!

') - writeHTML('

Pinout

') - - - -writeHTML(""" -

Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.

-
    -
  • Purple boxes show pins that are used for other functionality on the board. You should avoid using these unless you know that the marked device is not used.
  • -
  • ! boxes contain extra information about the pin. Hover your mouse over them to see it.
  • -
  • 3.3v boxes mark pins that are not 5v tolerant (they only take inputs from 0 - 3.3v, not 0 - 5v).
  • """) -if has_pin("3.3"): writeHTML("""
  • 3.3 is a 3.3v output from the on-board Voltage regulator.
  • """) -if has_pin("GND"): writeHTML("""
  • GND is ground (0v).
  • """) -if has_pin("VBAT"): writeHTML("""
  • VBAT is the battery voltage output (see the Espruino Board Reference).
  • """) -if "ADC" in functionsOnBoard: writeHTML("""
  • ADC is an Analog to Digital Converter (for reading analog voltages)
  • """); -if "DAC" in functionsOnBoard: writeHTML("""
  • DAC is a Digital to Analog Converter (for creating analog voltages). This is not available on all boards.
  • """); -if "PWM" in functionsOnBoard: writeHTML("""
  • PWM is for Pulse Width Modulation. This creates analog voltages from a digital output by sending a series of pulses.
  • """); -if "SPI" in functionsOnBoard: writeHTML("""
  • SPI is the 3 wire Serial Peripheral Interface.
  • """); -if "USART" in functionsOnBoard: writeHTML("""
  • USART is a 2 wire peripheral for Serial Data.
  • """); -if "I2C" in functionsOnBoard: writeHTML("""
  • I2C is the 2 wire Inter-Integrated Circuit bus.
  • """); -if "CAN" in functionsOnBoard: writeHTML("""
  • CAN is for the Controller Area Network. It is not supported by Espruino.
  • """) - -writeHTML("
"); - -def writeBoard(brd, brdnum): - boardname = "board" - if brdnum!=0: boardname += str(brdnum+1) - - writeHTML(' ') - - writeHTML('
') - writeHTML('
') - - usedpins = [] - for pinstrip in brd: - if pinstrip[0]!='_': - writeHTML('
') - for pin in brd[pinstrip]: - usedpins.append(pin) - dump_pin(brd, pin, pinstrip) - writeHTML('
') - - otherpins=0 - for pinstruct in pins: - pin = pinstruct["name"] - if not pin in usedpins: - otherpins = otherpins + 1 - - writeHTML('
') - writeHTML('
') - - if otherpins>0 and not ('_hide_not_on_connectors' in brd and brd["_hide_not_on_connectors"]): - writeHTML('
') - writeHTML('

Pins not on connectors

') - for pinstruct in pins: - pin = pinstruct["name"] - if not pin in usedpins: - dump_pin(brd, pin, "otherpins") - writeHTML('
') - writeHTML('

') + writeHTML('

Like this? Please tell your friends, blog, or support us by buying our boards!

') + # only output pinout if we have pin info + if hasattr(board, 'boards') or board.board: + writeHTML('

Pinout

') + writeHTML(""" +

Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.

+
    +
  • Purple boxes show pins that are used for other functionality on the board. You should avoid using these unless you know that the marked device is not used.
  • +
  • ! boxes contain extra information about the pin. Hover your mouse over them to see it.
  • +
  • 3.3v boxes mark pins that are not 5v tolerant (they only take inputs from 0 - 3.3v, not 0 - 5v).
  • """) + if has_pin("3.3"): writeHTML("""
  • 3.3 is a 3.3v output from the on-board Voltage regulator.
  • """) + if has_pin("GND"): writeHTML("""
  • GND is ground (0v).
  • """) + if has_pin("VBAT"): writeHTML("""
  • VBAT is the battery voltage output (see the Espruino Board Reference).
  • """) + if "ADC" in functionsOnBoard: writeHTML("""
  • ADC is an Analog to Digital Converter (for reading analog voltages)
  • """); + if "DAC" in functionsOnBoard: writeHTML("""
  • DAC is a Digital to Analog Converter (for creating analog voltages). This is not available on all boards.
  • """); + if "PWM" in functionsOnBoard: writeHTML("""
  • PWM is for Pulse Width Modulation. This creates analog voltages from a digital output by sending a series of pulses.
  • """); + if "SPI" in functionsOnBoard: writeHTML("""
  • SPI is the 3 wire Serial Peripheral Interface.
  • """); + if "USART" in functionsOnBoard: writeHTML("""
  • USART is a 2 wire peripheral for Serial Data.
  • """); + if "I2C" in functionsOnBoard: writeHTML("""
  • I2C is the 2 wire Inter-Integrated Circuit bus.
  • """); + if "CAN" in functionsOnBoard: writeHTML("""
  • CAN is for the Controller Area Network. It is not supported by Espruino.
  • """) + writeHTML("
"); + + if hasattr(board, 'boards'): + for brdnum in range(len(board.boards)): + writeBoard(board.boards[brdnum], brdnum) + else: + writeBoard(board.board, 0) -if hasattr(board, 'boards'): - for brdnum in range(len(board.boards)): - writeBoard(board.boards[brdnum], brdnum) -else: - writeBoard(board.board, 0) #writeHTML('") html(" ") html(" ") -html("

Espruino Software Reference

") +html("

"+title+"

") html("

Version "+common.get_version()+"

") if htmldev == True: diff --git a/scripts/common.py b/scripts/common.py index 94d425f6ce..6d74a37255 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -23,6 +23,10 @@ # Local import pinutils; +# Exported - this is set if a board is specified on the command-line +board = False + + silent = os.getenv("SILENT"); if silent: class Discarder(object): @@ -49,6 +53,8 @@ def f(*popenargs, **kwargs): return output subprocess.check_output = f +# + # Scans files for comments of the form /*JSON......*/ # @@ -95,8 +101,9 @@ def f(*popenargs, **kwargs): # COMMAND LINE OPTIONS # -Ddefinition # -BBOARDFILE - -def get_jsondata(is_for_document, parseArgs = True, board = False): +def get_jsondata(is_for_document, parseArgs = True, boardObject = False): + global board # use the board object defined above + board = boardObject scriptdir = os.path.dirname (os.path.realpath(__file__)) print("Script location "+scriptdir) os.chdir(scriptdir+"/..") @@ -161,6 +168,9 @@ def get_jsondata(is_for_document, parseArgs = True, board = False): if len(defines)>1: print("Got #DEFINES:") for d in defines: print(" "+d) + + githash = get_git_hash() + if len(githash)==0: githash="master" jsondatas = [] for jswrap in jswraps: @@ -191,7 +201,7 @@ def get_jsondata(is_for_document, parseArgs = True, board = False): jsondata["filename"] = jswrap if jswrap[-2:]==".c": jsondata["include"] = jswrap[:-2]+".h" - jsondata["githublink"] = "https://github.com/espruino/Espruino/blob/master/"+jswrap+"#L"+str(linenumber) + jsondata["githublink"] = "https://github.com/espruino/Espruino/blob/"+githash+"/"+jswrap+"#L"+str(linenumber) dropped_prefix = "Dropped " if "name" in jsondata: dropped_prefix += jsondata["name"]+" " @@ -249,9 +259,11 @@ def get_jsondata(is_for_document, parseArgs = True, board = False): jsondatas.append(jsondata) except ValueError as e: sys.stderr.write( "JSON PARSE FAILED for " + jsonstring + " - "+ str(e) + "\n") + print(''.join(traceback.format_exception(None, exc_obj, exc_obj.__traceback__))) exit(1) - except: - sys.stderr.write( "JSON PARSE FAILED for " + jsonstring + " - "+str(sys.exc_info()[0]) + "\n" ) + except Exception as e: + sys.stderr.write( "JSON PARSE FAILED for " + jsonstring + " - "+str(e) + "\n" ) + print(''.join(traceback.format_exception(None, exc_obj, exc_obj.__traceback__))) exit(1) print("Scanning finished.") @@ -453,6 +465,9 @@ def get_ifdef_description(d): def get_script_dir(): return os.path.dirname(os.path.realpath(__file__)) +def get_git_hash(): + return subprocess.check_output('git log -1 --format="%h"', shell=True).strip().decode("utf-8") + def get_version(): # Warning: the same release label derivation is also in the Makefile scriptdir = get_script_dir() From f220e81600f458dd4ec870e4aed5de7d3d37eb23 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 28 Jul 2022 15:53:00 +0100 Subject: [PATCH 0256/1183] oops - fix build --- scripts/build_jswrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_jswrapper.py b/scripts/build_jswrapper.py index 4ecc794eda..46f6fdec6e 100755 --- a/scripts/build_jswrapper.py +++ b/scripts/build_jswrapper.py @@ -264,7 +264,7 @@ def removeBlacklistForWrapper(blacklistfile,datas): print("BOARD "+boardName) board = importlib.import_module(boardName) -jsondatas = common.get_jsondata(is_for_document = False, parseArgs = True, board = board) +jsondatas = common.get_jsondata(is_for_document = False, parseArgs = True, boardObject = board) if 'BLACKLIST' in os.environ: jsondatas = removeBlacklistForWrapper(os.environ['BLACKLIST'],jsondatas) From d3081ded3376aadd6cf75fff9e5f79657fbb1915 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 28 Jul 2022 16:12:57 +0100 Subject: [PATCH 0257/1183] oops - fix pinout-only mode --- scripts/build_board_docs.py | 46 +++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/scripts/build_board_docs.py b/scripts/build_board_docs.py index 3811539824..68ae236313 100755 --- a/scripts/build_board_docs.py +++ b/scripts/build_board_docs.py @@ -368,29 +368,31 @@ def writeBoard(brd, brdnum): # only output pinout if we have pin info if hasattr(board, 'boards') or board.board: writeHTML('

Pinout

') - writeHTML(""" -

Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.

-
    -
  • Purple boxes show pins that are used for other functionality on the board. You should avoid using these unless you know that the marked device is not used.
  • -
  • ! boxes contain extra information about the pin. Hover your mouse over them to see it.
  • -
  • 3.3v boxes mark pins that are not 5v tolerant (they only take inputs from 0 - 3.3v, not 0 - 5v).
  • """) - if has_pin("3.3"): writeHTML("""
  • 3.3 is a 3.3v output from the on-board Voltage regulator.
  • """) - if has_pin("GND"): writeHTML("""
  • GND is ground (0v).
  • """) - if has_pin("VBAT"): writeHTML("""
  • VBAT is the battery voltage output (see the Espruino Board Reference).
  • """) - if "ADC" in functionsOnBoard: writeHTML("""
  • ADC is an Analog to Digital Converter (for reading analog voltages)
  • """); - if "DAC" in functionsOnBoard: writeHTML("""
  • DAC is a Digital to Analog Converter (for creating analog voltages). This is not available on all boards.
  • """); - if "PWM" in functionsOnBoard: writeHTML("""
  • PWM is for Pulse Width Modulation. This creates analog voltages from a digital output by sending a series of pulses.
  • """); - if "SPI" in functionsOnBoard: writeHTML("""
  • SPI is the 3 wire Serial Peripheral Interface.
  • """); - if "USART" in functionsOnBoard: writeHTML("""
  • USART is a 2 wire peripheral for Serial Data.
  • """); - if "I2C" in functionsOnBoard: writeHTML("""
  • I2C is the 2 wire Inter-Integrated Circuit bus.
  • """); - if "CAN" in functionsOnBoard: writeHTML("""
  • CAN is for the Controller Area Network. It is not supported by Espruino.
  • """) - writeHTML("
"); - if hasattr(board, 'boards'): - for brdnum in range(len(board.boards)): - writeBoard(board.boards[brdnum], brdnum) - else: - writeBoard(board.board, 0) +if hasattr(board, 'boards') or board.board: + writeHTML(""" +

Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.

+
    +
  • Purple boxes show pins that are used for other functionality on the board. You should avoid using these unless you know that the marked device is not used.
  • +
  • ! boxes contain extra information about the pin. Hover your mouse over them to see it.
  • +
  • 3.3v boxes mark pins that are not 5v tolerant (they only take inputs from 0 - 3.3v, not 0 - 5v).
  • """) + if has_pin("3.3"): writeHTML("""
  • 3.3 is a 3.3v output from the on-board Voltage regulator.
  • """) + if has_pin("GND"): writeHTML("""
  • GND is ground (0v).
  • """) + if has_pin("VBAT"): writeHTML("""
  • VBAT is the battery voltage output (see the Espruino Board Reference).
  • """) + if "ADC" in functionsOnBoard: writeHTML("""
  • ADC is an Analog to Digital Converter (for reading analog voltages)
  • """); + if "DAC" in functionsOnBoard: writeHTML("""
  • DAC is a Digital to Analog Converter (for creating analog voltages). This is not available on all boards.
  • """); + if "PWM" in functionsOnBoard: writeHTML("""
  • PWM is for Pulse Width Modulation. This creates analog voltages from a digital output by sending a series of pulses.
  • """); + if "SPI" in functionsOnBoard: writeHTML("""
  • SPI is the 3 wire Serial Peripheral Interface.
  • """); + if "USART" in functionsOnBoard: writeHTML("""
  • USART is a 2 wire peripheral for Serial Data.
  • """); + if "I2C" in functionsOnBoard: writeHTML("""
  • I2C is the 2 wire Inter-Integrated Circuit bus.
  • """); + if "CAN" in functionsOnBoard: writeHTML("""
  • CAN is for the Controller Area Network. It is not supported by Espruino.
  • """) + writeHTML("
"); + + if hasattr(board, 'boards'): + for brdnum in range(len(board.boards)): + writeBoard(board.boards[brdnum], brdnum) + else: + writeBoard(board.board, 0) #writeHTML('